本帖最后由 shane007 于 2023-8-25 15:49 编辑
! v% ~1 f, s! K: ^$ ~. h; M1 v- u4 m( [) _, v
这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,
! R" s' n$ @# S4 }/ j而是在RenderSystem_Direct3D9.dll里完成的。: D7 x! E. L& r. R v
由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。
( G5 A$ U3 u4 w0 r& Y. c* O* G( Z要修改窗口化,就要寻找调用CreateDevice的地方。
9 _, n: x3 l. X* w6 d
$ l- g, l. M7 P# \5 E+ T J6 n因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,
8 D) L. D9 j4 |+ O3 C" l3 `9 u逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)3 E1 U* ^ k( Y5 S6 X) L3 K& S. p$ F
- call dword ptr [eax+40h]# d" l$ Z" C0 D$ u* F8 C( U9 P. S
- call dword ptr [ebx+40h]
- O* D6 n- f7 E; _! P - call dword ptr [ecx+40h]" J7 V D( y& _
- call dword ptr [edx+40h]- a$ k: O. D& d' ]' d
复制代码 4 q/ o9 j c# L! S0 \
7 Y' I. o, s L* U3 a
搜寻结果如下
9 e2 t: d" x: g. P1 c4 N1 q# q- call dword ptr [eax+40h] 2处 OK
8 c0 ~! s/ w: v! Q7 E - call dword ptr [ebx+40h] 没有
5 D Z. r: E& C, }- P' f - call dword ptr [ecx+40h] 好几处,参数个数不对
1 u. h4 m3 v7 S - call dword ptr [edx+40h] 1处,参数个数不对
复制代码
( y+ i' F& r" B0 U7 e7 J+ k
# U0 |( C- o' t2 u9 `结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。
. E& d) ^2 `+ R+ d代码如下! ?0 p \% _) d" c) M
第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
! B# x2 [$ _3 ?6 U6 Y - .text:10017F0A 51 push ecx
4 W! w5 @: L" E - .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]8 ^4 k$ n/ _1 O/ O. }, ]+ x
- .text:10017F11 57 push edi X$ B% d+ ]4 M7 o0 v
- .text:10017F12 52 push edx
+ a8 h; I. Q4 G. L% v - .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
+ U1 j- E0 v3 M9 K2 P2 t - .text:10017F17 51 push ecx
$ {6 l, w2 k5 ` - .text:10017F18 53 push ebx! K: X0 x* U1 ^
- .text:10017F19 52 push edx/ K( g6 K r9 L( K
- .text:10017F1A 56 push esi8 i" R/ f1 _+ |
- .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码
+ q$ B: F- A. p/ O9 Y% u& c# p6 _- G. s, E
3 i1 A _7 J. L) D7 {- C# A+ F
第2处
! e4 v- `. |& d4 }- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]0 a b* w4 j% d1 J3 L
- .text:10017F33 51 push ecx
$ E6 m: F/ L% E: c: q" w a - .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]# I/ q0 Y# a: J9 H7 M/ x
- .text:10017F3A 57 push edi
/ r. b" \4 I3 \# U - .text:10017F3B 52 push edx$ @6 {1 a! X% C& t2 Y4 e/ L& T
- .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]2 e( `2 i2 _: @5 U
- .text:10017F40 51 push ecx; a9 U- W; a& z- w5 I6 J/ n
- .text:10017F41 53 push ebx
2 D8 u Q* B6 _' ?1 v3 Q - .text:10017F42 52 push edx3 Y% a/ f: C0 b* u# m! v2 n
- .text:10017F43 56 push esi
X% y& A% V, W- H - .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码
" @1 e: d7 ]6 B2 I: o0 B" T7 y
1 a' ~' j- I0 G0 {
) c5 R0 m! g7 `/ R补充,CreateDevice也有可能是以下形式7 s$ f! ~6 q/ t8 ^; R4 X
- .text:0041640D lea ebp, [esi+604h]- ?, \: k; H. j- v/ a" e' ]
- .text:00416413 push ebp& U9 X x, ^6 R' v7 o
- .text:00416414 lea ecx, [esi+630h]# F) M6 w" \5 H# p/ N: p/ A( D
- .text:0041641A push ecx
3 R; w0 F; s# u. l! X7 Y, ] - .text:0041641B mov [esi+90Dh], dl
/ b ?$ K* U2 q* w9 W% S6 G9 K - .text:00416421 mov ecx, hWnd
5 o$ I# F' l' ?0 G' ? - .text:00416427 mov edx, [eax]
. n: r/ r- q" V; H$ A! n - .text:00416429 mov edx, [edx+40h]
7 a* y6 H" W- `! N4 H - .text:0041642C push 40h
- l( M! W0 A" V6 F5 n - .text:0041642E push ecx
2 x- ^4 H1 L, Y - .text:0041642F push 14 v/ o- s* H4 K/ M$ w! w Q
- .text:00416431 push ebx
. j9 F. E1 O9 b! U( p% y) L - .text:00416432 push eax7 ?$ R0 `/ Y6 P4 G+ a, z6 O; P
- .text:00416433 call edx
复制代码
) ?3 w% ?5 M t! t" m7 u
' ^1 g( }& X6 c/ l+ `7 M9 @! d7 m- A( b' v; d; G5 n R
2 Q8 a$ P8 v9 p
$ V$ k. u( D1 s6 x& f |