本帖最后由 shane007 于 2023-8-25 15:49 编辑 5 j* Q3 C+ m. w7 }9 T; K
, r! O+ `( _$ i0 q0 x8 U0 W7 c- j
这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,5 a9 b6 ?3 s) {9 S7 K0 }7 A4 S) j
而是在RenderSystem_Direct3D9.dll里完成的。
/ `# H% P8 q+ b6 q9 ?0 F由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。
& I/ ?! P6 l: S要修改窗口化,就要寻找调用CreateDevice的地方。
0 f/ Y8 m8 m$ ~# M' x- u
% [' P2 _/ d' ?& l因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,% d& Z1 {, ~" Z6 R' p
逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)
u/ q" t r( J2 o P0 W5 K- call dword ptr [eax+40h]9 \1 q. o9 A) A% ~. B4 h
- call dword ptr [ebx+40h]
% G# Z/ g5 e9 E0 h: ^* Q0 L) g - call dword ptr [ecx+40h]7 E6 N! e: B# p, z
- call dword ptr [edx+40h]
/ {8 c. a; W* i
复制代码
( T# a5 l& x& e6 |! |2 o. l% M3 j6 P( N; \5 F$ W0 H5 G7 g
搜寻结果如下
4 f3 I4 z0 P3 \/ n; ~( a8 P- call dword ptr [eax+40h] 2处 OK6 s) m+ N, t* M# X. P8 V$ a* S2 T5 }
- call dword ptr [ebx+40h] 没有# `) N; j+ ?& x: a
- call dword ptr [ecx+40h] 好几处,参数个数不对
% {" n9 ?* B# t: d - call dword ptr [edx+40h] 1处,参数个数不对
复制代码 & I) m0 Z7 b$ `; g
' p* H: L: [7 t V
结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。, R% q9 m0 f/ h0 ^8 I- o# D- r
代码如下
7 p& U$ r1 g% I. D2 c第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]7 q; [ i) r4 R8 y4 z! |
- .text:10017F0A 51 push ecx6 T6 A9 e# _/ J; }0 v& `" l
- .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]7 M7 R; a7 }8 @' i7 V# ]4 e w
- .text:10017F11 57 push edi
: f/ Q: g6 Q3 A: l1 c - .text:10017F12 52 push edx8 b# c/ b7 Z( q4 `
- .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
/ h! ]. A+ A+ L" P: P% p p - .text:10017F17 51 push ecx' ]5 `- l. @9 U
- .text:10017F18 53 push ebx' {7 x3 U2 d3 {% L5 u. i: R+ |7 D% {
- .text:10017F19 52 push edx
0 c# _% J. {1 x7 ^ - .text:10017F1A 56 push esi$ U) p, [# e5 x0 l3 A$ @$ B# {
- .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码 & J M* M& R* K$ a; V6 n- d+ R6 s( O
# z* h7 P1 k$ C$ \5 u; X
, A; X, S Y& k, r. ^( h& F+ d第2处
6 o& [- }. z' R. z3 \# c- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
* t" o6 ]/ C+ {% b5 F - .text:10017F33 51 push ecx
' _6 @7 N9 k1 r2 p" T* X _ - .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
: ^/ L' L" T: k( v7 M4 t+ ] - .text:10017F3A 57 push edi+ t0 f d; e ^1 ] J6 j
- .text:10017F3B 52 push edx+ `, p; K5 d- _
- .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
$ E( M) v: V& [9 t+ h% n- Q - .text:10017F40 51 push ecx0 G+ s# a* r. }( h q
- .text:10017F41 53 push ebx
9 c1 h7 o0 ?6 z6 R - .text:10017F42 52 push edx% v8 w" o5 S% E/ p6 C, |
- .text:10017F43 56 push esi9 b2 V7 ]" {% z0 x' N
- .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码 ) h3 A" V9 d- Y7 a, x
$ r" v5 h; C& l6 o3 l; A4 D; I/ [! o4 I( G
补充,CreateDevice也有可能是以下形式
% T! z/ E5 B; O% Q9 `4 m- .text:0041640D lea ebp, [esi+604h]
( h4 l) L. q$ N9 t - .text:00416413 push ebp; U9 s& ?( g2 b q( ^
- .text:00416414 lea ecx, [esi+630h]' `- [1 q9 e. C
- .text:0041641A push ecx! H" R9 w( J8 g3 u
- .text:0041641B mov [esi+90Dh], dl
! s7 a# r0 K; S& ~9 x - .text:00416421 mov ecx, hWnd) h* p4 _8 a& @7 O
- .text:00416427 mov edx, [eax]
7 s" K u- N: r; U3 n$ [ - .text:00416429 mov edx, [edx+40h]
3 p3 L4 z/ J) V6 h- [% s* X - .text:0041642C push 40h$ ?$ D9 U% \9 }' f) Q$ h2 R
- .text:0041642E push ecx7 ~* y7 h8 b5 ?7 L7 f- A
- .text:0041642F push 1
- c( a) ~% M" ~# B- i - .text:00416431 push ebx4 N9 u' t9 b/ n
- .text:00416432 push eax' W4 X: p" E4 T) Q) H2 l
- .text:00416433 call edx
复制代码 ( A; f9 `: T. N2 S$ ]
# _8 D& q( }3 F8 u* U$ p1 J
( k* U2 F# p2 `. n
1 `3 {. C& I8 ]+ L" W$ G8 Q
0 [# x5 j* Q9 ^- ^6 ?9 {& S
|