本帖最后由 shane007 于 2023-8-25 15:49 编辑 * O. V! v. w6 [5 P5 X+ y9 t2 q& a
3 p9 y7 S& r: Q; n这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,
* r9 D; i: U6 y0 J/ ?" x而是在RenderSystem_Direct3D9.dll里完成的。# y& {, _; l# A5 o
由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。# v; W" ^1 @' A# e) ~4 |
要修改窗口化,就要寻找调用CreateDevice的地方。
& g- J4 Q: Z: {! a |: n: P' K* ^3 v" w+ K' t
因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,4 k: U6 q, v% g# t$ F0 J
逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)
# C# ]" y7 F$ T) I8 K& G- call dword ptr [eax+40h]
1 L$ I8 _: ?9 l4 @) X5 N - call dword ptr [ebx+40h]$ J' Z/ A1 d2 b S) A6 ?+ u6 r
- call dword ptr [ecx+40h]2 F0 a0 a9 Y2 o. u
- call dword ptr [edx+40h]
/ h. `" a. I' P9 H- n+ t! H7 ^0 W
复制代码
2 I, b W4 X) r1 v8 p
5 C, d& V$ {6 ?搜寻结果如下% ]& O+ P% q; y: y; I/ o" o
- call dword ptr [eax+40h] 2处 OK
* A# Z9 m5 _7 R - call dword ptr [ebx+40h] 没有
) c; @, z5 a! ~$ { - call dword ptr [ecx+40h] 好几处,参数个数不对
\6 l& D+ P8 r, d1 J1 ?7 v - call dword ptr [edx+40h] 1处,参数个数不对
复制代码
* ~5 s- A0 a j% h, J' [4 @
* B. M9 m6 a6 s$ ]4 d( p* i/ T# R结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。: J' d1 l+ q) K( | L5 q9 N
代码如下" ~2 m+ F% C. Z4 N$ z* X1 d
第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]! W- W& U5 W* h1 @- H
- .text:10017F0A 51 push ecx
! P- R( c4 g! r7 T/ q+ z& L. M9 W! t - .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
* a' I8 G- e; n6 @4 v, R - .text:10017F11 57 push edi
8 h, U1 T4 G0 \* c/ ~' @) n: _ - .text:10017F12 52 push edx( d* n* ^: w0 i/ R
- .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]2 w+ o# F! ^/ n3 w. `1 Y, b
- .text:10017F17 51 push ecx( ]2 r" M- k* g$ L
- .text:10017F18 53 push ebx
0 l6 {1 q+ X4 E! @: x( J - .text:10017F19 52 push edx' G) `) J5 W5 ^; A% `
- .text:10017F1A 56 push esi
( {, @( O0 Z1 a& A! H - .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码 8 m; V" a$ Z% l0 o, J4 K
" F [2 f1 H1 ~* y' P9 m
$ s) X, q! b0 n, j/ b第2处
3 x8 \8 U1 `4 v* ~1 l- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
. y' t( J5 u$ ~) R T+ H; p! }6 \+ x - .text:10017F33 51 push ecx
L3 `$ \. w4 j - .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]. ^* p4 P& [' v9 @
- .text:10017F3A 57 push edi
% _/ {/ q/ s# k$ I& [; f - .text:10017F3B 52 push edx" V4 w0 d; I9 t h
- .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
' N$ ~% [7 _* c5 q1 \ - .text:10017F40 51 push ecx v, C! C; R4 _' h/ Y# ~# i
- .text:10017F41 53 push ebx
2 ~1 Q" V% T6 S' w% f! k - .text:10017F42 52 push edx
# ^, Y2 i9 k+ f( p4 G - .text:10017F43 56 push esi/ i& D+ N- I8 y: E# b/ r; g
- .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码 " h9 a1 w" c. y
- I7 J8 }, _: r" V
$ L1 g$ s7 ]: f5 v7 ~, Q
补充,CreateDevice也有可能是以下形式" B8 p, p0 B( }3 ~5 J+ m
- .text:0041640D lea ebp, [esi+604h]
* C- J. a; r! F2 Z+ r - .text:00416413 push ebp
( Z7 y9 ?$ g* i - .text:00416414 lea ecx, [esi+630h]
5 k. r: L: n* ]4 N( ~/ r - .text:0041641A push ecx3 Z( b. @0 |% M9 L6 Q) r1 x5 R
- .text:0041641B mov [esi+90Dh], dl
8 O9 _: G g* z3 ]0 A! H( p - .text:00416421 mov ecx, hWnd
. p% l9 V8 U: T1 F3 v1 g - .text:00416427 mov edx, [eax]% y1 Q7 {* s: K
- .text:00416429 mov edx, [edx+40h]
/ Z" ?7 g! K4 B2 y - .text:0041642C push 40h# F, A. l: I- r6 @) H
- .text:0041642E push ecx0 c7 s% P* H6 B. r0 E+ x
- .text:0041642F push 14 R; j h5 B: j; j& x
- .text:00416431 push ebx3 K& t+ X6 y5 q y- t
- .text:00416432 push eax6 h/ f' [8 ~/ v& x: @
- .text:00416433 call edx
复制代码 4 u: l) _# ]" S
" A, R d5 b* v9 A; c. e; Y/ Z: z) {8 F7 x8 B4 v' {0 j# r2 ~
& U8 Y- y% @; V% b( s7 [; Y
; V. O/ N0 R( Z; u) o |