本帖最后由 shane007 于 2023-9-5 15:50 编辑
6 @6 R8 H2 o2 `1 x" m3 F: ^5 F9 r4 J
glCallLists的调用处,共有三处。4 h8 |1 q. x! Y
此三处估计是对应游戏中三类不同的字幕。, v9 g" g0 n J" }& m
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。5 A1 M6 R& r# B; R- K8 O$ _
分析的文件名,748 KB (765,952 字节)
* i8 W3 y5 _) d$ ?+ J. X$ D4 B$ dtoh.exe$ u% ?' x4 ?: r' z, c( h% W
/ `7 s/ A: t& z" R
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
# Q. ` V- K! Q& X5 n; N等日后再仔细研究,看显示函数究竟在哪里。 I- R: i/ {. D+ y% T7 E& G
) {* V* n) f- O& c6 e5 A6 Vtoh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
; b4 X6 k4 _* {8 k004316C84 V m. s; H1 x) n
7 P# w( b9 r5 R& D
第1处4 i+ X& r( a0 d1 ]- K" h5 b- I
- void sub_4519B8(char *a1, ...)
8 E5 M) n: O9 Z0 m+ v - {
\7 ?+ ^& Q$ d% x* Y - GLsizei v1; // eax
8 Z9 Q) l% h- W0 w - char lists; // [esp+4h] [ebp-800h]
9 A' q) m3 M7 k" E - va_list va; // [esp+810h] [ebp+Ch]6 G) B3 u4 T# G* o: D2 T! j
& L" z$ L1 C9 \0 i! \! r. Q! l- va_start(va, a1);
8 O+ [4 f. N/ o/ C - if ( a1 )' n$ D8 _; L j7 \
- {" Z. [9 M+ i ~
- vsprintf(&lists, a1, va);
' n- Y h0 h e - glPushAttrib(0x20000u);" U9 J4 u$ d- H. ~: e5 d
- glListBase(base);
) | ^7 u+ s2 Z1 W+ C0 [ - v1 = strlen(&lists);8 f7 A0 e1 O1 i2 V3 ^9 w
- glCallLists(v1, 0x1401u, &lists);# ]7 R' T T! |2 v' a
- glPopAttrib();1 F Z) }5 ]* r; L) v6 C# ]; g M
- }
h- F9 w' G& i1 n5 V - }
复制代码 & a5 k3 K6 y5 a8 _. b
第2处
8 Q, U- Q: F& k; C! B% E% ^5 C: C. }' s- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
- _8 }2 K* ^7 B+ Q p% O - {' s8 w& t* I; J7 V7 f, X
- int v4; // eax
7 J* x. ?6 j" ^9 _: b$ B+ I* x - GLsizei v5; // eax
4 p( q# C. i/ H! h# |8 a7 w' Q - char lists; // [esp+4h] [ebp-800h]
1 {. \3 m# Q7 J7 ^ - va_list va; // [esp+81Ch] [ebp+18h]) v! p5 F& j3 b3 |7 x
) e& r# g& c, b; g8 G- va_start(va, a4);0 W+ O+ `# b8 `$ q) X2 _4 u4 v
- if ( a4 )5 S7 L0 H& [5 W0 P1 J3 S' n; a
- {$ g, E. _; }# t& p( _2 T
- sub_44FDD0(a3);
0 b3 @) D' d( E! O - v4 = sub_40BB44();: l% s( a, Y. o; M' d. l i
- glRasterPos2i(x, v4 - a2);' l& n1 r+ a$ ]9 J v" Q
- vsprintf(&lists, a4, va);) K/ \0 y: E5 O5 h* I
- glPushAttrib(0x20000u);
* v; K& B6 C7 N0 f9 ~ - glListBase(base);- k1 q. I) n9 N/ W
- v5 = strlen(&lists);/ \+ Q9 r7 u n) V8 C& H- o. E3 j& B
- glCallLists(v5, 0x1401u, &lists);
- y) l5 l6 v! T+ T - glPopAttrib();5 B7 _0 j6 ~: n x, M3 u
- }
3 n) a# ?7 n! s0 ]5 J" N - }
复制代码 3 z$ }) U& c' y$ t K' ~3 {
f; O3 x! }3 g% J7 m
5 J5 O s( d* d7 `3 e6 L% c5 {- O第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
: O+ Z: V1 _' V. G% ]3 W - {
; C/ Z* C$ g3 W - GLvoid *v7; // ST08_4
. q3 a* B8 @6 Z5 H8 W% _ - GLsizei v8; // eax
5 Y2 q, Z3 w3 n: @. D) ~9 g - int v9; // [esp+0h] [ebp-1018h]
m# Z$ ?( C6 e9 G+ V$ d - char v10; // [esp+8h] [ebp-1010h]& T' @; W* r5 L
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]% Y0 d: u' U9 d d' b, x0 u! {
- char v12[5]; // [esp+1013h] [ebp-5h]3 S! \$ ~. _2 ]6 }8 e! [; I$ u
- va_list va; // [esp+103Ch] [ebp+24h]' O" ?5 Q! L, S4 O$ H
* P$ P5 b9 Z+ r( C+ @, a4 `0 V- va_start(va, a7);' ? C8 N6 n8 d7 ^2 S5 a
- v9 = 1;
5 O# a/ j5 v5 Y7 T% b - if ( a7 )
H$ I- W: @- s B) ]/ R- u - {" I2 G3 @1 G0 E+ B5 k
- vsprintf(&v10, a7, va);
3 d6 {$ }* r B6 a' V* { - glPushAttrib(0x20000u);
% D" R7 \3 L0 p. Y - glListBase(base);
8 M Y7 `2 m3 W$ N- Y9 L ?; \" P - lists = &v10;( Q# x3 {. z0 p: f5 Q
- do
" _. D! z4 ` m - {/ w- [9 t* \; I6 K
- *(_DWORD *)&v12[1] = lists;
: V9 p. [5 |2 O+ l- p) a! t x - while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
* f+ a" n& G5 ]- G - ++*(_DWORD *)&v12[1];7 x9 ^. v9 Z5 D* g
- v12[0] = **(_BYTE **)&v12[1];2 W8 w3 }2 t7 i% u. W% R
- **(_BYTE **)&v12[1] = 0;
g& p: C W7 ] T - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )3 p: e/ z2 N. P- U( u6 e
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;% `/ P! B. e1 ?' U
- y -= a5;
6 O3 R9 |( Y1 l" u - glRasterPos2i(*(_DWORD *)a4 + a1, y); V- [' I1 N3 h- U
- v7 = lists;7 |6 W4 L2 Z. t% g$ ^
- v8 = strlen((const char *)lists);$ `( j1 F6 W& ^+ g: K* s
- glCallLists(v8, 0x1401u, v7);
, x) d' z; r; H: {4 {, T+ q2 D - if ( v9 < a3 )
5 x8 j2 e. d: u - a4 += 4;) Q* T9 v" |* g3 _2 `" ]7 B
- ++v9;
/ V- H: i' q6 F1 Y - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
$ ` M9 J5 x/ J. U1 s, H - }
5 R( J, y$ L. ~$ l0 b G - while ( v12[0] );/ x: p5 Y w+ ?# {
- glPopAttrib();3 k9 }% Q1 w( r8 B1 W
- }
: y+ d O* s# V+ I - }
复制代码 ' d! D- {3 i! g+ _& c5 Z/ _
; r4 X2 d: y1 w. X |7 J, p
/ m7 ^# n; e3 n w. I2 l1 k3 \6 q" I# [- |6 A) j0 f/ k/ i
. R: X) s) a' i( ?4 ?; k/ C. ?, A9 n& `1 F4 t5 o! H: w
N0 w8 D4 ?0 A, Q6 `7 ~$ @
+ ? t" |3 P- o, N# a% y; d, N
|