本帖最后由 shane007 于 2023-8-25 15:49 编辑 0 _1 D0 b2 z& Y5 m
( }/ N$ Z) @7 t+ e P# p. t这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,- V& p8 Z% W A/ l3 q9 O+ b
而是在RenderSystem_Direct3D9.dll里完成的。
1 g( N# H6 ]- u! a( S) x由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。
5 K! `, m1 F0 v. Q5 O5 k要修改窗口化,就要寻找调用CreateDevice的地方。8 Y6 ], {1 ^* l2 s6 H% E- {" R4 x
. F& r8 D/ L: q$ z6 d
因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,
% @4 l N. B# s: i逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)
7 q* ~" t; R9 I9 }8 m, b- call dword ptr [eax+40h]7 D6 \: |) J/ ~- Q& c3 V8 k% S& q
- call dword ptr [ebx+40h]6 ^3 P! m2 b4 x' i+ ] l+ P: X6 x# k9 p
- call dword ptr [ecx+40h]8 H3 B C, A: K( ~- X, A+ o5 z
- call dword ptr [edx+40h]8 R# b. s* b0 E$ T$ F
复制代码
& g+ {4 K3 b& V6 _* h- f! s1 @7 u0 I7 G+ t3 w4 n5 U2 l
搜寻结果如下
3 V7 @" Q6 g) }3 x' |- call dword ptr [eax+40h] 2处 OK
4 Z! g( K/ u' s0 B5 W; B& Y4 v - call dword ptr [ebx+40h] 没有
9 I6 C. K7 i5 R0 S; ]! D% @ - call dword ptr [ecx+40h] 好几处,参数个数不对4 b' V5 {4 W, \" a0 r, v
- call dword ptr [edx+40h] 1处,参数个数不对
复制代码 : \6 c% x; v' \6 ]0 j; e
3 t- V% \. z+ F1 p9 C1 q! O* B
结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。
0 _# c- i: C! m$ R代码如下
* B% J5 C- v/ y- Q8 f第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
; N: [9 [- r8 r# [/ f- s7 p - .text:10017F0A 51 push ecx' s3 P/ u5 A) O8 S/ W1 f2 ?- [
- .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
4 {6 I; ^ M3 W - .text:10017F11 57 push edi- _8 @9 I$ L& o8 c c% _
- .text:10017F12 52 push edx& T+ |& J7 ~) _
- .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]4 N- V0 r$ x5 G- \4 ]
- .text:10017F17 51 push ecx
. m, Q1 Q8 h) l# n4 R3 v. K - .text:10017F18 53 push ebx- W+ D/ x |- T- W
- .text:10017F19 52 push edx9 N @. ]& _4 }6 K! n
- .text:10017F1A 56 push esi
) t' p2 q6 [& C/ B2 Y$ Z6 \* @ - .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码
+ k/ N; o& }( @# Q- u
0 }1 N% `/ z9 }0 C& q# i# F5 @7 x; d2 z; a# m
第2处; a4 }8 p5 l4 `1 Q
- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]8 w" C$ g8 D) z( e
- .text:10017F33 51 push ecx: a' C! F, h8 ^3 P* L+ l+ E
- .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]& i* E: C# [! w( }
- .text:10017F3A 57 push edi8 g+ `$ C+ r7 }$ b( ]. n4 n
- .text:10017F3B 52 push edx" n: N% p, n! }2 w
- .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
9 a4 ]% X& }4 A - .text:10017F40 51 push ecx
! D* {" I* n4 W' n2 ~# i - .text:10017F41 53 push ebx7 Q7 N% C9 @% Q/ w& _) }3 j
- .text:10017F42 52 push edx+ t/ I& o* H/ H" j! e! a# f
- .text:10017F43 56 push esi
; O8 W% N* r& T- P# n3 P - .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码
, I1 ~! l' q! k# _5 d" M }# u8 O* a. G& C
. X2 r3 N. ^. d3 H; d* Q补充,CreateDevice也有可能是以下形式
+ \$ H4 {4 d' A8 n- .text:0041640D lea ebp, [esi+604h]2 p6 E; U8 `. P$ R6 W
- .text:00416413 push ebp* M" V" t/ x1 m$ b- `
- .text:00416414 lea ecx, [esi+630h]# k/ D0 F0 k# Y' K1 s D
- .text:0041641A push ecx
/ ~: f/ p) b) W3 ?& v. z& K9 M7 W - .text:0041641B mov [esi+90Dh], dl) y$ l4 t$ r. g+ X) }
- .text:00416421 mov ecx, hWnd' M2 H( T! z. T5 H; ]
- .text:00416427 mov edx, [eax]7 z* G& W6 L- a Q/ g" V
- .text:00416429 mov edx, [edx+40h]
& j: i# W/ T6 b4 W - .text:0041642C push 40h
) Q2 T# k/ ?9 E8 y7 g$ N - .text:0041642E push ecx
* Q5 J2 _9 Z& q$ k/ D. p - .text:0041642F push 1
. D& I/ i+ h- r1 ~" a" Q6 L! I% r) | - .text:00416431 push ebx
2 z/ e+ z# C& e k( R$ x& x! Z - .text:00416432 push eax7 t' h9 i% z# c
- .text:00416433 call edx
复制代码 + P! l3 e8 n9 b- H
# B7 a0 i( ?) @4 D4 w+ X" w
( D$ S. [/ Y. [ l# o8 O8 v$ X/ j' w3 r" c2 \" w4 G6 e+ C
! x4 G. n$ C t* r
|