本帖最后由 shane007 于 2023-9-5 15:50 编辑 ' [0 P1 i# ^/ k- B1 ]) H, c4 j8 \
2 r( H* a) v- ~# h
glCallLists的调用处,共有三处。
1 A4 K! y7 h5 E8 N$ E+ G5 ]" |) d# K此三处估计是对应游戏中三类不同的字幕。
" m" p8 _9 p) m. Q1 k# S0 L+ L接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。8 U1 P+ o- D% D2 a
分析的文件名,748 KB (765,952 字节)
% n0 z5 ?: a0 P0 I" }. z( v9 Q9 [toh.exe
9 E! @6 z& L6 C' g2 ]$ ~5 }4 K- K! ?! e1 t N
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
) a3 V W4 w) v5 I) c& r7 D等日后再仔细研究,看显示函数究竟在哪里。& O4 V0 `) H& {3 W! z5 ?
0 T+ ^' q( O: U9 p9 ztoh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
6 v. r# w( [. x5 z004316C8
4 Z% A. C0 b9 D$ t: h* T) P) l# {% O, \
第1处1 X0 F$ S/ d( h8 Q2 K- U6 I
- void sub_4519B8(char *a1, ...)
8 l- G- X8 o- c. b% c: z5 i - {
8 |! L, X4 v8 E1 V) Q - GLsizei v1; // eax
$ E6 v9 J) j/ z9 j- G4 M - char lists; // [esp+4h] [ebp-800h]1 R9 C7 x+ q+ N2 n
- va_list va; // [esp+810h] [ebp+Ch]
! ?1 D% J. V* W5 A1 e Q/ G# m" u3 r
" s" Z/ T+ i' N& l" F* K6 d7 \8 s- va_start(va, a1);
[3 q0 ]: k4 b8 @( Q! k) d9 B; P - if ( a1 )% Q2 w$ _3 b# e9 I7 K A5 w
- {
: L2 W. n+ r2 L4 q6 w2 L - vsprintf(&lists, a1, va);5 J3 Y1 l0 j$ g0 E3 a6 H
- glPushAttrib(0x20000u);
; j) \) |0 A# ^ - glListBase(base);
- h1 Z8 d& j6 [) q - v1 = strlen(&lists);
0 _5 |! f1 z6 A - glCallLists(v1, 0x1401u, &lists);
5 t: y# c. @$ S - glPopAttrib();
1 Q0 Y0 e; L; W - }2 m5 P; ?. A& c5 ~
- }
复制代码 1 K! \- x6 }* f! j# h( e% C: R
第2处" S5 c8 ^& r( z; U& a: o8 r
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
3 m' `1 w6 A0 u - {
7 b/ `& U% F3 Y9 o/ |$ f- p - int v4; // eax
; }" _: C3 y4 f7 B' @ - GLsizei v5; // eax
4 N7 b! Q1 o: a3 E/ t2 K - char lists; // [esp+4h] [ebp-800h]# ]/ M: u$ D7 _) C
- va_list va; // [esp+81Ch] [ebp+18h]5 G! i, m6 g. D3 R! Z% U5 Q
- $ P8 O5 W1 |- |; v9 I
- va_start(va, a4);
: U* Q @4 c# G6 e1 K* h - if ( a4 )
9 Z0 m" | y0 c5 N3 U! ^. v - {
1 B& \% z8 A# A4 b. `$ c - sub_44FDD0(a3);
: c/ P1 C4 o, B2 O" M5 {; F - v4 = sub_40BB44();$ S. l3 W2 \# |9 D
- glRasterPos2i(x, v4 - a2);& w# Q4 r2 X- a9 c' t2 P
- vsprintf(&lists, a4, va);
# g. F$ z4 Y3 I6 B - glPushAttrib(0x20000u);4 z7 C. u( D3 H: c. X! z
- glListBase(base);' Q9 a7 F8 e& L z
- v5 = strlen(&lists);
. U" _5 U3 W9 k2 N% o. ^1 R9 P& G - glCallLists(v5, 0x1401u, &lists);
" E7 P' Z7 u7 Y9 u; D8 `& E8 S - glPopAttrib();
5 z. f. b9 s W- q - }3 }+ n' s$ L/ C) P" y. Y
- }
复制代码 # ?( t7 ^8 [/ ~; a) m2 s* w W
2 `# p. c, _8 m: c. G8 C
+ w* y7 I" f6 }! F4 A3 v; j第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)$ E/ P& i3 d# A5 u& k: J5 t# h4 V
- {2 X3 P& K/ w8 s: R* B1 V) w2 c* i) A
- GLvoid *v7; // ST08_4
( y2 a' G; l2 e6 V4 T) q/ }& v - GLsizei v8; // eax
0 ~$ P# g6 A: v/ ^, s5 z - int v9; // [esp+0h] [ebp-1018h], _ l: d( P" C6 h8 B$ a
- char v10; // [esp+8h] [ebp-1010h]
9 m4 e% {+ F) R7 c( L - GLvoid *lists; // [esp+100Ch] [ebp-Ch]* _8 J- f% |$ Y& b! _0 E6 s
- char v12[5]; // [esp+1013h] [ebp-5h]
3 m4 W1 E4 [8 @+ E" q - va_list va; // [esp+103Ch] [ebp+24h]
) z) ]* D; m4 {
8 e" c! |5 r. \# b/ s4 X) C0 h- va_start(va, a7);# V: H5 W8 c! ]) Y7 \
- v9 = 1;7 N, }6 `% U$ s* S* p6 w7 D' J2 e
- if ( a7 )6 [* ^7 g7 O; \( k- A# e' O) Q/ Y, i
- {
' [7 g! J* h; k* `) [ - vsprintf(&v10, a7, va);
' p3 l7 n) m N7 p - glPushAttrib(0x20000u);; D% s% \# \- c6 g
- glListBase(base);
# N1 }% O) Q: } - lists = &v10;
7 J9 o, Y0 _: T/ c! ` - do3 K; K8 ~: M7 L9 B. |% U% H& z
- {) \2 n I5 h Z$ n8 Y9 \+ N2 X
- *(_DWORD *)&v12[1] = lists;% j+ @' j$ b+ K. ~/ {: r
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
3 A" s5 `: `; x B9 X* d2 J+ w - ++*(_DWORD *)&v12[1];) r; ]6 ^- y4 Y& ]" G2 g* C
- v12[0] = **(_BYTE **)&v12[1];
6 n: u: E1 P$ i2 S! I/ f' n - **(_BYTE **)&v12[1] = 0;
( z0 q4 n( R2 ] - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
2 g- U; q: ?3 p# c6 @* o - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
3 N3 n# _' f. M) {9 [' B7 Q - y -= a5;
: I" r- [( ]9 |1 X - glRasterPos2i(*(_DWORD *)a4 + a1, y);
; |0 O9 b {- t( ^; v( R: D6 M - v7 = lists;
' ]: ]1 w9 N$ A6 U - v8 = strlen((const char *)lists);" Y7 X* Y/ ~5 Q5 l
- glCallLists(v8, 0x1401u, v7);9 m, n* O& t+ @* z) m. f
- if ( v9 < a3 )0 w- K8 S; E* k% `8 l
- a4 += 4;+ _6 T1 [4 u+ T6 K' ?
- ++v9;
" \% f1 U' O& }3 D3 ?3 W Y( p - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
! o% }2 F! R7 S- I) y - }5 _# S" o7 n5 _3 t1 \# R
- while ( v12[0] );9 S' F' C$ I5 q5 b7 P+ T: X
- glPopAttrib();
5 b; Z8 D' x- q% S* f+ k8 s/ T# E - }
+ p% [3 m/ i4 p8 O - }
复制代码 R8 { G8 G1 d" @* I
u2 b5 x7 R/ G2 ?: N' c
5 X: _5 l( q5 Y1 ?+ O: p
$ E2 B( W3 m) N( x
: j' D# O. |. o4 \, q
4 [7 n, O1 O( I6 Y8 Z5 ]4 G3 c& W" x3 A7 C3 p% h; h' N
1 o' j% [9 V/ Y |