本帖最后由 shane007 于 2023-8-27 13:23 编辑 % S* a( j% k3 V8 k) B- t5 }: _
) C d, e6 ^7 u- x. X& Y本游戏采用了CEGUI,该组件能采用directx和opengl。" {8 W( I. g( P5 M# u2 f
经过我的小方块测试,游戏屏幕显示了小方块,因此确认是directx9的游戏。% H V8 g8 J0 y$ F! q; G) g
游戏自带一个EngineSetup.exe程序,设置为窗口模式后就能用cheatengine调式。8 m" _: ^" p5 o- @+ [+ q
(由于游戏窗口较大,我将游戏屏幕和cheatengine分别显示到2个显示器上即可。)
. L, m+ a6 C6 x" N( v# f r
3 w3 C8 Z% r9 l( h- S
) Q0 [2 F+ L2 n# C1 ~- m在游戏中找一个字幕,在以下地方断下。6 |$ k5 _/ @) P# b* ?. {' U
由于该游戏基本都是显示在屏幕固定位置(上或者下,居中),
( h1 u& X6 p6 |9 Q因此暂时认为此处就是游戏的字幕函数,该函数被20处左右地方调用。
! Z" u1 P2 ^ ]8 ~: [7 k
: e! e$ c! x8 i/ z* _) V% B- NextLife.exe+11C5 - 42 - inc edx
z4 I( K4 V* h5 @ - 004011C5
复制代码
( n/ T$ Q! E( Q k0 A4 G O5 B
该地方的伪代码
+ w+ S; t" }. ]2 P- void __thiscall sub_401160(char **this, const char *a2)* ]1 Z# p# }. v# v
- {
5 Q2 K S1 ]" Y) J/ f - char **v2; // esi4 ` W2 l% o/ S5 z3 Q; \; {
- char *v3; // eax' X Z# A2 l8 }& Q
- char *v4; // eax
2 i$ h6 U) F: l r9 C2 H
* j2 T2 @2 v" f) W9 k4 \- v2 = this;
+ ?/ P) r1 p) s& D8 f& a - if ( a2 )# i2 u& }' N4 Y
- {4 Y0 ~. l3 P' N
- v3 = *this;. I: W% \; x5 J2 ^
- if ( a2 != *this )9 e- z/ I1 n$ l/ G `- K
- {6 t9 S5 C9 i M4 x" |
- if ( *a2 )
8 k$ T9 S7 ?8 p# x* o, K' t - {6 r4 I, q* Z1 c! f; n
- sub_401030(strlen(a2));! Q! p5 e5 i; y8 v& L: E7 H
- strcpy(*v2, a2);
5 n: `: u2 R' {; o/ y! u' ^ - }
. ~5 C; o+ d' M, ~$ e - else6 K. U. U3 A5 F4 `7 @# B
- {
; d" [ c" r/ x" E- w- n - this[1] = (char *)1;
) \0 k3 T# U, E - if ( v3 )2 F6 n# |+ o' Y; i/ @& S2 Z4 S- z
- operator delete[](v3);
4 [, l- t8 C7 x* Q/ \0 e/ f - v4 = (char *)operator new(6u);
9 w4 k+ U0 y* V i - *v2 = v4; X" ]7 I" |, x% M
- *(_DWORD *)v4 = 0;
- I( P4 I& s$ B - }
/ N% e% t% j5 f9 h8 O - }
- x# i' U, R8 H - }
- l! R$ g6 z" z* { - }
复制代码 4 S& }7 I$ Z) n2 ~; s- E$ k6 S' F( P
汇编代码# G1 ?( U& R% l/ u9 c$ ]+ B
- .text:004010F0* h- D4 h+ @& Q6 ?! V9 v2 M
- .text:004010F0 ; =============== S U B R O U T I N E =======================================) G p3 }' H6 J$ q. k! @
- .text:004010F0$ M; x0 Z0 o. r; d
- .text:004010F0* n j. D, l) K: z
- .text:004010F0 sub_4010F0 proc near ; CODE XREF: _main+139↓p
3 G* L2 b A* K6 S( [ - .text:004010F0 ; sub_403240+97E↓p ...
) L4 j4 X/ q1 C) y5 s' X! f. ] - .text:004010F0$ a$ t: d- `% N0 L
- .text:004010F0 arg_0 = dword ptr 48 {! Q3 G. Q7 m
- .text:004010F0+ ]! L9 I/ X! P0 S& A9 Z! D$ p& N
- .text:004010F0 mov eax, [ecx]
( S6 s( W4 p" n" z - .text:004010F2 test eax, eax/ N: N' Q, I) A3 Q
- .text:004010F4 mov edx, [esp+arg_0]
& R4 `9 a: e* P# H% V - .text:004010F8 jz short loc_401147
4 _* f1 S4 i+ J% p9 R8 Y7 L# ` - .text:004010FA test edx, edx
* p3 N; i! T0 P+ W - .text:004010FC jz short loc_401147 K) d4 {! r, n
- .text:004010FE mov cl, [eax]& a; l9 ?; f. M0 P
- .text:00401100 test cl, cl
( Q# v U& O! R& h3 f: p) \+ l - .text:00401102 jnz short loc_401116
5 J& _/ ?1 j$ @1 q4 w$ H h - .text:00401104 cmp byte ptr [edx], 08 T4 h$ W! E' a! P N# L
- .text:00401107 setz al* X n( H, }; @& P9 _
- .text:0040110A xor edx, edx
' V% V4 a" \, V - .text:0040110C test al, al
" ?+ _' C* u! H5 t2 r6 k @ - .text:0040110E setz dl
0 x* e7 s- D; }( ~, ~+ m - .text:00401111 mov al, dl
9 c6 H8 N) w0 q/ M5 a0 k- e Z - .text:00401113 retn 42 h6 h* W7 ^$ A' B+ P# T
- .text:00401116 ; ---------------------------------------------------------------------------
2 L9 e A; u" @8 M' l# ~" C4 Y - .text:00401116- b, O( w- |: R- W7 Z
- .text:00401116 loc_401116: ; CODE XREF: sub_4010F0+12↑j; |* N( {7 V4 Y: \ B
- .text:00401116 cmp byte ptr [edx], 0
$ X6 Y* ?! m7 g' U' U - .text:00401119 jz short loc_4011470 `' Y6 S) G* M q
- .text:0040111B jmp short loc_401120
3 T8 q4 b0 u& B# N+ R* U - .text:0040111B ; ---------------------------------------------------------------------------
" n. U- I% q; ~. c2 ^' H$ p - .text:0040111D align 10h- N( y! n s) g: q e
- .text:00401120
- a. U% m4 B$ p - .text:00401120 loc_401120: ; CODE XREF: sub_4010F0+2B↑j) d2 y+ Y. b, t7 a% K/ E
- .text:00401120 ; sub_4010F0+3B↓j3 I# l$ o4 T- f& @8 v
- .text:00401120 cmp cl, [edx]; W1 x' z% W- O# [ g& I
- .text:00401122 jnz short loc_40112D
* r2 G% @$ I3 Q" G7 o - .text:00401124 mov cl, [eax+1]
0 O! f, J, ]" c - .text:00401127 inc eax+ s# k/ V4 L1 q1 f5 ^
- .text:00401128 inc edx& \ g: |8 m! b c
- .text:00401129 test cl, cl
3 ~, B9 J& b0 Q/ t# A) \ - .text:0040112B jnz short loc_401120% o2 {( `7 A b" I- q4 \
- .text:0040112D! e9 Q$ {; H+ r3 n2 @# e
- .text:0040112D loc_40112D: ; CODE XREF: sub_4010F0+32↑j; ~9 Y0 H% X$ R, R7 i: v: h
- .text:0040112D movzx eax, byte ptr [eax]% D, l r+ h6 f0 v, h
- .text:00401130 movzx ecx, byte ptr [edx]( z2 I p2 P, Q0 a/ m
- .text:00401133 sub eax, ecx
. E! B2 Y- N" j6 z# f - .text:00401135 neg eax
9 N6 v1 v2 G* m& J1 L - .text:00401137 sbb al, al
0 W3 J* X4 b0 L" g1 t9 P - .text:00401139 inc al
# }4 g+ ?$ j- B: w - .text:0040113B xor edx, edx
' N$ ~$ X7 X+ Y8 q& h - .text:0040113D test al, al5 |. u ^- Z5 V: ^8 {/ I
- .text:0040113F setz dl
' w3 f! @! l* m: b - .text:00401142 mov al, dl( b9 c) ~# t2 y9 _
- .text:00401144 retn 40 A4 _/ b4 Z- @4 q Y$ I
- .text:00401147 ; ---------------------------------------------------------------------------4 E2 W* V" a9 q/ J# x7 C" W
- .text:00401147
% b/ `7 D9 h% Q8 ?7 s% i - .text:00401147 loc_401147: ; CODE XREF: sub_4010F0+8↑j# u* y) E; u7 A; {/ P% c
- .text:00401147 ; sub_4010F0+C↑j ...2 U! V1 h% N1 \$ e$ Q6 {. x& p. w' m
- .text:00401147 xor al, al
% p4 z& F* K3 n - .text:00401149 xor edx, edx& @# T9 X5 J3 m% }4 y0 j
- .text:0040114B test al, al) b2 y9 S5 d8 y! Q
- .text:0040114D setz dl
9 { w X7 |: C - .text:00401150 mov al, dl. @1 _5 c" h8 n( `
- .text:00401152 retn 4
/ b1 I5 Y3 f% G - .text:00401152 sub_4010F0 endp" N8 m h% v; o! Y) P1 Y
- .text:00401152
# K: a& Y! o8 r6 ^ - .text:00401152 ; ---------------------------------------------------------------------------
" @; U2 z! S2 I' y* _: m5 V, ] - .text:00401155 align 10h, S( u" S& p8 S) d
- .text:00401160
. {5 k) H x4 l' R, j( [! X5 x - .text:00401160 ; =============== S U B R O U T I N E =======================================7 J d" V% W* y6 ?& q) y3 s3 K
- .text:00401160
- o* g, T" f, ]/ G! ^ - .text:004011609 u) N9 K) u: [) x. w9 ?* j
- .text:00401160 sub_401160 proc near ; CODE XREF: sub_4013D0+15↓p) e, M8 F: `& ?! F" D6 g3 ]& }. W
- .text:00401160 ; sub_4013F0+C↓p ...
+ {* S. ?) S$ ^ - .text:00401160
. z0 |1 Q/ k3 M9 {0 F: m4 F) r' o - .text:00401160 arg_0 = dword ptr 4
( _- y) r# l5 }. X0 @, u - .text:00401160
@5 _8 T9 W* z% y2 l: `2 r W - .text:00401160 push esi
) i- y( r$ x' V' t+ |8 \8 ] - .text:00401161 push edi
$ }: P& h: g1 @ d1 Y - .text:00401162 mov edi, [esp+8+arg_0]
/ E# _9 z* Z5 `: z1 h4 N - .text:00401166 test edi, edi
- |' P+ v5 z( j: ?5 f/ k9 |/ o& S - .text:00401168 mov esi, ecx
) {, ^" o9 e# l - .text:0040116A jz short loc_4011CA5 n$ i7 |; V: e. ~
- .text:0040116C mov eax, [esi]7 P" m* y- K" B: V1 e7 h
- .text:0040116E cmp edi, eax. R& o4 S* I7 x! L: ~
- .text:00401170 jz short loc_4011CA. [7 D+ {; ^4 s$ k! V2 s: X4 b' D
- .text:00401172 cmp byte ptr [edi], 0, [% t Q( m) o6 V2 Q6 U% Q
- .text:00401175 jnz short loc_4011A2+ W' z1 w9 O/ |
- .text:00401177 test eax, eax
0 h: A& [8 F6 i0 |4 u& {( d( | - .text:00401179 mov dword ptr [esi+4], 16 X7 I6 b, g7 [% U
- .text:00401180 jz short loc_40118B, l+ r& h# o( ~. B5 ], a
- .text:00401182 push eax ; void *1 t2 O! K# A! z9 ^& _% s4 w
- .text:00401183 call ??_V@YAXPAX@Z ; operator delete[](void *)
1 J/ S) a2 j/ O8 C - .text:00401188 add esp, 4/ W; P( o0 ^! F' v
- .text:0040118B
% ~$ V! x2 I1 t* u" {& n - .text:0040118B loc_40118B: ; CODE XREF: sub_401160+20↑j/ j6 v) V, l$ }4 e9 q3 u
- .text:0040118B push 6 ; Size
( s2 I/ x* X9 @) U2 B; N - .text:0040118D call j_??2@YAPAXI@Z ; operator new(uint) e) v" x7 @& F
- .text:00401192 add esp, 4' E" _1 |2 v; p/ { S
- .text:00401195 mov [esi], eax
! Z4 Z& `+ Z! \9 `9 P - .text:00401197 pop edi
$ K! i ^% a9 O: Q( P5 l - .text:00401198 mov dword ptr [eax], 03 ]4 J/ [3 U0 E3 B( E/ x+ N
- .text:0040119E pop esi% Q4 c$ A8 i$ L! A. A- v" Q
- .text:0040119F retn 4
. W1 E, R% l. P- w% |/ h! l - .text:004011A2 ; ---------------------------------------------------------------------------
5 g$ e1 i! N a) b# C+ t - .text:004011A2
; S3 G3 a' ?/ V" E" p& y: A& L$ G - .text:004011A2 loc_4011A2: ; CODE XREF: sub_401160+15↑j! R4 E3 A9 D- w. R1 W$ i
- .text:004011A2 mov eax, edi
. Z3 O4 v( Z4 s7 T, `' w - .text:004011A4 lea edx, [eax+1]7 v2 x9 Z3 H9 X+ m0 {! }
- .text:004011A7: x- t4 S. R' |
- .text:004011A7 loc_4011A7: ; CODE XREF: sub_401160+4C↓j
* _8 u, I4 z1 {' g! ^8 W2 U - .text:004011A7 mov cl, [eax]
' t# y1 Z' x& n! u - .text:004011A9 inc eax @. t' k, r# X! C
- .text:004011AA test cl, cl
( ?2 G e$ A: y - .text:004011AC jnz short loc_4011A7
: Y2 Q/ k" q9 | - .text:004011AE sub eax, edx
0 F- I- e1 l {- x. H - .text:004011B0 push eax1 m! E1 _1 `* w9 L2 x) X
- .text:004011B1 mov ecx, esi
: y. y+ H1 L: Q0 I5 ]7 j6 [( p - .text:004011B3 call sub_401030
1 ^5 Y* @* \* ~8 b6 | - .text:004011B8 mov edx, [esi]! H. j0 o; N! H+ U- o
- .text:004011BA mov ecx, edi
9 n8 E5 x3 Y: h% C( I$ A$ ?/ n - .text:004011BC lea esp, [esp+0]6 Y: M9 J) a) h7 U
- .text:004011C0- [0 _- k- x) c8 c1 l: w% ^
- .text:004011C0 loc_4011C0: ; CODE XREF: sub_401160+68↓j( N2 k# @( q2 }! T$ M/ i6 e+ h
- .text:004011C0 mov al, [ecx]
# A/ _1 x% P e6 Q; [ - .text:004011C2 inc ecx" D7 m' [) A- U/ P: H
- .text:004011C3 mov [edx], al
" }6 O; @, o/ F1 n- R - .text:004011C5 inc edx
1 Y, [. ?+ h& ]) i# d - .text:004011C6 test al, al) `/ w0 ]: R8 V2 A0 l2 t
- .text:004011C8 jnz short loc_4011C0
3 X$ M4 N9 P7 N - .text:004011CA
0 D# A) |+ o6 E! m& E0 ?9 ?) k - .text:004011CA loc_4011CA: ; CODE XREF: sub_401160+A↑j
8 I6 Q; g7 j! F( z' y! ` - .text:004011CA ; sub_401160+10↑j9 U9 B# h7 X, k# E- Y
- .text:004011CA pop edi: l" `/ O. {+ k/ F4 j
- .text:004011CB pop esi
( F, ^1 f- k; l }# U - .text:004011CC retn 4
7 L/ O1 `/ T* R% {* u- ?% _0 }; Q' ] - .text:004011CC sub_401160 endp
8 R( a7 Y& M* t - .text:004011CC
! N3 i! }6 v5 |3 C - .text:004011CC ; ---------------------------------------------------------------------------
复制代码
' d I! G e8 g. |, B2 i$ a/ W3 ^: _ A8 D8 ]4 S
' j+ d/ Q" y; ? _
|