本帖最后由 shane007 于 2023-9-5 15:50 编辑 / Y$ n: A& i- }5 \5 v# p/ @
: S. i1 }) }# l! pglCallLists的调用处,共有三处。
7 B( F# J& O( r. r0 V" Y! u7 d此三处估计是对应游戏中三类不同的字幕。6 Z8 t. B8 q: r' f/ _8 T; m$ u
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。) k* ?/ [: k: c9 f9 y) n% d! Q
分析的文件名,748 KB (765,952 字节)
! u% l' C2 F( K) wtoh.exe) I- q9 n* O- V* | w9 A7 }
7 v/ I# s4 ?5 ?! b& B8 b
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
( e( k. m' u. f' p- N3 r等日后再仔细研究,看显示函数究竟在哪里。
1 @0 A* h. N- m* C
2 ~8 o- R" m: B+ Stoh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]& p5 r3 I% o6 b
004316C8
: T% A1 I) k( m4 ]5 A) T' Y5 C; e( |- y5 ]# A" f, a
第1处: U9 N0 E9 N2 j) H' i
- void sub_4519B8(char *a1, ...)
8 S& g/ i8 Z8 b - {
0 ~" c2 e" h5 n4 M7 B; L - GLsizei v1; // eax
8 ~/ a2 ?' k0 G" k1 E3 C5 c% p - char lists; // [esp+4h] [ebp-800h]
4 E6 H4 R& D- l( m$ i! K# } - va_list va; // [esp+810h] [ebp+Ch]
, ^2 K* _" i9 p) x5 D D7 T1 x0 P% G - / X$ J% H. ~# q4 y& V
- va_start(va, a1);* j9 @- D4 J1 h- {& V- D
- if ( a1 )! E8 C5 p' ]; i: x" {
- {! f! \4 N* `0 h
- vsprintf(&lists, a1, va);
0 \0 ]3 s+ ]& P0 y& J' D% } - glPushAttrib(0x20000u);
- B- P4 w7 Y8 [0 Q; m% j - glListBase(base);
+ V# J. Z) Z% _6 E - v1 = strlen(&lists);
% g/ | ?5 o4 p2 y0 I$ \' T - glCallLists(v1, 0x1401u, &lists);
6 _ [7 J! s! V, H - glPopAttrib();
; q+ U( O! z9 `, o) `4 m - }. Z) C* R6 E9 `4 m, g! V
- }
复制代码 ; E, Q" d' M- ?9 F9 r" h, W Z* \
第2处
; W+ ~/ i* v$ j- y- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
% ~# V, N k; Z% ] - {1 Q4 i( f# A( e* z& G" X- L# r: ~
- int v4; // eax
h3 z: i7 M4 {0 u* `$ _* y7 N - GLsizei v5; // eax
* f. ~5 }5 `! A - char lists; // [esp+4h] [ebp-800h]
: m) R; e( E: T5 T - va_list va; // [esp+81Ch] [ebp+18h], l0 C' J$ q1 x8 K
- $ l9 D6 h( j/ {# `7 y3 \
- va_start(va, a4);
( b! V$ d( V! ^ - if ( a4 )
2 H, u! y! E7 _0 M3 T2 g - {
- \- Y1 S( a0 X9 T - sub_44FDD0(a3);( I7 ^! e7 h0 F& n( K
- v4 = sub_40BB44();
: e7 }% X( K4 ~! T6 d2 l( a% O - glRasterPos2i(x, v4 - a2);7 T5 t/ N& ^, h2 O7 ~
- vsprintf(&lists, a4, va);
) Q! q+ C1 H& u/ y" { V6 ]/ ^ o - glPushAttrib(0x20000u);
8 o/ M( x$ K/ ~ - glListBase(base);5 s- A, V" F/ g* n9 R0 u3 v6 c" F' u1 K
- v5 = strlen(&lists);6 U7 C. s! g4 p; C% y. e
- glCallLists(v5, 0x1401u, &lists);: {# a" Z8 A1 j2 b# ?) L; @
- glPopAttrib();' D# c; [0 @* f3 E
- }
8 T" j7 X, V$ L" @2 ` - }
复制代码 % V6 h' K/ g+ y- R
: f- e- A1 [8 g# Z, B+ Q+ U
$ m% u3 s0 q/ g& o4 J+ c9 G S第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
! h, \% ]3 V& D0 s" P - {
* Q1 \" i+ E& u, K, Y) P: O - GLvoid *v7; // ST08_4/ i; X/ i: Y: M! g6 h* r6 ~
- GLsizei v8; // eax0 ~9 j8 g; g9 p& c G; o" {' x
- int v9; // [esp+0h] [ebp-1018h]
U9 U, {8 Q" O2 c - char v10; // [esp+8h] [ebp-1010h], [ r. D0 t1 B5 O: Y
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]
" P% e \ |6 r" e - char v12[5]; // [esp+1013h] [ebp-5h]! W! d7 Y* {' N: D: }% }1 j
- va_list va; // [esp+103Ch] [ebp+24h]
) y4 c5 }/ O8 ]5 N/ `+ E: q - & }5 G! k8 L E) W- \- J
- va_start(va, a7);( _6 u x1 {$ q4 N3 t4 O. ^. t# s. n
- v9 = 1;4 M+ {1 h* X* |' s* p [$ A1 Q
- if ( a7 )
9 k ], `- O" c/ ~' v- w$ h- ^ - {5 k& a @2 ^: J# {. G
- vsprintf(&v10, a7, va);! Y4 B6 q t7 N# W
- glPushAttrib(0x20000u);
0 N; g6 R8 ^5 M9 i, K2 n - glListBase(base);5 O4 E# T0 d! J/ J8 y) b( K5 i9 N2 O
- lists = &v10;
b6 I7 [" C. W$ j - do: E7 Y; u& ^8 y E7 A
- {% \9 z6 Q* ], t( k" z
- *(_DWORD *)&v12[1] = lists;. e$ n( i5 n& B4 k) @ L$ S
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
. c/ V$ R9 e% m - ++*(_DWORD *)&v12[1];
4 I" @) c/ C% \: |+ Q7 f4 G. v: J - v12[0] = **(_BYTE **)&v12[1];
7 N i! `& V7 b* I! v6 H - **(_BYTE **)&v12[1] = 0;
* G7 L" u# |& w, H) W - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )+ f# ~5 {3 D4 x* |9 R2 Y4 ?
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;* C+ U u. l% _' s/ ~" l% b, k
- y -= a5;
5 q3 Y* M1 ~7 b4 b w+ @* x/ j3 T/ B - glRasterPos2i(*(_DWORD *)a4 + a1, y); w1 t v8 j6 p
- v7 = lists;2 t$ t6 A4 Z! }$ ?
- v8 = strlen((const char *)lists);& s1 X; A; W! w& a' c
- glCallLists(v8, 0x1401u, v7);
0 b4 v6 b' o* ^, Y - if ( v9 < a3 )
) `. u4 r' k4 R; A# K% { - a4 += 4;# z8 B% t- a" j" d3 H6 `( t
- ++v9;
5 O& U$ X! E( M - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);$ D! s5 T- V) s3 l. A r. m' e
- }
9 G7 i( t3 \5 y f - while ( v12[0] );0 E7 o1 N* h2 A2 I7 I9 l. ?
- glPopAttrib();
# n) K6 `: n: V2 S+ F3 ~. U5 e( f - }
3 a$ N& e5 V$ _0 O) z - }
复制代码 3 e7 [5 H& [* d' r( U8 K8 R
S+ r! u( j; q0 g5 \7 M7 j
! ~% d+ L. x4 P9 ]* a4 L" {8 c
! P2 \; T+ I1 ?
! o0 p; { L- A p7 c. v/ n/ B' C% S+ |9 s7 o
# d# v: k z4 l9 e( Z
- s) b i) k4 R |