本帖最后由 shane007 于 2023-8-25 15:49 编辑 2 p1 K, j% f- k" D, ~6 O
( ~) A+ m. Z# J! K- L
这是一个Directx9的游戏,不过对Directx9的初始化,并不是在exe里完成的,
" n+ Z! Q( }2 T# M8 N而是在RenderSystem_Direct3D9.dll里完成的。
/ Q$ N* c; d7 \6 ?0 J由于这个原因,本游戏用dxwnd.exe没法实现窗口化(也许是还没找对方法),需要手工修改才行。- ^; G A4 F; ]4 k# F( i; ?
要修改窗口化,就要寻找调用CreateDevice的地方。
2 T5 q; i' B9 ?0 N; ]% ^) w1 m# ]: Q3 {! S! P6 Q) e) s
因为CreateDevice是com接口的第17个函数,因此调用处的代码不外以下几种类型,, A% o: k5 d3 f/ R
逐个在ida pro的反汇编窗口中检索一下就行。(此方法没见别人公布过,算是我的发明吧。)3 ?( J/ {+ V7 Z
- call dword ptr [eax+40h]
7 P& L: E0 F8 X: V' E: W' h# I - call dword ptr [ebx+40h]
3 c# a/ Z6 b) o, M7 y- g Y - call dword ptr [ecx+40h]1 A, C) p2 a& C2 C9 ~% t D" \5 M
- call dword ptr [edx+40h]
~' F5 N' i, s! {$ q* i/ s
复制代码 ( R) L9 _4 p4 V; I0 ]7 b% J4 t5 [
1 Q. I/ J3 f9 R! Q7 z5 ?搜寻结果如下3 o/ K& e. Z" N2 [7 Z
- call dword ptr [eax+40h] 2处 OK
" G5 `& o% N7 X8 U- }1 d- d: R) Q - call dword ptr [ebx+40h] 没有5 P( h s$ B; ^! I% [; S
- call dword ptr [ecx+40h] 好几处,参数个数不对
2 z+ H6 o' j" N. l/ ~ - call dword ptr [edx+40h] 1处,参数个数不对
复制代码 5 M# V1 D% m4 u/ F, v
7 F K/ U: n. ?0 F1 w G# v$ T* Q
结论很简单,call dword ptr [eax+40h] 的2处,参数个数正确,应该就是调用处。
# ] I0 y! ]; N* N" Z/ W9 `代码如下9 l. S$ ]$ G) X. d! k) }
第1处- .text:10017F06 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]
& K1 Y. k! h" K- B - .text:10017F0A 51 push ecx8 [+ _ u9 J0 s$ J. ?: v9 R2 u
- .text:10017F0B 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
3 f5 w- {9 }' t# d# D5 w - .text:10017F11 57 push edi
6 `' }( U+ ]; m9 }+ I+ m0 B - .text:10017F12 52 push edx
8 J- c1 |: `, F" }4 n/ A - .text:10017F13 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]5 j& i% ~6 Q" H0 R3 y- {
- .text:10017F17 51 push ecx2 [7 m2 |% f, F( g! o; F
- .text:10017F18 53 push ebx
" t' Q P( @6 j$ p* t - .text:10017F19 52 push edx' d) W) a1 Z: p3 F6 j+ l4 p( K# f
- .text:10017F1A 56 push esi
& K# S0 q6 P8 r b: w - .text:10017F1B FF 50 40 call dword ptr [eax+40h]
复制代码 + A% T2 L9 O p' n+ ~1 k3 a
( t1 L. N/ V" r9 O. N
& ?6 g& U+ B1 i: v) D( y8 M第2处+ a* T+ I7 [. x# U& D4 s
- .text:10017F2F 8D 4C 24 10 lea ecx, [esp+5C8h+var_5B8]2 B' H8 N& O& g$ w; x; S( h( A. o
- .text:10017F33 51 push ecx
7 G2 u0 E3 _: r; H' _' i - .text:10017F34 8B 8D B0 00 00 00 mov ecx, [ebp+0B0h]
7 K; t3 L H# @4 _1 Z6 v2 D - .text:10017F3A 57 push edi
4 @* {" I9 N+ V' t - .text:10017F3B 52 push edx- L0 q% ^" T5 ~3 p# g s- m
- .text:10017F3C 8B 54 24 20 mov edx, [esp+5D4h+var_5B4]
* X' F, f4 O. Y5 V2 x# k1 h - .text:10017F40 51 push ecx& O. D# O$ c1 i" w) ~/ C" D3 _0 ]
- .text:10017F41 53 push ebx
: |6 d5 [* j2 x: T - .text:10017F42 52 push edx
% }6 I' E( R# U; Z2 E - .text:10017F43 56 push esi% e# g( o; |6 W* |" N! d
- .text:10017F44 FF 50 40 call dword ptr [eax+40h]
复制代码
9 h7 T. F1 W4 t7 y
% [6 V0 j6 n0 |! T' G E
; Q6 y) z, D9 H) h# @补充,CreateDevice也有可能是以下形式
! a6 S% o) ~; ~- \- .text:0041640D lea ebp, [esi+604h]' n& u7 p @. a' v6 I) ^
- .text:00416413 push ebp
* o' n$ c1 e+ F3 ]! O0 H/ O$ o4 c! J - .text:00416414 lea ecx, [esi+630h]8 j5 z) a4 c) z" H* y6 y0 {, c. E
- .text:0041641A push ecx
( G. }* j* u+ Z. W" H6 e - .text:0041641B mov [esi+90Dh], dl4 J o+ J! H* u- L4 b# W. v6 k0 C
- .text:00416421 mov ecx, hWnd' ?/ x9 S5 s7 H: B& O' S
- .text:00416427 mov edx, [eax]6 L1 `1 _- m& v' }+ K3 ]3 j
- .text:00416429 mov edx, [edx+40h]
, X5 [, B9 D# _1 g/ h( O& p - .text:0041642C push 40h8 U! f$ E) {; R
- .text:0041642E push ecx
2 N0 N; p! ]9 l% I6 y" {: o - .text:0041642F push 1
' E J% {0 _! z" r' u7 f - .text:00416431 push ebx' S+ H2 o( ]' _$ q
- .text:00416432 push eax
( `* w: }; P. z1 r) X - .text:00416433 call edx
复制代码 / B1 c& T+ V4 g$ U( L/ Q
% U( X- x a8 S5 _
3 g, {- E1 z6 @6 R- B7 D$ I9 t! B+ \* d
7 g6 ~" x# d( z T2 e |