本帖最后由 shane007 于 2023-8-25 15:49 编辑
6 ~5 B4 F+ [- w" i% f* k# U6 J6 t* q! a6 c; _4 S, k
这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,* h i6 l9 A. T5 J& n7 S0 ` X6 u
而是在RenderSystem_Direct3D9.dll里完成的。- y5 l9 j3 @! z. O" g* h4 M
由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。
x0 }! @; M0 C0 }! L1 A( o( o3 q9 s要修改窗口化,就要寻找调用CreateDevice的地方。) T' x# X" N; e2 ]5 P# I
- m g1 ^' v" P/ k% u' b# ?) f因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,7 o* G3 ]& H) j- b
逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。); }# N: `: Y0 H1 b- M& b7 M; |
- call dword ptr [eax+40h]
; t$ ]9 W+ V" y" Q. m - call dword ptr [ebx+40h]/ a. r; T& E! x# L* O3 O
- call dword ptr [ecx+40h] h# A9 ~) ], M( L/ ?
- call dword ptr [edx+40h]; B0 X# C/ H( F
复制代码
8 l6 J" H' C% I$ p
9 S" ]1 v# q0 U3 r3 d$ g/ `' Z D7 \搜寻结果如下( }/ t. ~$ k+ `1 U, }+ J7 v
- call dword ptr [eax+40h] 2处 OK
8 C6 I% }( \ H! W& o1 V; Q - call dword ptr [ebx+40h] 没有# Z3 F3 W' z e2 w# z+ y
- call dword ptr [ecx+40h] 好几处,参数个数不对
: i4 K7 J8 T! o/ j" B1 Z - call dword ptr [edx+40h] 1处,参数个数不对
复制代码
) q: l3 s& L& l# q& S2 I1 i% j H( L2 Z) v* K
结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。
2 l6 U, x4 e3 ^" f/ w6 h代码如下
8 E3 n. g7 C Z' T7 A1 }第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]3 P2 X- @- |- ]- r" p/ d0 M
- .text:10017F0A 51 push ecx
! }0 D" |8 k N3 y; C - .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]' P1 R" Y! k/ ]3 V3 D' J
- .text:10017F11 57 push edi
2 ?& [+ w, b- S7 M; ~5 n+ ~9 ~ - .text:10017F12 52 push edx/ y! ?$ G$ r" ?5 s- @. X
- .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
: M" E; r9 c6 t9 J8 D1 c! W0 M$ H0 o$ D - .text:10017F17 51 push ecx. \% H1 U z& g5 c5 n) ~
- .text:10017F18 53 push ebx \5 a6 |% G0 w. m
- .text:10017F19 52 push edx
- n2 ?- H! u) k - .text:10017F1A 56 push esi
, I$ S F% Q: Q, G0 t4 I - .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码 . c c8 _: i) }! B x# S- d+ ~4 z2 x
' l) s" M& P9 G6 T. j6 [3 K \- a) A3 y8 K+ [8 ?/ n
第2处" |* j+ j4 H0 b8 S+ r2 z4 [
- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
: j1 O% p+ i( L2 A! f+ r# `$ n - .text:10017F33 51 push ecx
1 |/ p" e: [+ ^/ \. n - .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]' F- F0 {) L# T0 C
- .text:10017F3A 57 push edi
- D8 [4 Q* l; w) [7 j ~+ v - .text:10017F3B 52 push edx
$ E" e+ x7 T- ~ I r - .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]7 D% m0 Z: d d2 {! ~- A
- .text:10017F40 51 push ecx
: V) J. I5 a7 R% N0 h9 V: P- q8 S2 v. }$ a - .text:10017F41 53 push ebx
* \2 ]2 ?4 ^% m; ?3 W4 i2 q+ h1 |% I0 d - .text:10017F42 52 push edx. _* U9 T" o; K3 @
- .text:10017F43 56 push esi5 b/ K6 G" V" f$ S2 [0 h7 ~
- .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码
6 S. K8 D# P- y! ^* J! [+ z6 ]& O" v8 p. K; e
1 Q' _, S" a. x! I& \1 z1 g+ v补充,CreateDevice也有可能是以下形式
5 |0 Y9 `5 \9 U+ C0 q" D- .text:0041640D lea ebp, [esi+604h]! I. C( H4 K: |8 m) s# T$ `
- .text:00416413 push ebp
8 x1 x- c+ Y/ a& l$ X2 E - .text:00416414 lea ecx, [esi+630h]2 p4 t# ]" Q; w4 P
- .text:0041641A push ecx, |+ T; ^+ W7 N+ D+ u @8 E1 m
- .text:0041641B mov [esi+90Dh], dl
1 h$ J% q3 I; m% G - .text:00416421 mov ecx, hWnd: i' Q, T/ r3 G, h3 m
- .text:00416427 mov edx, [eax]2 O% r& Y0 W- \' K
- .text:00416429 mov edx, [edx+40h]3 J! k8 A, h* B6 `1 Y& G& J" p2 I
- .text:0041642C push 40h
3 i, i3 Y+ w* I - .text:0041642E push ecx( `! z H% @+ W* g8 }# U
- .text:0041642F push 18 e. o$ q T/ [5 ~ W; g
- .text:00416431 push ebx
7 M% _- \$ w% B7 ~. ^0 ~$ S7 a% a - .text:00416432 push eax0 F6 r6 D% g/ r
- .text:00416433 call edx
复制代码
4 m6 c' N3 H# a9 u1 b# i6 B4 r. B O5 t0 n
0 F1 _4 I: f9 m$ Q- J: v
& {) s( q1 }3 t: K Q2 Y
- F. J, P/ M- ]0 w; n' N$ _ |