本帖最后由 shane007 于 2023-8-25 15:49 编辑
+ k5 l& [ V: ]' E. G5 H! o$ ?$ F' n, R x5 \! ?
这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,) b& |. I1 G+ I0 p. M
而是在RenderSystem_Direct3D9.dll里完成的。
: }6 g! E" B7 k% g0 `/ @由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。5 q& f8 k; E/ ?
要修改窗口化,就要寻找调用CreateDevice的地方。" ~' J" j3 S! Y! Q/ ^6 y
$ ]& |( B, e$ x6 d
因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,) m5 |" [& q$ m, D. L6 V
逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)
% E I$ a* T! j0 G- call dword ptr [eax+40h]
( O8 \9 p n- @) |7 t - call dword ptr [ebx+40h]5 E1 ?# s. V, A$ n8 e
- call dword ptr [ecx+40h]0 l: F5 A9 G3 g* p# S; ?) O
- call dword ptr [edx+40h]
1 C* I3 O, t% i/ X8 h: z
复制代码 9 e, r& C8 q. k( o) O
% y/ _- e' \1 S7 q搜寻结果如下) f$ S* n0 J( C7 M" O& d/ `
- call dword ptr [eax+40h] 2处 OK
+ ^; l' U1 v& K; X _ - call dword ptr [ebx+40h] 没有6 R5 G7 C; @, g( g1 M% p
- call dword ptr [ecx+40h] 好几处,参数个数不对
, {- j8 `8 r+ J - call dword ptr [edx+40h] 1处,参数个数不对
复制代码
# F: k7 Z- v" ?% ~
/ p, b: p7 p. M) X结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。8 l9 |& Q& D& x9 M
代码如下 R# O# r" S& d$ y# m
第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]; V# x( B6 Z& @0 g
- .text:10017F0A 51 push ecx
X }/ l- r* Q, M2 m% V - .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]6 n5 M5 z' C8 O6 w5 s
- .text:10017F11 57 push edi
) b2 L; B* p5 `* \" _+ `; o - .text:10017F12 52 push edx
5 a5 L* A# h% {* K3 G - .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
! \: f0 P- J6 @4 f% |/ C# e) |# T - .text:10017F17 51 push ecx, A- q2 }4 K1 Y8 _2 L4 ^7 H4 Y
- .text:10017F18 53 push ebx
7 O$ I5 `$ F2 ^5 s( g# b6 I+ l - .text:10017F19 52 push edx
2 \( b9 r$ I+ d8 g' L% F - .text:10017F1A 56 push esi: B4 s" x! B) t- \, @- X; k; t
- .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码
" F) E; H' X$ y8 j- c! Q
( L: A: }# D9 v; a8 D( r# x3 s8 T8 s
第2处( ]5 d$ r5 X6 r6 N5 T
- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
; s, J/ Z: G4 s1 p - .text:10017F33 51 push ecx7 U( S: T9 @ ~! n$ c& ^2 g4 P
- .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
. q# F8 [1 D$ x0 m9 L - .text:10017F3A 57 push edi
2 p! f8 W4 V- t& x$ ?4 A - .text:10017F3B 52 push edx- K+ E% Q( B5 d( }6 s
- .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
6 l; ]( F j/ T5 l6 S - .text:10017F40 51 push ecx* E$ E( `) O0 O
- .text:10017F41 53 push ebx$ u$ ~7 |' b, x1 D2 D6 s8 n
- .text:10017F42 52 push edx
; @- _7 P! m0 C" K2 D, ]) U) p - .text:10017F43 56 push esi# {3 i# X4 p k% y- V" ^, L
- .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码
( `6 f2 G) a: M8 c6 O
. \7 E& x! k/ f& t
- H$ y' P3 g4 Z' d& `" p补充,CreateDevice也有可能是以下形式
8 O% Z) ^& K9 H8 t- .text:0041640D lea ebp, [esi+604h]
$ t( N, f/ Z7 ? - .text:00416413 push ebp
' d$ P% M" M7 |* `0 V. @4 x - .text:00416414 lea ecx, [esi+630h]( }0 D; C, L) t/ _. l% Z- w
- .text:0041641A push ecx
0 ]5 D& C* ]) i, Z - .text:0041641B mov [esi+90Dh], dl* R. R6 f5 A8 O2 C0 y
- .text:00416421 mov ecx, hWnd( r* l$ d+ X$ x# g
- .text:00416427 mov edx, [eax]$ E' V: q3 t8 t! O/ {; z
- .text:00416429 mov edx, [edx+40h]
/ y. C' f+ O4 M0 J$ m - .text:0041642C push 40h
2 C. k' V) u7 b" V: d+ F - .text:0041642E push ecx& T$ ]' d1 u1 @0 j* q. s4 Z: L
- .text:0041642F push 11 R8 m3 Q7 f/ F5 |6 I$ o" l
- .text:00416431 push ebx
2 X! B K% @ b9 t; @0 x! R - .text:00416432 push eax9 y6 p( T0 u& X3 J4 `: T: R
- .text:00416433 call edx
复制代码
/ W' x# w( [+ y! U! y+ ? w, Y1 [- m1 ^( M) i& H- m5 n' s% C: r0 }
) _) M7 s: F5 o1 d/ ?' @0 F" e2 ]- P& w/ X5 T
( m( E% T5 J T+ w
|