本帖最后由 shane007 于 2023-9-5 15:50 编辑 * X* T, `) R9 j# O
& y& O. `- g: S$ yglCallLists的调用处,共有三处。& O2 o1 n C/ w7 q
此三处估计是对应游戏中三类不同的字幕。. X6 ]& _9 E7 L6 }
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。% z. m) f0 x, R9 H
分析的文件名,748 KB (765,952 字节) ]5 p* ?8 F3 P$ ~$ ^4 v% G
toh.exe1 T) I6 t9 R1 g- o
% N0 R+ V9 M% w d7 c$ E经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下, @4 g' G: Y; Z3 R' |7 z
等日后再仔细研究,看显示函数究竟在哪里。1 U1 m0 Q) _5 ]
2 ~) K' R8 `5 V0 _, D# ], l1 }$ Atoh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]& c3 w* S& U; C' O
004316C8
. s. k/ A. o( A% o0 G: [" V* R$ ~+ V
4 x) J7 w+ B0 k第1处
7 P- D5 {6 f |- void sub_4519B8(char *a1, ...). M# a& k4 V) v. C( [
- {2 [0 D1 G# m0 v/ v" x
- GLsizei v1; // eax3 f9 }% L2 ^ l* ?. o+ d: }0 w
- char lists; // [esp+4h] [ebp-800h] M4 G# u! v: _1 x c' T8 l/ q9 H
- va_list va; // [esp+810h] [ebp+Ch]* T: a# u1 u2 } L: j+ }) `3 T
- 7 Z; K. ^; V8 A* l
- va_start(va, a1);
3 K& y J1 O: P5 ^0 ]" `: z, F7 ]' u - if ( a1 )6 A* c2 J) q2 p3 M2 g
- {3 W n) X2 r' ?5 p
- vsprintf(&lists, a1, va);) t7 V* m) s9 D* z' _
- glPushAttrib(0x20000u);
/ L8 I& n; ~; ]% c - glListBase(base);
, y. ~% Z$ V/ z. _# J6 ` U6 d8 J - v1 = strlen(&lists);+ O6 s3 z: X+ Z: i8 [. {* ~
- glCallLists(v1, 0x1401u, &lists);3 t3 n4 E5 w9 o- ]2 s" k0 |" e2 h, b' ~
- glPopAttrib();! E1 c3 }" u/ C7 f7 y
- }) ?) L' J$ S2 j# S Q
- }
复制代码
' W- [" n+ m3 y8 j第2处
, m9 \. h3 s2 E# Q- b, k6 D- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
, \8 {1 ?; [# E! b V0 e: w - {# A8 }% j- D! s' z
- int v4; // eax
: D2 z& I3 U& P: z# D# G - GLsizei v5; // eax' r) Y& s, f! s; E1 \
- char lists; // [esp+4h] [ebp-800h], U( w) I& ^( }7 H; B
- va_list va; // [esp+81Ch] [ebp+18h]
7 o) }5 k5 W' `5 n, i1 \7 n6 q+ R - ' o9 Z6 ^7 u9 A1 F) S
- va_start(va, a4);
3 t, _7 k- q* U7 K - if ( a4 )
$ j; _1 y% Q4 E8 y8 D7 ~ - {
+ r% E7 n5 P6 ~! q( W8 Q x6 O- d - sub_44FDD0(a3);
) h8 F. p {8 x) s2 v: ` - v4 = sub_40BB44();
8 x |. d( `/ m - glRasterPos2i(x, v4 - a2);
. f D8 J( X% f$ Q ^- V - vsprintf(&lists, a4, va);
6 o* t8 e. U7 q7 B4 H; m - glPushAttrib(0x20000u);
0 [3 w) g+ f+ g- q& v9 \! N - glListBase(base);
. \& K0 J* y' k) } - v5 = strlen(&lists);
* c1 }" H. k. C: e - glCallLists(v5, 0x1401u, &lists);; [4 S; f4 }3 B/ _9 ^6 l
- glPopAttrib();
" Q/ Z% \& c5 B5 |3 T2 t - }
' N8 P1 I- S; l5 `0 }" ]# Z S/ n5 q - }
复制代码
; _% n! z* w: s' [8 `" O9 n/ O+ O
# c4 W$ S5 d2 `7 R, Y* ?第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...); c: u; X# I- P8 ^0 ~- w
- {6 s$ M: T J6 W" S' d
- GLvoid *v7; // ST08_4
+ R2 q' D& @/ ~7 J- @8 r - GLsizei v8; // eax2 Y! h+ u1 z& |% J
- int v9; // [esp+0h] [ebp-1018h]! X# i4 i/ |3 {7 E. B! w. ?
- char v10; // [esp+8h] [ebp-1010h]
9 q- g/ N7 I, y1 J! p* X4 T - GLvoid *lists; // [esp+100Ch] [ebp-Ch]+ i8 {3 Z6 |+ X- f3 z8 h+ ?
- char v12[5]; // [esp+1013h] [ebp-5h], Y. V O8 w: H* ~ ]
- va_list va; // [esp+103Ch] [ebp+24h]9 j( l2 C5 {# D. y- M7 s
- 1 V) |9 n9 y$ r/ V" u c
- va_start(va, a7);2 W7 C; Y/ H! q6 q0 v& ?6 p
- v9 = 1;* C, Y) I) q6 |( w' ?8 x
- if ( a7 )
3 e; c% t" Y7 q$ B5 q* ^ - {6 k7 \3 J# l% a0 b- r
- vsprintf(&v10, a7, va);
& O. _0 z4 y3 p t$ i& k* w* F - glPushAttrib(0x20000u);
0 ^; l/ t4 O- Q! t8 r" i* B - glListBase(base);: v: m$ k. W) L
- lists = &v10;9 \0 L2 s5 i0 W7 J8 n
- do
1 W5 _; S) o, M1 |: A! i) L H - {
+ p, K. g7 K1 J8 V3 X4 J. ^ - *(_DWORD *)&v12[1] = lists;" p+ M. F( x0 P# t& m _3 j7 y
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )6 U& p4 [ Q" P C- c/ x4 |
- ++*(_DWORD *)&v12[1];. z/ F/ o; o: r2 x$ S$ {
- v12[0] = **(_BYTE **)&v12[1];1 c) j2 P; r3 A$ }0 T# _
- **(_BYTE **)&v12[1] = 0;6 `2 [7 t9 d9 K: T7 i# m( H
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 ). [. G Q* F3 Q5 _! H9 G& S
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;6 e1 k( \0 i0 ]/ w& f
- y -= a5;" y& y; l# L- ~9 G) I
- glRasterPos2i(*(_DWORD *)a4 + a1, y);
- ~4 f+ k( V6 i5 M - v7 = lists;% m% F3 X& q) S% J9 E
- v8 = strlen((const char *)lists);
% U" A$ V7 ?. d1 G; z - glCallLists(v8, 0x1401u, v7);' R0 I# i) R# u% {
- if ( v9 < a3 )" `7 b; p5 _. m/ g; y' v( e
- a4 += 4;" c& j0 Z, X( Q" E1 B/ X V& N. O
- ++v9;
9 M, b# y, [- H1 P, q: @1 j' } - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
% p! \6 d' [ p1 d1 w# A4 r5 @ - }
% A9 U/ n% c0 I% Z - while ( v12[0] );3 r* u9 o' A. f, [
- glPopAttrib();! q4 C% F- }7 X/ F+ B4 b- E1 u
- }
, ]: x9 o5 s" M, q - }
复制代码
) h+ m7 G2 x$ q* {
3 m- X+ d* c. H+ j( n+ y- V5 ?8 C' ]! M
; l( l6 h: ]* F- E- V/ C8 ]
' C; {* j0 R4 e+ e: j
# m7 ]1 e- D4 a) w: c$ R( ]
w* {. O6 O# E9 h
% q. Y4 c1 c. [; R; C |