本帖最后由 shane007 于 2023-9-5 15:50 编辑
; _7 [) {0 c9 p6 E
$ I3 g# Z2 F' Q+ m* i8 fglCallLists的调用处,共有三处。
, o Q% h' Z2 S& h' E T/ {此三处估计是对应游戏中三类不同的字幕。
' Z* C$ G4 w0 m; c9 P接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。: t; u; p" q' G, }" A7 A
分析的文件名,748 KB (765,952 字节)
9 ]3 _' K" A0 u2 I% ztoh.exe6 ~$ g. b$ h, [; m* |$ `5 O
# u! z! j2 s2 a! L$ S- s9 Q经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
' A6 H' D+ u1 @4 F7 }& h等日后再仔细研究,看显示函数究竟在哪里。
8 a! K3 c! v9 d5 H6 t: J( [( ~; S1 p- C* P
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
5 {% w7 C0 i. _# X8 h+ m. l: V004316C8
1 h' P. x* U* z# |% [4 B2 ]# E; [' H) o3 v/ r2 l
第1处. a, C1 f3 U; s9 _% ]) s
- void sub_4519B8(char *a1, ...)
5 e. F+ H" U+ g0 P% @/ ^; P( e - {2 z, C: `% d9 {" B s5 W
- GLsizei v1; // eax$ r9 E4 Z" o# l- J* }
- char lists; // [esp+4h] [ebp-800h]
$ T6 Q8 ]# N( v0 q - va_list va; // [esp+810h] [ebp+Ch]
/ o+ p, t3 M7 q- d
6 q7 ^/ y) K4 n5 t$ ~1 M- va_start(va, a1);
9 `) z* W- ?" Q. r) k3 n+ S d6 T - if ( a1 )) _' A% a! N @) g" k2 s) B5 ^
- { F( I; l! r/ B
- vsprintf(&lists, a1, va);3 M: ^& [0 i9 d t; W. ^
- glPushAttrib(0x20000u);
! h+ Q, R, E0 M* r1 K2 _% _ - glListBase(base);
+ r6 F1 A2 c0 ]8 y0 K - v1 = strlen(&lists);
( ?3 w/ Z. C5 o8 D( ^0 y( q - glCallLists(v1, 0x1401u, &lists);
O1 L3 y9 v( R& u2 _* w/ E9 m - glPopAttrib();
) x7 P! h, ~5 Q - }. M1 G. \+ O m$ I
- }
复制代码 }4 k! B3 X9 _# L+ W
第2处
0 u& q" R8 l1 X+ ~- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
! [1 |9 ]5 @+ o% _ - {
! A, s5 D0 J+ u - int v4; // eax
2 h2 s, l* W+ H" H8 d - GLsizei v5; // eax
4 \& F& \2 s0 O7 _' _3 u - char lists; // [esp+4h] [ebp-800h]8 j( l1 Z$ g' V1 t( Y1 }; S% G
- va_list va; // [esp+81Ch] [ebp+18h]
+ H5 z* Y) {- f+ Y: O$ d3 j
9 |" q* V+ e0 e7 P" |& C4 B- va_start(va, a4);
: l6 K4 m- f! M! O; U - if ( a4 )
) t. u5 T, x- ?/ t. A - {
! v- U4 V, e6 S5 n - sub_44FDD0(a3);* {- y6 ?3 b' i- `
- v4 = sub_40BB44();, b9 L9 r9 U2 X3 U
- glRasterPos2i(x, v4 - a2);
5 R0 t' Y2 G# K0 R - vsprintf(&lists, a4, va);
) K+ W+ Q+ w5 y0 m# H0 n - glPushAttrib(0x20000u);
F" ]# B! F& J5 k, S3 J - glListBase(base);
( R+ E) L! w! I# v) f4 } - v5 = strlen(&lists);
z5 R. y: e4 h4 l. x - glCallLists(v5, 0x1401u, &lists);
$ a% C2 @* M, S; Y4 k - glPopAttrib();& ~2 I5 H8 G$ a" ~
- }( X5 o5 G% ? ]' s9 i( X
- }
复制代码
9 K# t# o8 ^) [( t
; j9 E d* P' g7 q$ p u) @" \" d
6 M Y0 Q2 E( ^; t/ I: u第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
% Y: _; l6 g4 S+ d* Q' L3 z( V# n% ` - {
& i4 j9 y" t+ R; ~3 u. u - GLvoid *v7; // ST08_49 g) o4 H) g T
- GLsizei v8; // eax( x: H5 o) Z+ f: v9 I6 B
- int v9; // [esp+0h] [ebp-1018h]6 H2 k8 c0 u, G+ `4 B+ J8 [
- char v10; // [esp+8h] [ebp-1010h]2 y4 q0 |* Y% k+ \4 {( c
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]% n& ]& R+ E' s ?
- char v12[5]; // [esp+1013h] [ebp-5h]# L; J o( f( B7 ~$ O. J! l% [- H7 I
- va_list va; // [esp+103Ch] [ebp+24h]! C5 H3 u; C: F6 N6 x
- % g8 T6 @5 G) y! v8 ]
- va_start(va, a7);
; e0 A$ k5 A) V - v9 = 1;
0 i3 P* k/ W0 s7 c - if ( a7 )
( ]4 Z" ^& L% o2 \ - {3 u' p: A& T) t4 }# E8 g' t6 C7 a
- vsprintf(&v10, a7, va);
' e2 @4 E, R& ~8 |, r5 {) t0 x - glPushAttrib(0x20000u);
, i$ N z2 ^/ i; ~2 N9 c - glListBase(base);7 o) ^0 y# u4 W8 _; P$ K( k; `
- lists = &v10;
1 u D8 G7 e( {! q" w& ^4 Z; j' Q - do2 `) X3 f# x. f" y; q: V7 u
- {) C H, n4 l" T" f6 C7 [; g
- *(_DWORD *)&v12[1] = lists;$ c3 I6 e. T6 f% E4 `
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 ), W, Q. k4 `8 |/ E6 t' P" \6 z
- ++*(_DWORD *)&v12[1];( S. p8 `9 s+ O9 ~7 i1 f
- v12[0] = **(_BYTE **)&v12[1]; A9 b5 P6 o/ X# c2 u( K. G
- **(_BYTE **)&v12[1] = 0;
+ p% _- p0 \. K n- N( Q, j - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )" A* T5 z0 y) Z; k7 l. k
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
( _; P. Y* [# Q3 R- @0 I6 M ~ - y -= a5;
. @5 e3 Z4 U6 z4 L - glRasterPos2i(*(_DWORD *)a4 + a1, y);
@- o d: U! \* O# m' D0 r - v7 = lists;
& [9 l9 ]$ Q8 ? - v8 = strlen((const char *)lists);. f( R/ x! O, u8 W* Q7 ~
- glCallLists(v8, 0x1401u, v7);4 n% H4 X6 ?- W$ i1 _
- if ( v9 < a3 )
- j9 v7 G, M' X+ ? - a4 += 4;$ m `1 @; H6 S) v+ G8 ?
- ++v9;1 A; k! m7 v9 {5 ~/ n3 Y& }3 r
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);0 A8 s: @1 [& z) x: H
- }- _6 s. L* B2 F* T$ @* |; ?
- while ( v12[0] ); I, M, v+ N$ O* @; P' S Y- R5 ?8 V
- glPopAttrib();
: [$ P( t* F3 x' ]% N2 S! A6 B - }& x: ^/ r1 D# I" |8 H# P: @
- }
复制代码 9 x6 k6 W" K3 ^" D& R. j
0 c8 E4 M& Y6 q! G/ Y! D k8 K2 r; @2 h0 c8 \+ Z
" x4 O) _% {7 a1 P9 U+ @9 G- J/ p5 _/ }4 {4 @3 ?7 @& \5 O
3 @& f- m$ N2 T3 D
8 g* t* h' m, d5 ^2 A
# _9 U& a$ g5 m8 p |