本帖最后由 shane007 于 2023-8-27 13:23 编辑 : ~% p) n2 I: X( N. N) s
2 s: B3 C' N7 L# X3 R本游戏采用了CEGUI,该组件能采用directx和opengl。2 Y) e1 V" [0 {+ z: [! z, G
经过我的小方块测试,游戏屏幕显示了小方块,因此确认是directx9的游戏。1 i/ m8 p8 q1 K3 X/ g
游戏自带一个EngineSetup.exe程序,设置为窗口模式后就能用cheatengine调式。
. m+ K- ~; M" {, F3 @) K(由于游戏窗口较大,我将游戏屏幕和cheatengine分别显示到2个显示器上即可。)
; _4 n$ J' r/ b& N! |
* h$ V0 j/ D( S x
& W. x0 u: y8 x% R在游戏中找一个字幕,在以下地方断下。
* k$ C# I2 }4 \. g+ D由于该游戏基本都是显示在屏幕固定位置(上或者下,居中),3 i4 B( J2 @" B5 C# r( ?2 T& H9 |
因此暂时认为此处就是游戏的字幕函数,该函数被20处左右地方调用。
8 s& C# E9 u% @6 W
3 I! d& O* B, H: }- NextLife.exe+11C5 - 42 - inc edx1 X4 B3 d* ~ L3 D1 D+ ]
- 004011C5
复制代码
+ U3 @% m& f- ^8 k) P' d9 j$ P7 E/ U f4 z
该地方的伪代码; g L3 M. }/ e8 w
- void __thiscall sub_401160(char **this, const char *a2)
* v3 c# y! n& S0 e8 K. C - {
7 n0 b; E1 e: e. E" W - char **v2; // esi
( ]& y! t- n7 T( F* r2 b& B* d - char *v3; // eax
) x0 ^( ~9 n2 |9 p3 C" n2 R - char *v4; // eax; X R7 h8 a: f3 g0 \7 O
" F% G' S! g& a4 N6 R# q' h- v2 = this;
( b: o0 E- n6 q5 Y- N5 R - if ( a2 )2 z! z8 Q2 k, t4 T
- {
8 n$ r3 @6 f' D1 F) y" C - v3 = *this;
% I* d3 l* M. J - if ( a2 != *this )) z- k; Y% t5 s1 R
- {) j9 z4 I5 b1 k9 C r# k( @
- if ( *a2 )
- l( J$ V/ X' c# v1 s U& x - {
, _7 Y; R% b. |0 o" ? - sub_401030(strlen(a2));
. ^0 E/ D9 n* j6 i - strcpy(*v2, a2);; s: w* E/ j, g& b
- }5 A, O5 M6 R4 l' L4 I
- else
5 v8 t2 J h. w8 X8 h% \ - {) p; V1 u7 t5 a
- this[1] = (char *)1;
- S' M* A3 }& m6 @ - if ( v3 )
8 `$ D' s( Y4 M$ b6 j - operator delete[](v3);; |1 V1 r6 K( x6 |7 e0 F, L
- v4 = (char *)operator new(6u);% B' k) w! o1 }" W: @
- *v2 = v4;$ a8 }5 E; ~2 Y8 c9 w
- *(_DWORD *)v4 = 0;
6 X9 t4 r- {, t. A4 ] - }
+ b* j" t8 V; K2 q - } D+ W% ~6 Y/ v& c, l6 v8 ~# ?
- }) w) k- `5 U' T0 M2 S
- }
复制代码
: Q" I: r' K2 I3 R6 F7 G! H6 D汇编代码) t9 b& D. F. Q4 M% m F8 d
- .text:004010F0
6 D1 Z0 l H5 q5 i" H" p - .text:004010F0 ; =============== S U B R O U T I N E =======================================
t2 i0 q* b' E7 i- i7 j' U! m/ n - .text:004010F0 u8 v6 E& V# }( ~
- .text:004010F0) J; x! }( @9 o$ g, b
- .text:004010F0 sub_4010F0 proc near ; CODE XREF: _main+139↓p
9 K+ \) c9 Z% l4 I* W - .text:004010F0 ; sub_403240+97E↓p ...* ~3 H i: r6 L
- .text:004010F04 J: d* C7 p2 ?/ Z
- .text:004010F0 arg_0 = dword ptr 4 ?5 B; G# h) Q, p4 d' e& W
- .text:004010F09 C. [! t/ | _
- .text:004010F0 mov eax, [ecx]
* J, y6 }+ C5 |4 P - .text:004010F2 test eax, eax
# g( |1 V+ L# U% R# A - .text:004010F4 mov edx, [esp+arg_0]
# x6 u' [: w3 z1 p - .text:004010F8 jz short loc_401147! S5 v9 M( N; `1 M' p# N3 E! V
- .text:004010FA test edx, edx
* X) `, S' Z% N' f - .text:004010FC jz short loc_4011471 u# N$ W6 N; r1 z" {
- .text:004010FE mov cl, [eax]
8 {% g7 F) b9 I$ y% A# s2 x: @* ` - .text:00401100 test cl, cl
4 }% }) h$ f* n: l+ Y2 j+ x - .text:00401102 jnz short loc_401116
7 ~+ u" k# @( b% l$ T% E7 a# k0 Q - .text:00401104 cmp byte ptr [edx], 0
: p. l+ B' f% ~: F. b s6 | - .text:00401107 setz al* r( _, a7 r2 z- z
- .text:0040110A xor edx, edx
2 y% x" y8 q. x3 i, _2 v - .text:0040110C test al, al3 q3 Q4 t+ ]: l5 K% \9 {4 V
- .text:0040110E setz dl
1 l; R" P$ N, t7 h5 p; W - .text:00401111 mov al, dl6 c6 h+ G v$ b. D( g
- .text:00401113 retn 4. P6 _) B8 C$ u0 t; ?. c( K( _, h
- .text:00401116 ; ---------------------------------------------------------------------------
0 f, ?6 f& |& r; A - .text:004011164 x* c: S2 @" M
- .text:00401116 loc_401116: ; CODE XREF: sub_4010F0+12↑j, {* B0 w d2 Z3 `+ N
- .text:00401116 cmp byte ptr [edx], 0
0 Y' e' D/ H* j- S" I e3 o% c - .text:00401119 jz short loc_4011478 f/ N9 Q+ i- N8 T
- .text:0040111B jmp short loc_401120- Z$ ~6 z5 ^" j; O- |
- .text:0040111B ; ---------------------------------------------------------------------------! D9 M. S1 C! d/ q6 s! d* V
- .text:0040111D align 10h
$ q/ o- r$ l3 L: y - .text:00401120
- i [9 N# ~" F" c3 A4 Z2 }( | - .text:00401120 loc_401120: ; CODE XREF: sub_4010F0+2B↑j* D9 l$ {2 S% Y+ C( l) L1 ?
- .text:00401120 ; sub_4010F0+3B↓j" s; a R$ q" S( [0 k" ?
- .text:00401120 cmp cl, [edx]
! R' }0 `# Y( @* S+ b2 A& T6 Q3 i3 y - .text:00401122 jnz short loc_40112D( Z* ~4 G1 U- n' u/ |, g/ I; |
- .text:00401124 mov cl, [eax+1]
4 s, R: ~2 i4 L8 g+ D/ ` - .text:00401127 inc eax8 I( Z0 ? ?9 I' a
- .text:00401128 inc edx% V) t, B; f$ V N+ I
- .text:00401129 test cl, cl( U9 \: y: R# k I
- .text:0040112B jnz short loc_4011207 K% n9 y6 v C8 P7 W4 H
- .text:0040112D
z. V1 R* z" g6 @9 R; r - .text:0040112D loc_40112D: ; CODE XREF: sub_4010F0+32↑j9 ?8 ?2 j6 R$ ^( u, Y4 I
- .text:0040112D movzx eax, byte ptr [eax]+ E7 W" P2 F: x. H8 [
- .text:00401130 movzx ecx, byte ptr [edx]
2 O7 p1 o1 w$ ?, f - .text:00401133 sub eax, ecx
9 z& x% M7 L0 y3 @2 a5 m- b - .text:00401135 neg eax/ v7 U/ w/ N( A2 J: z0 G
- .text:00401137 sbb al, al
: t( Y! c1 v: n1 `: \/ R/ X) i( R5 { - .text:00401139 inc al
& a: d' W1 J0 R5 r - .text:0040113B xor edx, edx/ T8 Y; q6 g0 L. Y2 Y1 e$ }/ y
- .text:0040113D test al, al5 C8 ^/ o4 X; `$ j: g6 ~ c
- .text:0040113F setz dl
1 Q" R! R5 N- {: x- l - .text:00401142 mov al, dl9 L# j8 u0 |( m+ A2 Q
- .text:00401144 retn 4
/ w+ d% }9 `' E5 E/ L z4 d2 E - .text:00401147 ; ---------------------------------------------------------------------------; n$ Y7 ?% I# S8 M) i
- .text:00401147
) W5 E! W5 B6 r: R* I, w( V - .text:00401147 loc_401147: ; CODE XREF: sub_4010F0+8↑j
" t D9 H% v { - .text:00401147 ; sub_4010F0+C↑j ...4 Y% I. t* v1 H% \
- .text:00401147 xor al, al9 k8 }5 a8 v0 W) H7 K8 F$ C! q8 N; t
- .text:00401149 xor edx, edx( a( o8 ^$ b* K
- .text:0040114B test al, al
; ^" {8 W8 [) A - .text:0040114D setz dl
# B% P: S; R4 s/ D% w e& U6 ? - .text:00401150 mov al, dl/ @) V5 Z0 d5 f0 g
- .text:00401152 retn 4; B p* G" u4 Y: j8 P3 F& b
- .text:00401152 sub_4010F0 endp
1 l$ d7 x. A `* ]1 w3 u5 t" [ - .text:00401152
0 O9 q, p7 E9 o1 D2 J0 w! {1 m9 ` - .text:00401152 ; ---------------------------------------------------------------------------# l3 O" l2 G0 v/ g6 Y7 W+ Y; y' q/ _
- .text:00401155 align 10h
; n4 F; O1 x4 M- y2 j - .text:00401160
5 U& I9 ?+ E+ e: g! v - .text:00401160 ; =============== S U B R O U T I N E =======================================; j& Y3 H" }0 D$ K k
- .text:00401160
6 d; T' I" B6 e, S - .text:00401160 y& V i0 O+ b/ U1 F y5 o
- .text:00401160 sub_401160 proc near ; CODE XREF: sub_4013D0+15↓p( H$ Y# z! X( A, t! y
- .text:00401160 ; sub_4013F0+C↓p ...7 z# G; s# D/ ?! t4 M2 {
- .text:00401160: ?, ~0 F5 F# M) M) ^4 l0 {) E/ t
- .text:00401160 arg_0 = dword ptr 4
/ A$ [& a0 c) [' F7 T/ k5 v - .text:00401160. j9 c* ~/ N! w
- .text:00401160 push esi
. ]/ Z# \% X+ y3 E7 ?0 y - .text:00401161 push edi
: X& T: T# j; b* E( O/ ^ - .text:00401162 mov edi, [esp+8+arg_0]
8 ~( o O0 |" ^5 d( O& b" _ - .text:00401166 test edi, edi% I# b8 B7 H8 @
- .text:00401168 mov esi, ecx9 ]+ p9 R; E9 f
- .text:0040116A jz short loc_4011CA- K' f. M) k8 R0 W& Z E2 p4 y$ _
- .text:0040116C mov eax, [esi]5 n! @0 E/ r0 L k1 j
- .text:0040116E cmp edi, eax. E3 ?: |, z: y. o2 L* u
- .text:00401170 jz short loc_4011CA) X. H4 Q! G0 |) U4 v9 {$ u4 S! Y' Q5 J
- .text:00401172 cmp byte ptr [edi], 0
3 }7 d m7 R7 f7 q ? - .text:00401175 jnz short loc_4011A2
8 @* R: m: @8 C9 Y" W' P - .text:00401177 test eax, eax
* x! {2 k* q1 R. s/ c - .text:00401179 mov dword ptr [esi+4], 1* ?, N6 G5 h' { C8 G
- .text:00401180 jz short loc_40118B
0 @. [/ N5 ~) U! w# C - .text:00401182 push eax ; void *
g' n [' \6 ?- q" R0 R& v7 X. j' z* N - .text:00401183 call ??_V@YAXPAX@Z ; operator delete[](void *)
' M% e2 x B5 d - .text:00401188 add esp, 4
! `4 c7 V' M+ E8 q - .text:0040118B
3 F( ?9 Q' j8 k+ {% z P; T% l - .text:0040118B loc_40118B: ; CODE XREF: sub_401160+20↑j
1 a R5 q% I+ ^ Y6 Z% H' t - .text:0040118B push 6 ; Size
' j8 E G8 w/ q: \ - .text:0040118D call j_??2@YAPAXI@Z ; operator new(uint)9 [9 u% B% B2 t S# z
- .text:00401192 add esp, 41 n" N5 d [! i2 b6 V& h
- .text:00401195 mov [esi], eax4 Q+ @- `2 q/ x* F
- .text:00401197 pop edi
0 |" Y3 E. e; W$ }, b. c - .text:00401198 mov dword ptr [eax], 0
+ V! ]7 q8 A: M- }4 b7 H% F - .text:0040119E pop esi
) f7 e# t. E8 S; k1 i* v! e* }+ f - .text:0040119F retn 4
5 [+ v0 m7 s: L- ^ - .text:004011A2 ; ---------------------------------------------------------------------------
k& Q# H+ C' o! M0 z. ? - .text:004011A2
, k3 [+ Z! R9 F$ [( ?" a+ \0 d - .text:004011A2 loc_4011A2: ; CODE XREF: sub_401160+15↑j" q4 H/ E( E2 U U- v6 p, D$ Q
- .text:004011A2 mov eax, edi& C3 U0 w) g( u9 T6 p
- .text:004011A4 lea edx, [eax+1]
# t3 X; }7 G8 @; H8 T' N - .text:004011A78 x, [) t$ v8 N9 u! l8 D2 ~5 H$ X
- .text:004011A7 loc_4011A7: ; CODE XREF: sub_401160+4C↓j; E Z' @: @- d
- .text:004011A7 mov cl, [eax]& P- f6 u4 T. h
- .text:004011A9 inc eax
7 |) D/ _( E$ X - .text:004011AA test cl, cl, c2 `9 L# x8 }* Q. f4 K
- .text:004011AC jnz short loc_4011A7' ^, f; Y! H- y+ E+ r# K
- .text:004011AE sub eax, edx
' Y/ _/ s3 T! r - .text:004011B0 push eax
W. `: H; F+ u' A" f - .text:004011B1 mov ecx, esi
8 p; S) m. K2 I5 E2 G3 H - .text:004011B3 call sub_401030! K. j" _% d( t: C4 x% j ?5 n( X" I
- .text:004011B8 mov edx, [esi]; f; A+ @: S& P' H9 A' P
- .text:004011BA mov ecx, edi
4 A5 y: k6 p0 v$ G1 W# { - .text:004011BC lea esp, [esp+0]
& p( ?+ |+ D! B4 ` - .text:004011C0
3 }" ?8 B! X7 d- D% n, @" I/ h+ j: v1 H - .text:004011C0 loc_4011C0: ; CODE XREF: sub_401160+68↓j
; y1 [+ a- [ r - .text:004011C0 mov al, [ecx]
1 O- v) m) ^+ R* S: O& m7 S, M - .text:004011C2 inc ecx
: P* U: x. L3 W7 c; Z - .text:004011C3 mov [edx], al* ^9 p# G$ }% O9 q& q- U
- .text:004011C5 inc edx; O" d) v5 J3 y, u0 s( G
- .text:004011C6 test al, al: H5 h( ^. D1 z f& L0 |; |
- .text:004011C8 jnz short loc_4011C0
- d9 Q u o; } - .text:004011CA
7 y' K5 {2 p4 \, k4 j& X3 I, S - .text:004011CA loc_4011CA: ; CODE XREF: sub_401160+A↑j
! b6 i, ?$ l" U5 w) U- p - .text:004011CA ; sub_401160+10↑j
' S1 o( s! p' l% X - .text:004011CA pop edi& v/ L5 ?) c2 @8 v/ k
- .text:004011CB pop esi
; r* `, N0 S9 o$ P& g5 p" I - .text:004011CC retn 47 Q( f Y, X. G
- .text:004011CC sub_401160 endp
) R: i! y! g/ b1 t% }, a! c - .text:004011CC
2 L: q& \4 R$ A+ b3 [% Z' H - .text:004011CC ; ---------------------------------------------------------------------------
复制代码 ( Y2 M' h, V! K3 x8 V$ h9 F& ^$ C: c
2 n& F3 {$ X F# g# R
+ t# H2 C9 L7 v: [# E6 h |