本帖最后由 shane007 于 2023-9-5 15:50 编辑
1 i) b+ K+ U2 C1 O5 F
3 J! X, S% i3 t+ U9 n7 N+ f, RglCallLists的调用处,共有三处。7 j8 I$ I. R& X' W
此三处估计是对应游戏中三类不同的字幕。) A9 j% f1 _) t* _: ^' b: |1 {/ g
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。# M- N# k% y* F4 C1 u
分析的文件名,748 KB (765,952 字节)/ Y* w% t; D3 E+ a+ Z4 i6 W- P
toh.exe7 z. ?5 o4 e% [0 K
+ s9 `3 Z: v$ p \* l; @$ E, T' P' z经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,& f9 y. i/ x. F8 f; z8 U. n
等日后再仔细研究,看显示函数究竟在哪里。( G8 j- Z% [8 N: x- \
, [& F% r X) J7 I) q+ P
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
- ]& R% M7 ^; w2 V004316C84 J& B+ q+ B5 y
# t& T) E4 [4 ^, o+ F+ _+ G第1处
& l6 p. C9 }& l5 z2 [" i- void sub_4519B8(char *a1, ...)
6 R5 |3 l5 G2 v& p - {0 _" D0 l/ L1 D' B
- GLsizei v1; // eax
2 E1 e1 U6 n7 ^0 ]% ]( f - char lists; // [esp+4h] [ebp-800h]
& f! x) n2 T' E6 b, | - va_list va; // [esp+810h] [ebp+Ch]
$ @2 N# t. O W2 r - ; `8 z; k" l3 |% A$ {1 ?% N
- va_start(va, a1);
2 [, k/ S2 o# A/ ]- r9 C3 c - if ( a1 )
- T5 @9 }% a. B6 G - {. {7 y% [: m3 v2 G7 c; @3 f9 b4 r5 f6 c
- vsprintf(&lists, a1, va);
, k* h! m% H6 n' }! m( ^ - glPushAttrib(0x20000u);
, D5 A" p) {( H2 q - glListBase(base);1 M* p4 \. K' g2 }# e, k& _2 d! w
- v1 = strlen(&lists);
2 q3 `% B O0 k/ @ - glCallLists(v1, 0x1401u, &lists);
! \2 O- V1 o* n: R - glPopAttrib();$ _- \3 e. q! h( x- v' f. |
- }
$ E+ b2 f. o1 o) W - }
复制代码 6 [. x3 Y8 r" ?& \6 W! o
第2处5 b) z' Z* G- J" t6 e( k) C
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)- y A$ |" ~. e; U
- {) d, } H9 W: ^- M
- int v4; // eax# v( F7 o' L& U+ Z- C, f* {
- GLsizei v5; // eax# G% \+ m; U" W% R4 {& ]
- char lists; // [esp+4h] [ebp-800h]
0 p6 o, S/ o, B- K - va_list va; // [esp+81Ch] [ebp+18h]+ j( F7 E+ o0 q7 T: \
- , f" ]3 m X5 f
- va_start(va, a4);7 p% E! \$ [5 |! I3 z
- if ( a4 )
& r" l% |, R. \6 \& H - {
; l7 s6 g. q2 x7 J/ h- o" |0 | - sub_44FDD0(a3);" m- ~0 ~; B( r- b" ~- d: v7 Y
- v4 = sub_40BB44();
7 S( h1 T6 J8 f7 \ - glRasterPos2i(x, v4 - a2);
" a- k# A0 `/ C2 X# J - vsprintf(&lists, a4, va);
$ D' ?+ |; Q$ a; w/ d - glPushAttrib(0x20000u);) V8 K) c6 a/ |& y" O& M3 h
- glListBase(base);
: l8 g; V: a, G: ?5 C2 v* h, N. i - v5 = strlen(&lists);
; Q6 K3 \6 h: y" S& \ - glCallLists(v5, 0x1401u, &lists);
7 {6 m3 H# f0 B% }- S - glPopAttrib();
! m' { W0 Y; D7 N6 } - }$ E, R3 w* ?! z/ y4 X5 V
- }
复制代码
) J) ^* p7 r1 T3 a
, r9 l0 n, e7 c) l1 d* h$ S' W1 m
W8 X/ w' ^( L$ j7 l第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
' Z. j5 m1 ^% i" h! g8 V! u5 ^ - { ]4 _4 L, w. L/ A4 v. H
- GLvoid *v7; // ST08_4
) _; z) ^1 M, |" [ - GLsizei v8; // eax
, R9 X9 B4 s$ Q1 j3 D - int v9; // [esp+0h] [ebp-1018h]* L* k; n, n, U
- char v10; // [esp+8h] [ebp-1010h] d' H4 T' C8 a5 m- r
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]1 D6 w3 z; q3 N% ?: k- }& c
- char v12[5]; // [esp+1013h] [ebp-5h]* Z& Q S' r- w: ?. s6 u
- va_list va; // [esp+103Ch] [ebp+24h]
: h* z: r1 o. z& ?& r1 m" s
+ {" D: s% `+ a; R" ?6 U) w- va_start(va, a7);8 s' m( r1 I7 ]
- v9 = 1;2 B1 R" W6 R; w5 F# ]
- if ( a7 )! B% U$ L- r) r, S9 v3 K5 Q4 X
- {
+ M; U& |4 u! [5 m; b% c( @ - vsprintf(&v10, a7, va);
0 T/ i k9 ?" B7 x( F/ O) ~; V5 F - glPushAttrib(0x20000u);
5 k+ g4 [& r; P; X' {+ }( G9 U% x - glListBase(base);
8 K4 g5 {) X( f: c, J, W - lists = &v10;
/ a! \! W6 P1 W; I' w% `! z# j ? - do
9 E; m+ R! H4 r6 o" V - {1 V+ N0 C! i; M+ O9 T( O8 U
- *(_DWORD *)&v12[1] = lists;6 _$ u# S e% ?' o+ A4 \; \* A, \0 |7 ~
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
3 ]8 C6 `: \/ j - ++*(_DWORD *)&v12[1];
) j& H# D; n9 M% C - v12[0] = **(_BYTE **)&v12[1];) v- W+ @* D. U& O/ j; I
- **(_BYTE **)&v12[1] = 0;8 s3 Q! x3 g, B. ?
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
3 Y, G! p. S% j& g - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;: M- x9 _; F9 t. d
- y -= a5;
! v* c+ J G* v% N7 }/ @; W! M - glRasterPos2i(*(_DWORD *)a4 + a1, y);! K0 ?" G1 [& m. p1 Q: \8 ]
- v7 = lists;3 ]( r' k( s0 z% |, C
- v8 = strlen((const char *)lists);6 o8 v& n' d% d
- glCallLists(v8, 0x1401u, v7);
- C9 O9 H4 l1 l - if ( v9 < a3 )
4 O$ L X- J3 Q, e" Y& _ w. x* y - a4 += 4;/ n2 G9 B( ?2 W/ b' @* Y$ S6 x
- ++v9;3 W2 k, D1 j" U! _1 x
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
7 l9 m8 X; B: c" [ - }- B! d' g9 S5 H: M3 ~: H6 \$ o1 H
- while ( v12[0] );$ F7 ^& w% j; n& ~
- glPopAttrib();8 j- g R& f4 U( Y( v; a
- }
1 w9 K6 A% `4 i6 d. t$ w3 I3 Y - }
复制代码
2 B& m. G! C4 }4 n, C1 A' T) l( A" \7 z& k) g8 Q8 ?5 U
1 D& D& h+ }( K; F; y' b$ g* C) q
. [3 z j8 j# Q
2 W# Y2 [( c) C) e! g% L3 P
. x0 }0 m4 a( j# l1 _
6 `' b+ a- |6 K/ |* x- D' b3 @
* f8 L1 G* S9 k9 P6 O% L |