本帖最后由 shane007 于 2023-8-25 15:49 编辑
0 T9 D) d5 U+ X3 N2 z) A
- p1 D5 ?! [! r2 {7 F这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,
6 f6 G1 _2 a7 T9 p6 l" M: |而是在RenderSystem_Direct3D9.dll里完成的。
' O' j6 Y0 p6 U) ~' `由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。1 q' e- L) D" F' A$ P* G! }
要修改窗口化,就要寻找调用CreateDevice的地方。2 n! z3 T# v* N4 K
8 b3 D0 R5 J, k. A- D0 X6 ~
因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,, r5 W5 L" I1 r% @" o
逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)7 f8 M+ ~: m) b- h0 @
- call dword ptr [eax+40h]
# {" s7 _0 u8 ?5 R: V$ i6 ?, D m - call dword ptr [ebx+40h]/ E) o/ J3 A& P+ O* @
- call dword ptr [ecx+40h]
/ e$ W3 Y- P. V; V& C+ A2 e - call dword ptr [edx+40h]. g! {* V/ @" S; p+ y
复制代码
& l; Q; t. D& L q% J' h" K3 C
# R/ Y1 ^3 v( y, e+ `; S搜寻结果如下
2 o- U3 D W1 y- call dword ptr [eax+40h] 2处 OK
( ]4 f/ F, B F; c - call dword ptr [ebx+40h] 没有& N( |; U" W6 v$ C0 E. y8 J
- call dword ptr [ecx+40h] 好几处,参数个数不对# N* r! c* E/ B" K7 z+ e `5 V
- call dword ptr [edx+40h] 1处,参数个数不对
复制代码
/ [/ S% W0 j. q+ h L! L9 U% a. a- A! K/ b. P
结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。
0 q7 \! V- ^3 r代码如下! d0 X7 X; R: b% c1 e. x% f
第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]4 I8 l5 z( B* b" X! g
- .text:10017F0A 51 push ecx
. `2 Q. T) C1 s1 X$ i9 H - .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
% I6 m. E& }' L6 ~( W+ l1 p0 x - .text:10017F11 57 push edi: o7 p9 l5 d5 \& n# E1 k
- .text:10017F12 52 push edx A+ G* @9 S1 S" @
- .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
- c7 X) d4 c1 p4 ^1 S& P& I - .text:10017F17 51 push ecx' l3 Y( L6 @6 ?( @* @
- .text:10017F18 53 push ebx5 |" D* i* O9 X% b
- .text:10017F19 52 push edx
" s# ]. y$ _, b S1 K) I' i% j+ J3 ] - .text:10017F1A 56 push esi. F% H. f; D( E! D7 G, x
- .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码 : C' i, l3 j; o! D$ o
3 @0 b7 v2 m9 O8 W1 r
: I! w# j7 d4 B8 W; u0 Z2 A! }
第2处
5 Y! u; \$ S/ n4 v/ }- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
' q9 x" F# l5 i! x, d - .text:10017F33 51 push ecx# z( n7 r) a& L
- .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]+ P* y4 y2 {0 Y. R
- .text:10017F3A 57 push edi% q2 W! o$ Z8 [# y3 @( h
- .text:10017F3B 52 push edx
9 y/ \0 e, G# U# X' h - .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
6 M ~7 |- |: E' x( j# G2 {7 J - .text:10017F40 51 push ecx
. h) W3 O/ g+ A6 z7 D8 U - .text:10017F41 53 push ebx
2 f/ I+ R2 p/ q2 u6 C- t+ }, A - .text:10017F42 52 push edx
6 t( k, P0 @0 u6 Z3 U6 n }, z - .text:10017F43 56 push esi; [4 {3 X3 e% e) }: }
- .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码 7 L; E' \' H' ?' i8 Q i8 V8 E
( M% |3 n F6 J6 D9 \# I/ \& k8 x8 ]: ?: M: o4 X% d9 o- ^
补充,CreateDevice也有可能是以下形式
( J4 P5 V( R9 R" n L. w- .text:0041640D lea ebp, [esi+604h]
% B" }& g, l4 h5 } - .text:00416413 push ebp0 X9 o% i3 Q' r% Y& D% d Q, m
- .text:00416414 lea ecx, [esi+630h]
6 i5 W' }+ H+ J4 d - .text:0041641A push ecx/ h' ]# M/ K/ e( c6 q8 H/ c
- .text:0041641B mov [esi+90Dh], dl$ R0 l! l/ p# G% K, A
- .text:00416421 mov ecx, hWnd/ _6 {8 Q, a$ a$ X7 {. q
- .text:00416427 mov edx, [eax]
t9 q# \$ I( c) E - .text:00416429 mov edx, [edx+40h]6 `( q" Z; p9 `8 E
- .text:0041642C push 40h6 Z& {# O7 ~6 }0 J% O2 o
- .text:0041642E push ecx7 O( N! z4 G) Q
- .text:0041642F push 10 _. ^5 }! M) w$ {7 j( O U! O
- .text:00416431 push ebx0 ?) m: N0 u0 J4 P6 k6 ~
- .text:00416432 push eax
' P8 `" Q: d3 ]8 j5 D0 H! C4 ?/ q* ? - .text:00416433 call edx
复制代码 , r, I, p+ j" B, |, D# d. s# w
, r# y; Y* E: b' \3 _4 z
% N7 B' N3 c9 v9 f: ]( S* i) [5 x3 q- b( U4 a6 U8 ^; [
" h1 G: y+ d i
|