本帖最后由 shane007 于 2023-8-25 15:49 编辑 / ?; f. v$ A/ |1 ~: q
! ]& d! o$ n: H. p2 @; f+ L3 E这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,2 O6 u) f/ w- r$ [
而是在RenderSystem_Direct3D9.dll里完成的。
& k) ?+ P3 U/ y+ _7 R3 d% c- m由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。' r0 @, K6 ?& Z/ I. ^" y; E. h
要修改窗口化,就要寻找调用CreateDevice的地方。
9 C' P0 a! }3 i2 M
6 W; g5 v, D- W) Q3 @因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,. A7 O- X7 c, _ U6 y
逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)
% L- q) ?+ }' P7 n) e- call dword ptr [eax+40h]
5 z n F* b* h1 c. P - call dword ptr [ebx+40h]
" M; n! h! O' x* h# T! S - call dword ptr [ecx+40h]
! C9 {! a! ^8 t/ D$ e! b' x2 B - call dword ptr [edx+40h]2 j3 U+ h" k% V6 F3 d8 {7 W
复制代码 ' v$ a% g- h1 v8 t2 Q
9 r3 e* J# i2 K& D* N! l搜寻结果如下
9 Y0 ?( Z9 T0 w- l4 O" O; f9 m- call dword ptr [eax+40h] 2处 OK
& i l1 t* _5 {) X/ t- J2 }4 z - call dword ptr [ebx+40h] 没有
: r# R! |, Y, Q% j4 ]4 y/ R \" T - call dword ptr [ecx+40h] 好几处,参数个数不对
, G% F& t7 I( T7 g1 a d) F1 c - call dword ptr [edx+40h] 1处,参数个数不对
复制代码 9 M+ F5 A, Q8 A9 H) f
d# n. n' G( J1 M结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。% {( j& [8 |; Q+ k0 z9 g* {
代码如下# Y) w0 }. v' ^8 f- `
第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
' U$ [2 p- a. P7 @ - .text:10017F0A 51 push ecx
6 e, d& C, j, s& \; {$ |$ I - .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
U4 o7 I5 @* W" e1 }( \ z% ^ - .text:10017F11 57 push edi
' w" G! B8 E. F+ `6 O# a! \6 i - .text:10017F12 52 push edx
: Z- I$ x' }& G- c: T" u. Q+ d- w - .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]7 J/ m3 G, f j0 z- Y P% ]
- .text:10017F17 51 push ecx) P8 t) v- G$ @7 C( Q+ J& g
- .text:10017F18 53 push ebx
# ]) L+ ?8 y0 P$ M7 z% ^; j - .text:10017F19 52 push edx
9 y7 T& X. @ o. r - .text:10017F1A 56 push esi
! v) |0 \2 N+ z9 V# f - .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码
* v0 w! _% d. K9 ]4 L0 i* }2 H7 ~
4 f$ c3 C' E8 l% d5 {5 Q8 d' y: i- [, x/ y; L
第2处- I! P) e% ^5 {' y' @( I
- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
7 H) `2 u9 P+ o+ U8 Z6 l- p$ e8 ]! t - .text:10017F33 51 push ecx$ c2 u( Q5 i1 \+ t; c6 P& E
- .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
6 m: i, I; ?5 a i& @1 \7 E3 ? - .text:10017F3A 57 push edi
' K/ M* e' {# L - .text:10017F3B 52 push edx Q! M- `2 j4 f0 b' L8 l
- .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
6 r$ y! \1 F: H$ U) i5 g - .text:10017F40 51 push ecx
# G0 U/ h D; J: ^6 s7 k - .text:10017F41 53 push ebx5 E2 L, ~" U, h, x- ~2 d/ k# k
- .text:10017F42 52 push edx
8 i# F& p' w9 I4 G* A - .text:10017F43 56 push esi
% q& [ y& w( K% D, @' W4 r - .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码
- _, C V* W5 v4 Z! Z- [- o% S+ _( d6 ^; W
& _) B4 O0 U! I; g8 g* P
补充,CreateDevice也有可能是以下形式
8 w: P; u! q9 Q/ h, P' @2 i- .text:0041640D lea ebp, [esi+604h]8 x: G7 t0 N2 Y. ^; A* V
- .text:00416413 push ebp" U8 o1 Q4 Y1 z1 Y/ a4 n# u3 u! c
- .text:00416414 lea ecx, [esi+630h]2 M; W- Y# {; ?* _, Z+ F- F
- .text:0041641A push ecx
: j5 g: J& d! \1 x( @7 j s' _- j - .text:0041641B mov [esi+90Dh], dl
8 m# K# h1 g1 c }1 ?8 P - .text:00416421 mov ecx, hWnd' _/ a2 ?) u' g5 {$ \
- .text:00416427 mov edx, [eax]
: E3 a3 f2 u0 h- u - .text:00416429 mov edx, [edx+40h]( Z0 \( P' h4 O. z; f4 s
- .text:0041642C push 40h* `" ^' ]$ g) I. [& y+ m' V
- .text:0041642E push ecx
& x9 |6 H; F! B8 J( o - .text:0041642F push 1
- }" K9 V1 _- i/ e/ j! p4 i- s - .text:00416431 push ebx, j/ m+ W8 K. S5 ?7 ?( \' R$ E
- .text:00416432 push eax
5 f) o3 T& O j* J+ x! }5 F - .text:00416433 call edx
复制代码 7 G; u r* k& P+ A( G7 `0 X
9 }) W6 Z. _6 v! U- j
- o: Y7 Z2 \1 g6 c# G4 F( g1 c
6 ~' f4 e* @. d2 k* y( @; S* P1 y# `" S
|