本帖最后由 shane007 于 2023-8-27 13:23 编辑
$ D4 X9 R. l) y4 v- n5 l( \1 P
/ E( u7 B; {+ S" {本游戏采用了CEGUI,该组件能采用directx和opengl。
& |+ \2 a( r* m经过我的小方块测试,游戏屏幕显示了小方块,因此确认是directx9的游戏。6 q7 B8 l- X. D) X/ ]* s
游戏自带一个EngineSetup.exe程序,设置为窗口模式后就能用cheatengine调式。
4 c) Q! A# ]) Z j- A! E0 `(由于游戏窗口较大,我将游戏屏幕和cheatengine分别显示到2个显示器上即可。)3 \" D5 ?% L5 @5 W4 C6 d
`0 g! Q/ y! ~. H! ^* l1 x' c
8 ?: }" a4 ^$ x/ k2 e6 y7 }- t3 g在游戏中找一个字幕,在以下地方断下。4 i0 O& \' f1 |. g
由于该游戏基本都是显示在屏幕固定位置(上或者下,居中),: H% j' k4 e, @9 e+ m+ w, X" ~% n
因此暂时认为此处就是游戏的字幕函数,该函数被20处左右地方调用。- z& a. Z/ o! s' Z) u
4 x/ U& Y3 v0 G5 N( o- NextLife.exe+11C5 - 42 - inc edx
2 `( L2 c. J5 ~( v; K0 B J1 Y - 004011C5
复制代码
4 Q/ c$ M3 F+ M, L5 r" ]0 h
( l* b- }2 N2 t该地方的伪代码
; p- W+ D0 A& u5 E- void __thiscall sub_401160(char **this, const char *a2)
$ M' f2 Q/ [: f5 w5 U5 Y2 m - {
3 X6 l( T7 Q! U3 g! o$ `) u% E - char **v2; // esi
5 K5 @, r7 \" a. `5 j - char *v3; // eax, d5 F n( \( k4 s, S8 s
- char *v4; // eax3 P/ j' E- e: ]# I5 j
- : Z3 }2 q4 s% k( r; \+ B
- v2 = this;9 Y' m x- i. @* i6 U- x
- if ( a2 )
1 z& A S! `4 S3 F) _ - {
G: O5 j) K4 W' V- C - v3 = *this;8 Z6 p( I8 ~7 g' e
- if ( a2 != *this )
4 t/ ?' L6 Z6 ]: V: D2 h - {% L* B- v1 M+ Q- r
- if ( *a2 )& K [1 A v5 t7 p
- {$ O$ x0 G( v9 j1 R1 i8 K! o! u
- sub_401030(strlen(a2));+ J3 e, z5 T; F8 }5 k
- strcpy(*v2, a2);; p- l) o: v- W8 b
- }0 R7 n* ^- f& O M6 x
- else
# Y/ f" Z- d. E2 T. { - {
4 |8 v/ V( d0 N - this[1] = (char *)1;: Z+ M& r, }! Y" {9 p: O0 h
- if ( v3 )9 b2 D1 z0 G0 e* X7 O2 u/ y+ Q+ Y( p" \
- operator delete[](v3);+ \; ^, ?$ T+ C1 g% m
- v4 = (char *)operator new(6u);' S3 w$ H, k, h: H$ M
- *v2 = v4;
, e- X4 R2 `) ?) _7 i# X) c/ ` - *(_DWORD *)v4 = 0;& ?$ e; z: Q; z/ i' l) x" a0 d F: r
- }
3 H, l7 Z# Y. Y0 b& Z# p8 y; M; K - }
* D" y" r# ~- B" H# b0 m6 a& [" X) y - }
5 t. l; _3 @# Z7 A - }
复制代码 8 d; N0 q4 q( ^; B
汇编代码
4 I( U$ ?& p x% X+ x: I- .text:004010F03 Y/ [5 l. F$ [/ c7 e9 R% D; i
- .text:004010F0 ; =============== S U B R O U T I N E =======================================
- \- i* R( }, w. J5 _, L+ H7 n p - .text:004010F0& A; o# F5 `! P- i5 i* y6 [
- .text:004010F0; x* J( O1 S5 v( [- j9 p; F
- .text:004010F0 sub_4010F0 proc near ; CODE XREF: _main+139↓p- S1 e( d) q0 @& A
- .text:004010F0 ; sub_403240+97E↓p ...2 a2 o4 ? \/ ?* {4 f& W; W
- .text:004010F0
8 o. a+ n. ~% p5 ~ - .text:004010F0 arg_0 = dword ptr 49 X" V/ _5 Q& x) e
- .text:004010F0
2 \# |: v/ s! [( r E0 a - .text:004010F0 mov eax, [ecx]' j: [, B' u" {( j3 R! X
- .text:004010F2 test eax, eax
: H9 z* F/ n0 b9 c - .text:004010F4 mov edx, [esp+arg_0]2 ~/ ]. \8 p) M
- .text:004010F8 jz short loc_401147
- R4 O x$ ^% ` U2 @( J - .text:004010FA test edx, edx6 J1 c& [7 W) V; K( |+ c1 s
- .text:004010FC jz short loc_401147
# N- d& M# B: e% m" b3 R - .text:004010FE mov cl, [eax]
. B6 f3 d5 }4 g7 r) j2 ~ - .text:00401100 test cl, cl5 k" z/ ~* ~5 |. M \( K5 W
- .text:00401102 jnz short loc_401116
, X3 j0 R, y, w" J8 I - .text:00401104 cmp byte ptr [edx], 0
6 k8 B; K( I, x/ q - .text:00401107 setz al
! l8 t& B$ R9 _* k5 }* _ - .text:0040110A xor edx, edx$ K1 A0 O! t- r; G: D
- .text:0040110C test al, al4 A4 W! T! I) z2 Z- g
- .text:0040110E setz dl7 y1 c6 T) ], j
- .text:00401111 mov al, dl
9 L7 t5 k% N" j$ g - .text:00401113 retn 48 k2 g6 a( h( [6 f- M& u" `) O+ ?: S
- .text:00401116 ; ---------------------------------------------------------------------------& B. e! i3 e: G/ p7 Y) h: y
- .text:00401116
) t0 m9 g, }' U; h' Y- F* k - .text:00401116 loc_401116: ; CODE XREF: sub_4010F0+12↑j |$ Z' L3 h6 p
- .text:00401116 cmp byte ptr [edx], 0) j- a4 x J9 i$ [
- .text:00401119 jz short loc_401147
. @ D ~9 @4 Q1 }# a3 x - .text:0040111B jmp short loc_401120) K5 o8 m: r) g# W
- .text:0040111B ; ---------------------------------------------------------------------------$ f% q$ D" o; @9 e& M
- .text:0040111D align 10h: ^$ P1 s p4 d! N- R' I, V
- .text:00401120$ t3 u. r& ? i8 B3 T( |: l
- .text:00401120 loc_401120: ; CODE XREF: sub_4010F0+2B↑j
" j" t1 f8 B- r/ m3 R# N6 M - .text:00401120 ; sub_4010F0+3B↓j2 m+ h+ F' |/ S) B% N! e5 f* _; s8 \/ Q
- .text:00401120 cmp cl, [edx]
) W5 _. B/ `% V+ v4 x4 z; Q - .text:00401122 jnz short loc_40112D
: j: L, I+ Y# I$ @; L- d - .text:00401124 mov cl, [eax+1]
) g9 `8 \( e, O5 k9 O* { - .text:00401127 inc eax; D) ?; G' w* ^2 m6 H2 f( R% F3 T
- .text:00401128 inc edx. y9 V5 z, ]& w3 a @/ H
- .text:00401129 test cl, cl+ c/ F( O8 P6 y! `7 G* u$ P
- .text:0040112B jnz short loc_4011205 ?* i+ \4 `! w; [' c* p! c
- .text:0040112D! g7 B+ p0 o0 H4 p) m, r: x
- .text:0040112D loc_40112D: ; CODE XREF: sub_4010F0+32↑j
! {% ]" e' f- g" }7 l - .text:0040112D movzx eax, byte ptr [eax]" A j; z* D. M# D& E
- .text:00401130 movzx ecx, byte ptr [edx]
( |# v; L) X& S8 i - .text:00401133 sub eax, ecx8 d7 A( g( [0 U5 @$ p1 X6 J! q1 U9 L
- .text:00401135 neg eax9 M. h, U0 C( S5 ~# N
- .text:00401137 sbb al, al6 ^: m- }. K1 ^ w& k" z
- .text:00401139 inc al
% C. ]& t( w( y, ]/ b - .text:0040113B xor edx, edx
7 y/ z3 T' J* ]5 ~4 ]1 Z3 |, g, Z - .text:0040113D test al, al) ?$ }" X' ~7 }" z/ M1 f
- .text:0040113F setz dl
' e: F f9 i5 c" a3 }5 V - .text:00401142 mov al, dl
; i) v5 l4 B, w - .text:00401144 retn 4
8 {2 v# ]2 @$ r7 N+ R - .text:00401147 ; ---------------------------------------------------------------------------
# U( L8 n: d8 ]% @1 V0 e - .text:00401147
6 p( v' ?! g* |; n. I - .text:00401147 loc_401147: ; CODE XREF: sub_4010F0+8↑j
3 q( w. ]6 ^; f/ M5 K( p" ` - .text:00401147 ; sub_4010F0+C↑j ...
- S2 F, t& `. ]- M* p - .text:00401147 xor al, al+ p7 z' W. X" X) U; D" D$ c1 G+ G
- .text:00401149 xor edx, edx
; \4 r5 z5 s1 k y u7 F - .text:0040114B test al, al
) w* Q4 X- H. _ - .text:0040114D setz dl4 L/ r, O7 g2 X5 t! }! z: L4 C' }
- .text:00401150 mov al, dl, `# u+ r! _- B6 U- Y
- .text:00401152 retn 4
8 [! c; P+ ]8 E. k N - .text:00401152 sub_4010F0 endp
! i2 Y- k3 r1 R8 ~ - .text:00401152
7 G6 z! q; j; E - .text:00401152 ; ---------------------------------------------------------------------------
7 S O3 H, ? _3 M& H - .text:00401155 align 10h
( c# D8 k+ ]4 ?: H% E - .text:004011609 Y4 d+ v4 n$ W5 R9 O) f
- .text:00401160 ; =============== S U B R O U T I N E =======================================! s+ t6 W6 A% j3 t
- .text:00401160
5 V9 I5 }$ {5 I$ m( |9 Z& \% T$ k - .text:00401160& Q* |' @' R: c% n
- .text:00401160 sub_401160 proc near ; CODE XREF: sub_4013D0+15↓p: {- `3 Y; m9 ^
- .text:00401160 ; sub_4013F0+C↓p ...
6 }7 L, Z$ f6 S - .text:004011607 S% ^" @$ p/ J1 U2 R# s6 J' O
- .text:00401160 arg_0 = dword ptr 4
5 ~$ X6 e4 M' g' B2 {- D3 L - .text:00401160
' B( d) h4 h. @ - .text:00401160 push esi
0 K$ B+ i# T% m9 B9 J+ C - .text:00401161 push edi
' m4 [' b# `: f% g+ H0 l- Q9 A+ o0 I6 v - .text:00401162 mov edi, [esp+8+arg_0]
# ?3 u$ [" K8 u6 w9 o - .text:00401166 test edi, edi
# B6 F* g" D4 H& ~+ G - .text:00401168 mov esi, ecx
, x8 T' K3 x4 ^# O$ V) Y4 C - .text:0040116A jz short loc_4011CA
4 B- |/ \, R! q+ e% f0 r; b - .text:0040116C mov eax, [esi]. H5 n: b5 A$ e$ U# k
- .text:0040116E cmp edi, eax
: i* T1 U* q3 i. ?/ Z4 \+ [ - .text:00401170 jz short loc_4011CA
4 t4 _9 {/ N$ D8 Q& u! S! |9 K - .text:00401172 cmp byte ptr [edi], 0
7 a5 G2 x! [, K - .text:00401175 jnz short loc_4011A2, f! }( X4 u, e6 q1 Z5 f' x& s
- .text:00401177 test eax, eax
% G0 c8 h6 I6 A5 w - .text:00401179 mov dword ptr [esi+4], 1
0 e+ V3 w6 `( |0 E! V - .text:00401180 jz short loc_40118B* {( i$ l" t6 e1 t1 |1 Z2 n
- .text:00401182 push eax ; void *3 x \2 D5 F9 H7 u: K7 T1 ^- ?
- .text:00401183 call ??_V@YAXPAX@Z ; operator delete[](void *); N' Z3 `" q& N2 Y9 `5 l" j' d2 A
- .text:00401188 add esp, 43 H! ^# U0 [5 Q( t2 n, B/ q
- .text:0040118B
8 _. z% k3 V9 o - .text:0040118B loc_40118B: ; CODE XREF: sub_401160+20↑j
6 `& e" P8 O0 ?+ N8 ? - .text:0040118B push 6 ; Size3 ?0 k7 f. q8 H9 j0 R
- .text:0040118D call j_??2@YAPAXI@Z ; operator new(uint)) u7 k w; k& g$ U4 O% c4 y" ~* |9 H e
- .text:00401192 add esp, 4
6 ?* v+ L6 C8 g8 d - .text:00401195 mov [esi], eax
; N; z, M5 k( J* f5 x - .text:00401197 pop edi
6 V& r7 e! C" I2 V - .text:00401198 mov dword ptr [eax], 0 k% x0 E+ I4 r; x1 t
- .text:0040119E pop esi
% {! ~0 i+ D$ V3 q( ^$ C( T - .text:0040119F retn 4: J( u6 N+ M3 \' x( V6 ~7 v l u
- .text:004011A2 ; ---------------------------------------------------------------------------
) F( ]3 o9 A5 {) A j) G, b - .text:004011A2
! m' v$ E1 M- ~6 | - .text:004011A2 loc_4011A2: ; CODE XREF: sub_401160+15↑j; c4 p" G _8 S
- .text:004011A2 mov eax, edi6 h1 i9 |5 V1 R. S) w& _
- .text:004011A4 lea edx, [eax+1]
8 \3 n: b4 }- O, [5 c - .text:004011A7
. @6 F0 X( T$ h" j9 a - .text:004011A7 loc_4011A7: ; CODE XREF: sub_401160+4C↓j
6 u% h) r. P9 G4 j - .text:004011A7 mov cl, [eax]
/ @( J5 R: Z# S3 J4 o - .text:004011A9 inc eax
6 Q% n! x+ U4 O - .text:004011AA test cl, cl
0 q$ u+ p$ o) o& T- n - .text:004011AC jnz short loc_4011A7
! G. K) ]: u4 w: Q - .text:004011AE sub eax, edx
% k- L; `& b$ H2 p9 p - .text:004011B0 push eax, X, Q# ]9 S) Z7 n% N
- .text:004011B1 mov ecx, esi
! L3 f7 V: K* g2 K, @7 U - .text:004011B3 call sub_401030- Z: u- u% H7 c1 j
- .text:004011B8 mov edx, [esi]
# ~& ^# _1 [+ E! J; l. p3 D - .text:004011BA mov ecx, edi2 L7 g% L: r, b* F# {
- .text:004011BC lea esp, [esp+0]
6 {% O0 C+ p# O& ^$ L; F$ a p: } v - .text:004011C00 _8 L' r3 {4 o3 g4 U
- .text:004011C0 loc_4011C0: ; CODE XREF: sub_401160+68↓j
. j [+ }; N I: k7 w7 ? - .text:004011C0 mov al, [ecx]
6 F6 D: Z1 |* b6 p* X: m - .text:004011C2 inc ecx& R) a0 A P, ?0 n( D4 z9 ]% N9 ]+ A
- .text:004011C3 mov [edx], al8 v" p x9 d; a+ ~/ a1 H3 ~- l
- .text:004011C5 inc edx: H8 Z+ J. [ {
- .text:004011C6 test al, al
: H q% G8 U( C6 u' W. a3 N - .text:004011C8 jnz short loc_4011C0
2 v5 @2 K3 F4 b; ]$ D' t - .text:004011CA
$ D, e# j! ~8 k+ j+ o, v, e - .text:004011CA loc_4011CA: ; CODE XREF: sub_401160+A↑j: U1 ^! N7 c, w- x1 U& ^# e
- .text:004011CA ; sub_401160+10↑j2 @& s" I& b8 A1 x
- .text:004011CA pop edi
$ O6 x, K: u7 u- w, X. u - .text:004011CB pop esi
! M4 r0 t0 K; d1 ^ - .text:004011CC retn 4) f# l4 f8 }. S$ M
- .text:004011CC sub_401160 endp' E' V) @& x& f5 ?: |
- .text:004011CC1 L5 S, X) O, A. R
- .text:004011CC ; ---------------------------------------------------------------------------
复制代码
2 L; A1 z- C9 k. b8 `5 B1 z1 ]0 R
' ]5 a7 B" h$ R5 B
* B3 u6 y; C! m: g/ P |