本帖最后由 shane007 于 2023-8-27 13:23 编辑
: P: `* Z' C0 p: c1 R8 I4 W% O- R' f! X
本游戏采用了CEGUI,该组件能采用directx和opengl。
% C: O8 W, K3 `经过我的小方块测试,游戏屏幕显示了小方块,因此确认是directx9的游戏。
4 w( u- A$ V! c7 R! d" K游戏自带一个EngineSetup.exe程序,设置为窗口模式后就能用cheatengine调式。
+ B8 Y5 A4 k. d(由于游戏窗口较大,我将游戏屏幕和cheatengine分别显示到2个显示器上即可。)
* Y4 T, V. }3 I& M# t8 n0 _; x/ V- T/ c8 v: ~
7 p) i% F8 z+ i' I1 n
在游戏中找一个字幕,在以下地方断下。
3 s3 Z" i2 _% T4 n' ~( b7 S/ Z由于该游戏基本都是显示在屏幕固定位置(上或者下,居中),
: v0 h1 j! b- Q0 d. B! C因此暂时认为此处就是游戏的字幕函数,该函数被20处左右地方调用。
7 Y5 E/ J1 x1 _4 P% b H- Q# R
9 b1 U8 L" f, ~+ {( I2 E9 E5 M5 V) P1 m- NextLife.exe+11C5 - 42 - inc edx; n4 j9 Y% a" _ w+ e6 p9 V
- 004011C5
复制代码 * i$ d: n ~0 i3 u4 z
* G9 m) ]; B% E& P: N k
该地方的伪代码
1 z1 G8 J3 h% y$ R- void __thiscall sub_401160(char **this, const char *a2)9 c: \9 X' P9 l" j( j6 x' ^
- {4 S1 Z7 R' i' V; n7 ^; Q! x
- char **v2; // esi
* E9 d# V* I" P3 x2 |9 \ - char *v3; // eax
4 V3 c( Q% l3 }4 C8 L& D - char *v4; // eax) L/ [) f" H+ O! j; T R
- 8 T" |/ g$ W) Q1 Z9 B6 C. V
- v2 = this;% S# ^) O; _( S% A0 j+ S6 t4 L
- if ( a2 )8 V" O+ i7 `- q
- {
+ w2 T, N* o- G* G - v3 = *this;
0 H) }% _1 ?+ v+ a v; f- Z+ c - if ( a2 != *this )
# j, h4 Z& T) z1 D, K+ a4 S - {8 j4 h( G3 S F
- if ( *a2 )
1 T1 R: p% G: q$ e8 I - {
$ s$ o- ?+ [+ k3 T3 W* l - sub_401030(strlen(a2));4 @: `1 \9 @0 _5 s6 z; K3 Q
- strcpy(*v2, a2);
1 M3 Z3 \% T& K0 a$ Y0 M7 l* W2 C - }
+ [2 ^) k' l! c$ X - else
! n0 j# v( R6 d" `7 S: \ - {! e: z5 ?: Z3 ?; z
- this[1] = (char *)1;) P% M! i! V: z$ G$ J0 C
- if ( v3 )
! x* V+ R) p# M7 p; W; m - operator delete[](v3);
/ W9 j8 w0 _$ b - v4 = (char *)operator new(6u);
6 j; `% s; `$ V& ~, f# q - *v2 = v4;
, a9 i* U" l7 [' A- Z% A - *(_DWORD *)v4 = 0;& z4 X w8 ~, _ D
- }3 ^! N$ @5 j' C, d9 o: G
- }
0 ]' O+ T2 C, F/ Z" t2 F' F - } N, }- S$ L6 Z. K6 S& b5 B" O4 q$ B
- }
复制代码
9 R" ~* A S" x, b汇编代码
( i( }1 L# k$ _4 g% D- .text:004010F0' ]# i0 i/ H% L7 J
- .text:004010F0 ; =============== S U B R O U T I N E =======================================, v' V" D7 C) P) F0 y
- .text:004010F0
3 g9 z" o$ C$ B. l% j2 P; o& A - .text:004010F0' b( c" L7 p: W; ]# H7 M/ N- v7 ?
- .text:004010F0 sub_4010F0 proc near ; CODE XREF: _main+139↓p
) ^0 @) a# O& s; w# @ - .text:004010F0 ; sub_403240+97E↓p ...
! U& O3 \% d0 q+ Z. u - .text:004010F0" S( q1 k) b1 m% O) [# |2 {2 v
- .text:004010F0 arg_0 = dword ptr 4) u6 ?$ y6 L$ c3 y! w- t' x0 Y! E8 Y
- .text:004010F0* u% j' D5 h2 ^
- .text:004010F0 mov eax, [ecx]; b/ x$ W: C6 O7 L) M
- .text:004010F2 test eax, eax
, d+ i r( s, l5 |0 T - .text:004010F4 mov edx, [esp+arg_0]! n' I, h* M' ~& b4 H
- .text:004010F8 jz short loc_4011479 s$ {2 h ^4 G% q1 r5 j) A C
- .text:004010FA test edx, edx
8 k1 N+ D) Z- _+ t# E. \4 Z* @ - .text:004010FC jz short loc_4011478 A" u2 v* U" E! V3 Z
- .text:004010FE mov cl, [eax]
% w4 W" S" z. M; V# g. n! b0 @7 u& k - .text:00401100 test cl, cl' t% i, |. @6 I1 O
- .text:00401102 jnz short loc_401116
$ w& h% ]2 C" N. z - .text:00401104 cmp byte ptr [edx], 0
$ c8 I/ ] h7 [$ j1 ^/ h7 } - .text:00401107 setz al8 M, v6 O9 q$ R! [) N
- .text:0040110A xor edx, edx( P3 b! ~0 l+ T! h; r
- .text:0040110C test al, al3 |$ X- @0 t- u
- .text:0040110E setz dl. T4 |8 V9 \& X' {
- .text:00401111 mov al, dl. |2 ~ O! P* `
- .text:00401113 retn 4* c. z% U* n9 d
- .text:00401116 ; ---------------------------------------------------------------------------
( ?) A' H* I. J1 N - .text:00401116
% U. h$ c. k7 i3 q- p; M. n - .text:00401116 loc_401116: ; CODE XREF: sub_4010F0+12↑j _' m0 Q, K7 K8 I
- .text:00401116 cmp byte ptr [edx], 02 {! h, [0 u8 Y9 g
- .text:00401119 jz short loc_401147( \- t1 s1 h5 [1 [: e0 S
- .text:0040111B jmp short loc_401120( [) W6 t' O' |" h
- .text:0040111B ; ---------------------------------------------------------------------------9 K( `' R. X0 ~& O' O, x4 _
- .text:0040111D align 10h
$ P: w4 J! p" i* I( C/ j( e) F - .text:00401120
/ n7 I1 ^6 G3 N! N5 l" l - .text:00401120 loc_401120: ; CODE XREF: sub_4010F0+2B↑j
! a/ f0 l* }6 b, R7 E - .text:00401120 ; sub_4010F0+3B↓j, P0 W8 r3 D* x; y8 t2 V$ c% V9 T0 [1 o
- .text:00401120 cmp cl, [edx]
3 a, ?" n: c! u0 w( ` - .text:00401122 jnz short loc_40112D/ }$ e5 s4 D' r6 {
- .text:00401124 mov cl, [eax+1] Q( P8 Z% U/ _& o5 c
- .text:00401127 inc eax; h! f: T3 \& r
- .text:00401128 inc edx0 y8 t! P8 P ]3 K7 @: n; f& y9 m
- .text:00401129 test cl, cl
/ J4 B! ~) M9 W0 G5 l p - .text:0040112B jnz short loc_401120! l5 g* @( q S$ [# G
- .text:0040112D O( ^$ L( U v
- .text:0040112D loc_40112D: ; CODE XREF: sub_4010F0+32↑j5 o f& {: r3 \6 l) @& R4 R
- .text:0040112D movzx eax, byte ptr [eax]
+ ~$ A7 [! ^2 y - .text:00401130 movzx ecx, byte ptr [edx]
! z" W+ Q' m1 U( ?, r" W! Z' w5 ^ - .text:00401133 sub eax, ecx
+ n) K& X N5 J - .text:00401135 neg eax3 h' u1 k( ~% r( a
- .text:00401137 sbb al, al
& H/ Z; `$ g, r' B - .text:00401139 inc al: x% T" H- u; D* s H
- .text:0040113B xor edx, edx
$ Z% P ]9 j. U6 K5 g - .text:0040113D test al, al; d* Y- O1 A( R# B
- .text:0040113F setz dl2 s' }( T$ ~7 b
- .text:00401142 mov al, dl
4 }& H9 m& [* R4 \+ X - .text:00401144 retn 4
! B+ \+ f, P; [( |1 C# u; M - .text:00401147 ; ---------------------------------------------------------------------------4 l" B/ X" f8 I6 `& W
- .text:00401147( z) C% M$ I5 R+ [4 X. v
- .text:00401147 loc_401147: ; CODE XREF: sub_4010F0+8↑j5 u6 `( |4 X$ D% \$ @+ {4 M" R! r
- .text:00401147 ; sub_4010F0+C↑j ...4 \- l. t. o' C/ u
- .text:00401147 xor al, al* h0 H. n: L/ } q, B5 W% F0 i: j2 F
- .text:00401149 xor edx, edx
# b; l" R" K) e/ ~1 B - .text:0040114B test al, al0 y; A; U0 ?3 T6 r( R! D, @ O
- .text:0040114D setz dl
* @. _& H' i. M2 u3 r, o - .text:00401150 mov al, dl9 x8 n3 V& n; T% I' I
- .text:00401152 retn 4
3 {! b, T4 @% J) y# `7 \ - .text:00401152 sub_4010F0 endp& Q) y" T2 [3 e V- j
- .text:00401152
$ B4 Q* ~$ _; M. ]' n - .text:00401152 ; ---------------------------------------------------------------------------
; p* t, Z- b3 }5 y3 y - .text:00401155 align 10h
+ }" \0 X8 Y& }! J2 u; _! u - .text:00401160
, o6 u% d; N' i, ~5 q - .text:00401160 ; =============== S U B R O U T I N E =======================================
r% @8 s* G$ D5 P - .text:00401160
% d! t; S/ j8 J6 A - .text:00401160# d P; A. W7 g; W) D+ D
- .text:00401160 sub_401160 proc near ; CODE XREF: sub_4013D0+15↓p
: Y& s0 j# D- O. i9 i - .text:00401160 ; sub_4013F0+C↓p ...
" H n! P/ D. b! u$ I - .text:004011605 e3 A% v# k) x# k- I1 ?' ]
- .text:00401160 arg_0 = dword ptr 4
6 i. r6 `0 K- A& v8 E/ V - .text:00401160
9 e$ g9 o- L3 h; f - .text:00401160 push esi
) c) d8 p- E( i a* l/ U! D9 X+ h& s& _ - .text:00401161 push edi1 P2 s8 n9 _. N8 l4 P! |
- .text:00401162 mov edi, [esp+8+arg_0], |- Y3 P6 A9 j* y n/ w, H
- .text:00401166 test edi, edi" C2 k" W( k" b# O5 n' F$ W0 ~
- .text:00401168 mov esi, ecx
+ ?3 E3 L+ D, q5 a Y# _% ]1 t, ^ - .text:0040116A jz short loc_4011CA
* {; r6 _* T. ~; o$ P" U) Y: A. K - .text:0040116C mov eax, [esi]0 ~* m! @% a, q2 G& q
- .text:0040116E cmp edi, eax
4 l: |1 j- ~8 }3 y - .text:00401170 jz short loc_4011CA
# n' y$ W; C7 Q `' H% b - .text:00401172 cmp byte ptr [edi], 0
! z% H0 o7 t) q' Z1 d: [- d2 H - .text:00401175 jnz short loc_4011A2( o* D* l V% z# W/ u7 e! p; M3 {
- .text:00401177 test eax, eax9 }+ y: Q: V7 L% H
- .text:00401179 mov dword ptr [esi+4], 1
8 T x4 W# M" y) ~; Z, x) a0 g- I - .text:00401180 jz short loc_40118B; K& ?, @: p/ s0 c- q
- .text:00401182 push eax ; void *; ^3 P* |6 w( J; @8 `: j* ]
- .text:00401183 call ??_V@YAXPAX@Z ; operator delete[](void *)( E3 Q& @, q. r H0 {
- .text:00401188 add esp, 48 r5 u& k) k$ U$ ?3 b6 H
- .text:0040118B
' {* d7 f6 R7 E9 f% I - .text:0040118B loc_40118B: ; CODE XREF: sub_401160+20↑j
2 |3 Z+ J" o2 v7 P3 ^4 N/ A* S - .text:0040118B push 6 ; Size2 `7 j7 A! p8 X+ D! l, F9 A* c
- .text:0040118D call j_??2@YAPAXI@Z ; operator new(uint)
, l8 k" d+ m7 |! M- b - .text:00401192 add esp, 4) B0 B J w5 z/ }
- .text:00401195 mov [esi], eax
5 _8 |) T$ J3 A5 E - .text:00401197 pop edi
4 c: U# a. E$ j - .text:00401198 mov dword ptr [eax], 0
7 X7 W2 a$ a4 W4 U( p - .text:0040119E pop esi& \# C6 ?( G' n; U
- .text:0040119F retn 40 q4 ?2 d9 N& X" L" J$ [5 S
- .text:004011A2 ; ---------------------------------------------------------------------------
& D1 o0 }0 p) v+ g9 [1 X( { - .text:004011A2
" r+ y4 t$ ~& H& J* q. D - .text:004011A2 loc_4011A2: ; CODE XREF: sub_401160+15↑j3 d Q. t2 {1 o( S
- .text:004011A2 mov eax, edi
* Y/ W: ]) {/ v" H - .text:004011A4 lea edx, [eax+1]) S# i/ V8 t( t5 C$ T
- .text:004011A75 I/ G! D9 }* S# l3 `+ v5 `
- .text:004011A7 loc_4011A7: ; CODE XREF: sub_401160+4C↓j# O. \" J. S+ J ?
- .text:004011A7 mov cl, [eax]# l" h9 U5 W; I5 E
- .text:004011A9 inc eax
; U8 s1 s" a# S0 H5 W! E6 w - .text:004011AA test cl, cl, H& `9 s5 A& N3 c; f$ f8 w1 i
- .text:004011AC jnz short loc_4011A7
& V ^$ C4 r- M3 y+ N - .text:004011AE sub eax, edx
- ?2 P5 a4 M r" e0 ^+ h - .text:004011B0 push eax
2 C2 H h) k- O1 r* Y) Y - .text:004011B1 mov ecx, esi
. t+ O% `, P# H/ J - .text:004011B3 call sub_401030' ]; v5 {# w' o/ X) c A
- .text:004011B8 mov edx, [esi]% Z8 }; E# U8 r# P5 F) A2 p2 {3 J
- .text:004011BA mov ecx, edi
# n: D7 X6 Q6 s, A/ U - .text:004011BC lea esp, [esp+0]
8 @) j7 ~* }2 o0 ?3 ^: C% q - .text:004011C0
/ q( Z& P' o! z' ~3 a# j& k - .text:004011C0 loc_4011C0: ; CODE XREF: sub_401160+68↓j
/ s4 ~& O/ x$ I- F( ~" u! |$ G - .text:004011C0 mov al, [ecx]( ], G8 i0 l7 T- L
- .text:004011C2 inc ecx( t, m1 x7 m. h- [
- .text:004011C3 mov [edx], al
# y3 ]( n1 x" b% ]' L - .text:004011C5 inc edx: B b: b0 _6 h @1 ]) y" K7 v
- .text:004011C6 test al, al
% }5 e- S2 Q) U - .text:004011C8 jnz short loc_4011C06 i6 J I) }# b2 Q& E2 B
- .text:004011CA
) E" j( h; N9 s, v; [2 D& } - .text:004011CA loc_4011CA: ; CODE XREF: sub_401160+A↑j" c, K9 R: \& X9 R$ p
- .text:004011CA ; sub_401160+10↑j$ }/ [( b8 @8 [
- .text:004011CA pop edi7 Y. T8 r: |, _/ p
- .text:004011CB pop esi
) g0 @2 T9 q: z k9 M - .text:004011CC retn 4
8 _0 Y" f" v6 k8 U2 o) s# r* [ - .text:004011CC sub_401160 endp
7 r( j5 [: z' F, \: D* p9 F% k - .text:004011CC
9 p+ F4 l" }$ F9 _; ?6 U - .text:004011CC ; ---------------------------------------------------------------------------
复制代码 ; E% q$ U' x M$ Z# P
; N* s3 N3 U! X. x ?. m' H
2 T$ P4 t4 {, X |