本帖最后由 shane007 于 2023-8-25 15:49 编辑 & ^' u- T9 u, y* y/ ]
1 ^: Z4 f7 T. B+ |) W' r这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,' P; C8 G- g9 g+ G/ `
而是在RenderSystem_Direct3D9.dll里完成的。
9 t; v& h+ p* o5 `- p由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。4 L0 X1 R, H2 A. v/ T% z
要修改窗口化,就要寻找调用CreateDevice的地方。" T: Z9 u* `3 b* X
) q6 }" h3 Q9 O/ W3 L9 w因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,
6 w. w% n& N" y0 h3 T/ t5 }逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)$ O Q3 E& i0 ]3 R- [8 M9 R, y' E
- call dword ptr [eax+40h]. l! a* n$ y6 x+ ?$ v& [
- call dword ptr [ebx+40h]! b7 k) c4 H$ K
- call dword ptr [ecx+40h]: ?+ Q% M. a& Y. a
- call dword ptr [edx+40h]
* T! E, R5 k- {+ Y( }2 K4 Y
复制代码
: u% p6 ^% s) t' ?7 V! o
. S' n t5 j* S6 ]6 }5 B+ H8 f搜寻结果如下( u+ d5 R8 q* l) c9 \
- call dword ptr [eax+40h] 2处 OK4 \. V% K2 i! ^4 B, J& p# `6 k9 o! M
- call dword ptr [ebx+40h] 没有0 J4 [3 y6 r5 p1 k6 M: h/ O6 f0 Y
- call dword ptr [ecx+40h] 好几处,参数个数不对
, |. q! g* C( T1 I6 U' _$ ]$ n7 m, R - call dword ptr [edx+40h] 1处,参数个数不对
复制代码 0 X4 G/ n3 o: Q) ~" f, `
P9 ~) s( W! I" @) S9 h结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。4 ^9 k* M1 U) K3 e2 X
代码如下
' e: K; I. Q# F! R8 Y: f0 r第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
# c+ q; c6 i. J Y- [ - .text:10017F0A 51 push ecx
9 N4 u2 N2 y, z - .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
1 F0 u4 [) i- l - .text:10017F11 57 push edi
" C& A9 X2 U ~+ x1 d/ _4 r/ T+ g - .text:10017F12 52 push edx+ `" p& {0 l! j/ K+ e
- .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
Q8 `* ` _0 g5 S9 s2 } - .text:10017F17 51 push ecx
* t$ e/ q& [; T - .text:10017F18 53 push ebx
; ~4 w: x* ?% {0 O# E7 d" [ - .text:10017F19 52 push edx' e x( I& R* q9 |3 `
- .text:10017F1A 56 push esi6 u3 ?& Y# ]- D$ R
- .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码
/ S( _ Y2 W. ^' O0 q3 Y1 P; s: B4 C7 J" @' }
- E( b h! V- F$ v4 s7 y6 r' G
第2处
; [* P A( [7 u9 i8 H8 ]8 d- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
- o0 v8 o+ ?' Z9 b: E9 p - .text:10017F33 51 push ecx$ [8 N. G% ^1 O
- .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
* t, l' f* U3 ` - .text:10017F3A 57 push edi. m! o$ a$ G& \, T
- .text:10017F3B 52 push edx; k: [0 K, C ]* x# ^' A8 B& H% W' W
- .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
3 i5 t4 {/ ?9 m% Y' q7 Y - .text:10017F40 51 push ecx
& z5 e/ e. T$ e) x5 v1 { - .text:10017F41 53 push ebx1 H* r& I1 p5 T& a ]2 M( q+ a3 |
- .text:10017F42 52 push edx; k& j# d+ w& U
- .text:10017F43 56 push esi7 D1 a0 _% Q! @# U. c) S( Q
- .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码 + K5 G# f! L, q0 m* z, F+ `
% o. V' G5 n& k7 }1 Q( X2 ^
# ^5 ~+ m5 t. G7 e b) F
补充,CreateDevice也有可能是以下形式6 a* B. v, p* A3 `
- .text:0041640D lea ebp, [esi+604h]) n5 q# P) Q8 p7 V6 X
- .text:00416413 push ebp
* t9 q" b- {$ J! Q; ^' G) c( } - .text:00416414 lea ecx, [esi+630h]
& J( I- ^+ ?- ?1 L7 T% h Y, W - .text:0041641A push ecx
% q1 W6 p8 m3 T1 x - .text:0041641B mov [esi+90Dh], dl4 l @+ h: ~- d) G( v( Z4 Y2 x4 b
- .text:00416421 mov ecx, hWnd* K) _- E5 A+ U% @3 T3 P
- .text:00416427 mov edx, [eax]
( Q% I w2 ]6 d$ I7 J7 [4 r4 O - .text:00416429 mov edx, [edx+40h]
+ p) S$ d% V S# j( h+ B; u9 y - .text:0041642C push 40h# o% v2 d- H7 r4 v
- .text:0041642E push ecx& ^5 @; Y& u3 p) w- \% A% \
- .text:0041642F push 1
7 Y' t j! [4 ~# k: [. P( {8 n - .text:00416431 push ebx
& l& w! l4 e9 Q, b" C" B# e - .text:00416432 push eax
/ {+ r% T( J- p# v; ^0 Z! F, _* T - .text:00416433 call edx
复制代码
x! [: V! v+ @
. b) V$ K9 Q% t! ]3 F: a8 q1 }3 U) _
8 }8 c6 Y; p8 ?1 [ [! ~$ o3 _( d F* G5 r9 g, x. M: u+ m
|