本帖最后由 shane007 于 2023-9-5 15:50 编辑 2 Z" H$ H q6 j% ^7 [1 P
' _) T* Q4 V9 m! o' [$ c
glCallLists的调用处,共有三处。1 j; j( X1 s B" M
此三处估计是对应游戏中三类不同的字幕。
/ T6 T5 v& S- ]& }接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
/ Y, G6 {! X. K4 i8 k分析的文件名,748 KB (765,952 字节)5 m6 s# x8 m* U3 Q# ~8 w
toh.exe+ y q) U( r, k, B3 h2 c
I& R: y/ p* Q- d4 t0 O
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
. Y! _# e9 l' [: A1 ^等日后再仔细研究,看显示函数究竟在哪里。
# p# a4 W/ I7 v5 L" k4 a
, O3 D; ]5 \& v1 Ftoh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]0 s) a" N$ \+ x0 Y/ F; E1 n! t0 K% y
004316C8
5 h5 n6 g2 k6 x' X6 {! E/ S$ D* `
第1处# r* z& Z7 A' p
- void sub_4519B8(char *a1, ...)
1 j8 P. v9 A' J1 H, @ - {, `# g1 m, P* p% |9 [6 a; b
- GLsizei v1; // eax6 [+ B$ B) U9 l/ Q/ w
- char lists; // [esp+4h] [ebp-800h]
% C+ H1 A* n+ J - va_list va; // [esp+810h] [ebp+Ch]8 [& h* q" N9 t) Q+ V7 |( r( q! M
! E {3 J+ Y/ m% B( ~* s% X- va_start(va, a1);4 B5 }6 u5 u3 o
- if ( a1 )
" t8 ~: R+ p$ d - {; g/ X: R) @- e. Q: y( Y s
- vsprintf(&lists, a1, va);2 f! t2 J, D2 P+ {2 V1 p* ?' [
- glPushAttrib(0x20000u);4 a: v4 K7 C- {! i; H) b
- glListBase(base);& P3 m6 ^, L0 d
- v1 = strlen(&lists);. F9 }0 G" ^7 p" u
- glCallLists(v1, 0x1401u, &lists);
0 t/ u* d1 _; G% l - glPopAttrib();7 @3 @* \/ z$ i7 R2 i8 p
- }
- R* v, R2 |0 s- n6 x6 n0 i3 I - }
复制代码
; t* h8 D7 V2 u4 ^5 g4 C: o+ m第2处
- Q$ u2 e0 r3 ` Y. ?2 K- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)* W# t, O5 I8 d( p! s L" v1 [
- {
7 S: ?* ^+ M+ x - int v4; // eax
2 O8 P# T* R+ j5 {! n - GLsizei v5; // eax" D) C: w4 b7 |9 h* s, W
- char lists; // [esp+4h] [ebp-800h]4 y' i; y, ~# t( I$ h) \. S
- va_list va; // [esp+81Ch] [ebp+18h]9 _6 x1 X: O& C3 n6 }, r
- 9 E3 E1 P/ o. x1 M4 c* F# C y$ N4 b2 x
- va_start(va, a4);
9 m1 ]! e( s$ z3 T+ H9 H - if ( a4 )
3 o) j9 ~% ] a' X - {
+ M/ o$ D; j# q5 n2 k$ P - sub_44FDD0(a3);4 }4 a3 [# a4 j; J2 c: M( p
- v4 = sub_40BB44();' Q" |6 ?/ }% d8 s
- glRasterPos2i(x, v4 - a2);
; F% j6 U0 w7 x6 R# B6 |' \- \ - vsprintf(&lists, a4, va);- t! ~$ B- V4 `+ b5 t$ z
- glPushAttrib(0x20000u);
; J/ h8 K$ |/ {3 f& T - glListBase(base);1 [+ C! p5 L! {3 o/ J" ?4 C5 m$ q) ^
- v5 = strlen(&lists);7 a4 T# o% Q& \+ z1 Q- a% E
- glCallLists(v5, 0x1401u, &lists); p' O1 J. r8 t e
- glPopAttrib();; P9 y9 q4 K/ n* E
- }# K; W5 }7 x( K! N, I# @
- }
复制代码 4 l8 G. T# f2 K0 x
* ^1 D& W4 k" a% v+ O. `$ M
- |1 t- B9 ?# o- [第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)5 h+ F" a) {' ^/ [ v
- {
4 \7 k6 p4 q5 L2 P - GLvoid *v7; // ST08_4$ {: T" F1 B; Y6 A% W
- GLsizei v8; // eax% d h9 G% z: d. M& C
- int v9; // [esp+0h] [ebp-1018h]
- k- m% U0 x. e$ V- x - char v10; // [esp+8h] [ebp-1010h]
- x& A( o0 O0 v" g& b - GLvoid *lists; // [esp+100Ch] [ebp-Ch]8 E+ o2 ?6 q0 I4 y( o
- char v12[5]; // [esp+1013h] [ebp-5h]7 `4 g) \0 }- v0 N
- va_list va; // [esp+103Ch] [ebp+24h]
' z6 J; V: v; r, k. l& O
) G- }4 S5 C/ Q- va_start(va, a7);! B: y) k: {7 y# M: M( b) o
- v9 = 1;
7 K3 E; }: R% J - if ( a7 )' S; P( o, ?* s2 p& y( q( C4 S
- {0 c8 y, h9 Q5 Q" K
- vsprintf(&v10, a7, va);( ^) I+ w. O- {8 o
- glPushAttrib(0x20000u);
# h1 H1 V# s o - glListBase(base);
( E' p, F( ~' O7 M, h - lists = &v10;
3 e2 R) m! i4 D' K4 y" I - do
* |1 r, d# e9 [: t: k - {0 A% g7 H$ d( c
- *(_DWORD *)&v12[1] = lists;, P3 y" e3 V% P4 r
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )8 i5 g" X2 q/ ~" ?" _* O
- ++*(_DWORD *)&v12[1];* C7 G- J1 K# \# y$ Q% @; v6 \# D
- v12[0] = **(_BYTE **)&v12[1];1 z! A* C) ?0 \& ]0 g
- **(_BYTE **)&v12[1] = 0;& S' d+ J U {
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
' R% i3 K2 ~+ D - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
0 k7 w3 H% t6 D# F1 k5 j8 D - y -= a5; }( G, U, Y" a* K9 {+ ?3 B
- glRasterPos2i(*(_DWORD *)a4 + a1, y);# d0 s- g6 S: M: i$ K
- v7 = lists;
" R2 m0 G7 X4 G+ T. i. y2 ^ - v8 = strlen((const char *)lists);7 {7 }) F( Z' ?
- glCallLists(v8, 0x1401u, v7);
# U9 y# m9 F$ v; r - if ( v9 < a3 )
" C% w# o4 ?) A+ n+ I/ d5 x' Y3 H0 S - a4 += 4;- v5 E& m/ g N. R' @
- ++v9;
* g1 |. |5 E7 D7 J9 ?0 K& c7 ?9 _ - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
0 @# A1 N& P1 k9 a - }+ J8 y, X, W1 C L- I
- while ( v12[0] );
_. n$ C; s4 T- G - glPopAttrib();
* k, }4 A9 B. {+ h: ^- W- Z* ?* ~ - }
9 m8 N. a+ U2 C7 p - }
复制代码 9 S# N& k3 h7 A+ H* V
# s& }7 `* b5 p
) M4 t" B; }$ W: y/ C: v6 t
% V8 n6 u0 ^! o0 A) G. p
3 Z7 C5 I1 a! k& j
& m; K( E' F) y N U
2 O: |. k% S. ?) {% U" N: h: S S2 A
|