本帖最后由 shane007 于 2023-9-5 15:50 编辑 : [4 w3 A, T6 f& p7 y1 x
, ^8 B- N! K9 Q) r! {9 B& NglCallLists的调用处,共有三处。
) Q# ^. o4 H' Z4 i此三处估计是对应游戏中三类不同的字幕。
( ~% m8 X; U% l2 o4 @接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。/ Q$ U0 A( O: P G* x- x5 f. I
分析的文件名,748 KB (765,952 字节)% {1 |1 d2 ~ N2 ?: o+ O
toh.exe4 Q" g) {) c9 `2 s
- `9 T7 r- l) L) m1 S
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
1 |( c/ T; v( V: @等日后再仔细研究,看显示函数究竟在哪里。
0 X" e; U8 [) R. g# ~# U: K) D9 z i
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
( _! U+ |: A' k. s004316C8
2 N: Z' k* c$ b {# l! K
, ~8 J+ B: k: _) o% e+ z5 B第1处 {$ J# c8 [( X# L
- void sub_4519B8(char *a1, ...)
M5 W$ D4 d* E' z9 h, {5 a - {. G' H( T! b( d
- GLsizei v1; // eax9 R' g0 Q+ J( t/ S! [ y
- char lists; // [esp+4h] [ebp-800h]
" b+ ^- c7 B4 b1 w! i7 ?5 ] - va_list va; // [esp+810h] [ebp+Ch]
* M# x& A M% l7 B
: o6 S6 u2 `1 }5 g) n- H. V! y$ `- va_start(va, a1);
* m5 W' _: x K6 D( q1 W - if ( a1 )
& I* F) h) E1 l+ Q - {
R; m9 w& L& N/ n1 t - vsprintf(&lists, a1, va); c' K' ~9 \7 l% s/ d! Y0 \$ f
- glPushAttrib(0x20000u);; q3 i `1 a5 ~7 l
- glListBase(base);! ^3 K$ Z5 ?2 a' e u. c
- v1 = strlen(&lists);
* \7 K( \+ Q r# s- u8 v - glCallLists(v1, 0x1401u, &lists);! S8 y! d& I) z) r5 J
- glPopAttrib();
* k, u4 E8 t R2 ~) f - }( \$ P5 V3 i7 p1 F( {) m
- }
复制代码 % R/ B6 ~8 `% M5 I1 I5 F6 h! B
第2处
, \( [; Y4 d& d9 _- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
$ s( k, p3 z0 ?2 x! y) D5 n - {7 a3 L& U% D8 p! `1 N2 q
- int v4; // eax
, N# J" p: ~* M6 _7 o - GLsizei v5; // eax7 n* K4 j& O) T0 U: s
- char lists; // [esp+4h] [ebp-800h]
' O: E# E( Z' D% z - va_list va; // [esp+81Ch] [ebp+18h]
1 `2 X u0 O8 n - , K: L+ n% i& Q, L6 i+ x; j. {7 g. ^* t
- va_start(va, a4);
9 C" i& v" {7 K% N - if ( a4 ), B7 @& W7 t8 n6 m
- {7 Y8 {7 o* O2 ?2 k9 `
- sub_44FDD0(a3);0 t8 J5 v1 L, z& v; E7 y( ]; R
- v4 = sub_40BB44();
- |; M7 C# t4 a - glRasterPos2i(x, v4 - a2);
D1 ?# |. m- P* G - vsprintf(&lists, a4, va);' t' o- a9 X9 e, Y5 v. j. M
- glPushAttrib(0x20000u);5 [! I0 ?1 n2 }1 G
- glListBase(base);+ q* V, a2 N0 @/ T' w6 u
- v5 = strlen(&lists);
3 c! y! [# I0 z5 C$ S - glCallLists(v5, 0x1401u, &lists);
7 ]4 S* h+ J+ k9 j r- {/ T - glPopAttrib();+ S x# x: }8 ~7 j) Y3 ?5 N. K
- }
. S8 N. N$ I- F) R; r - }
复制代码 / ]. m j( E& E l; d
; ?8 y: N% j0 p; P2 `5 s9 R
: I! h4 _. k4 L$ d% b, w
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)1 p w3 ]" s7 F% g- p' r
- {
" e1 o' a4 ]4 m# c - GLvoid *v7; // ST08_40 Y1 B$ W0 k8 k6 }; a$ m, D
- GLsizei v8; // eax
8 ]$ v t0 ]" E: m0 u - int v9; // [esp+0h] [ebp-1018h]
- H: z, ^+ i+ N6 j2 B) b - char v10; // [esp+8h] [ebp-1010h]
4 o) ?5 s5 ~! c8 m8 g; x" ~ - GLvoid *lists; // [esp+100Ch] [ebp-Ch]
$ U( z, Z; k' U( y3 G8 { - char v12[5]; // [esp+1013h] [ebp-5h]4 P% ]7 n' Z0 ~; i. M
- va_list va; // [esp+103Ch] [ebp+24h]- e* R% q# I, b/ k
- " h" m2 k" h# \3 H9 g/ Q; F! G
- va_start(va, a7);
4 Y* A1 F! g) |5 l; n1 ] - v9 = 1;
% z n; Z4 e4 e: N5 i" _ - if ( a7 )" I! c& S. L a
- {
2 c5 n P& G% N! N - vsprintf(&v10, a7, va);
; _+ p+ k, I; E% D - glPushAttrib(0x20000u);, Q. Q! k; A' i' ]" W7 c
- glListBase(base);
2 P, ]% e1 L7 P - lists = &v10;
% i7 V, x0 H+ e4 t+ R/ ~ - do
9 D8 E% ]7 y8 V [; X/ n - {( E# C6 t* k% K
- *(_DWORD *)&v12[1] = lists;+ e: f* @& Y# G" K/ q f
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )4 L' [5 f% q/ I3 d1 n4 ?2 u
- ++*(_DWORD *)&v12[1];
6 n7 |; }' ~ }9 b ~& N' p - v12[0] = **(_BYTE **)&v12[1];: v# R3 z/ E1 E9 P$ C4 R
- **(_BYTE **)&v12[1] = 0;6 q$ I a0 `& _- Y1 _) z6 u
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
& k* y0 {. M4 p5 N0 h0 S* u0 ^+ p - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;. r7 x3 w1 ?' r6 W
- y -= a5;7 L) Z) R" f, ], k) V
- glRasterPos2i(*(_DWORD *)a4 + a1, y);
) L( [# X2 k% d - v7 = lists;
a0 j- K: {- R+ N# D - v8 = strlen((const char *)lists);
# U) `) `; f- ?8 W - glCallLists(v8, 0x1401u, v7);8 @$ m# J- U) _: T2 N
- if ( v9 < a3 )$ p% x, l& i, E1 A0 I
- a4 += 4;1 _: r$ }9 r& L6 e& X ]
- ++v9;
: E5 W; M' d1 f' _" v - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);$ U( }8 x& R1 G9 m9 }/ i& k
- }$ v& O& q2 i3 m( J# x
- while ( v12[0] );
5 K( I, R' G1 }/ W7 V3 |, S - glPopAttrib(); `. _& f1 j# J& T% F
- }
; k5 V6 `: t/ f3 b1 i - }
复制代码
N3 O W0 ^/ u* v. A6 V6 a/ s6 z6 k* V8 M
) v9 S! D6 f8 k. X( Q" M9 c l# z% D3 {
0 t6 a* y0 {: v! o$ p- J! a& {3 G5 e& N8 B8 }
u% n: P) H( f$ x' r: g
% f! Z& g6 a* T. v0 K' q. f |