本帖最后由 shane007 于 2023-8-25 15:49 编辑
( X2 k3 P: Z) G2 J- N8 m* s" K! B' q3 r) h9 H; R7 S" P9 u
这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,
' t( k2 t k0 {2 T1 x% D8 M而是在RenderSystem_Direct3D9.dll里完成的。
0 ?- @! J. e9 d) T- G8 q由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。' i2 ^3 ^8 x. i7 T4 R3 |
要修改窗口化,就要寻找调用CreateDevice的地方。8 Z" }2 G6 {, C
/ P' @: {0 `* g9 |% @! U w+ B因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,
! \& J) r% D* w0 R! O5 F: a逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)
C/ s: H/ P2 f. B/ ?: L6 |/ u' |- call dword ptr [eax+40h]* U# y0 ]. t) T: ^: D" C
- call dword ptr [ebx+40h]( R; H0 o: V4 S% Y
- call dword ptr [ecx+40h]
) U( `. d+ ]$ n& `) } - call dword ptr [edx+40h]. ?5 `$ q5 Z, l9 ~& j7 u$ S6 y6 [
复制代码 2 w$ j: P5 W: m1 z& q/ C
3 \: D, ?' ~. ^2 e: P( {0 ~. V搜寻结果如下( B1 `. m7 L% N# z+ i' G) K
- call dword ptr [eax+40h] 2处 OK; B! m; s% d0 s! N/ r5 Q
- call dword ptr [ebx+40h] 没有& ~6 b. k! w S# j
- call dword ptr [ecx+40h] 好几处,参数个数不对
) E* g( }) c6 }9 b - call dword ptr [edx+40h] 1处,参数个数不对
复制代码
; O% R% f$ z$ L! V$ B: }7 V; ?! Q4 l4 z. I% s \0 j' [% S
结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。
! @) ^/ @; W( b! W代码如下* g2 ?0 w2 [5 O, N2 q. y# |- \
第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]1 h% Q- A' V" E. @, X3 W7 R
- .text:10017F0A 51 push ecx
- B, F' C* r- Y1 u# _; b* Z - .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
5 M7 R9 N- n7 S! B - .text:10017F11 57 push edi
: I3 g) ]3 m6 T$ S1 @ - .text:10017F12 52 push edx4 B5 e" ?. V& v% L: U& E' D
- .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
0 t6 u* g/ P+ D/ T, B% Q - .text:10017F17 51 push ecx; a* R7 g2 ~; [: O
- .text:10017F18 53 push ebx
, @2 W0 h& u0 M - .text:10017F19 52 push edx
+ y' p7 ]. `$ t% o+ M& Q V" p - .text:10017F1A 56 push esi
: @( R. O+ F2 }+ i2 ~7 C - .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码 , t; S M8 m/ t% ?8 G6 p* n) F6 I
. A' t. e1 Z7 X% a7 ~" c' Z' t# c
. ~9 q0 b3 S2 X2 K! y第2处. m e' I' d6 }+ O- d% J1 ^, `+ n' H
- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
- K0 U- o' N( [: H8 {! r8 V" u - .text:10017F33 51 push ecx0 z: G) k/ i' t* K+ V( g8 k! s4 h
- .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
# b) \9 N$ w( r; O# ]" c: m - .text:10017F3A 57 push edi) O q& l) u6 C( p1 \# Q, u* n
- .text:10017F3B 52 push edx/ _) l6 B& c5 i2 }: o" t! z) b ]
- .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]/ f# O3 g! W* A1 W. u4 Q
- .text:10017F40 51 push ecx4 ?7 ?6 F- v8 Q9 Z* X
- .text:10017F41 53 push ebx
) G6 P3 j7 Z* G6 C8 M: O/ u& k - .text:10017F42 52 push edx/ U7 }1 u! O7 t6 P9 Q3 g$ T; j
- .text:10017F43 56 push esi# Y4 j7 Q6 I: G3 h1 w- Z
- .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码
: ]2 u/ R) k- U# n3 y; D, k- \4 E* A3 o) w! k5 i
4 \. c2 E, g7 c6 S补充,CreateDevice也有可能是以下形式
5 n" X) y* _0 n' v- v5 r2 V- .text:0041640D lea ebp, [esi+604h]
+ V; k/ X+ W: b+ b2 G - .text:00416413 push ebp% Y% A6 Q9 M, Y5 [- o- m6 a5 }: K
- .text:00416414 lea ecx, [esi+630h]
0 D3 e* u: s P+ R" }4 ]% y% X4 z - .text:0041641A push ecx
" ~8 q6 y% x7 e" C- A' V6 S7 t - .text:0041641B mov [esi+90Dh], dl! q+ v) a D* A
- .text:00416421 mov ecx, hWnd. r2 F4 O/ `# t3 J( s" ~
- .text:00416427 mov edx, [eax]
" W. u; h. s0 I5 A) U - .text:00416429 mov edx, [edx+40h]
! Q* `1 S X% i* z" T; _ - .text:0041642C push 40h* f5 `$ [+ c$ y
- .text:0041642E push ecx
$ M! S) {" _: q+ V: Y- H7 r - .text:0041642F push 16 V; Q3 M7 j" w. ^& s+ [2 y; n
- .text:00416431 push ebx/ [8 \0 U c7 j# u! i3 u
- .text:00416432 push eax
$ G4 [/ B/ H8 L" P8 v3 e5 P. ~( Q - .text:00416433 call edx
复制代码 8 w# N0 q: W5 j
7 N n5 q) r* H9 ^ l
+ ^9 C& ~! @& ^8 v R1 G. S ^; U. r* s! i9 b) d' u' g
6 y0 X( q, U3 a; Y( O# ^ |