本帖最后由 shane007 于 2023-9-5 15:50 编辑
1 p5 t0 P7 ?4 i. Q. h# R1 Z- {( W+ `
glCallLists的调用处,共有三处。
# v& g7 P6 |; h) C此三处估计是对应游戏中三类不同的字幕。
! \; d/ w Q/ _+ a6 {8 k接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
0 h, ]" b- l3 j" @- Q- F分析的文件名,748 KB (765,952 字节); j" I2 d2 F8 J* v
toh.exe
: O) i: l0 X0 W+ d0 Q
# D% r6 N. P4 D0 U3 a0 I经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,' g! y# m1 X5 h
等日后再仔细研究,看显示函数究竟在哪里。. T2 a8 Y8 \% ~- Y. |
+ |% F( \) D" e5 xtoh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08] t# b/ h1 \7 I: S. g
004316C8
0 A3 q W* L% B q& x) f; g ]& ^( E* {4 A
第1处
2 K% z' a7 @: F, F$ ~/ o; k- void sub_4519B8(char *a1, ...)2 v% a$ j: L& @9 Q+ O* Z, h
- {
' c _* s; }4 R/ P5 u& Q5 A- m0 A - GLsizei v1; // eax
3 `& F# u8 }! Y7 C+ ^/ `: G - char lists; // [esp+4h] [ebp-800h]
4 p' G' N) ?+ {1 ? - va_list va; // [esp+810h] [ebp+Ch]8 Q+ v" f& P4 R5 A" j6 J) x
' A! @" s0 W) O- va_start(va, a1);
7 @6 z! Z3 ~2 Z$ G - if ( a1 )' [0 e* U) v7 d1 f7 U2 J5 e3 x( F
- {
* D: @2 L; F1 m7 |9 d; [3 K - vsprintf(&lists, a1, va);
6 p+ H, Z1 A3 u g: f' R0 F, p - glPushAttrib(0x20000u);
. U- L5 y8 ~2 n9 v8 |* t e, Y - glListBase(base);
4 }3 |0 D' j0 u* f - v1 = strlen(&lists);
" D7 I$ y2 {; E1 ?/ o6 E5 m' J - glCallLists(v1, 0x1401u, &lists);
! d! n& Y* g& N0 V) e, O" a7 L# Y. D - glPopAttrib();
: [3 T( @9 B5 R1 n/ t - }
& V6 V% C1 n2 n - }
复制代码 ) u0 u: {& y# S: S5 G
第2处1 o: Y2 ~9 P, b
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)! v8 N$ P4 v$ i5 F$ x) o
- {! O W7 H( S9 A# d8 Q C
- int v4; // eax" }! R- e1 Q8 B8 w' V
- GLsizei v5; // eax
/ u7 B1 N5 D( n" w2 V) t: M r* A - char lists; // [esp+4h] [ebp-800h]$ I7 a3 S2 w# X) T# \; I' l; Q' ~, P
- va_list va; // [esp+81Ch] [ebp+18h]
( B$ W5 @* k. _$ p! T# X+ f9 }
# ?1 j* T. U" H! Z- va_start(va, a4);
* c f9 U" r( m# z - if ( a4 )# n+ v4 [, c( i# L
- {
& ~) q7 u5 o1 p9 q7 d( { - sub_44FDD0(a3);
) ~4 u! h5 A& B9 ?* { - v4 = sub_40BB44();
% `6 ?; c" B( D& J+ b8 ]% q - glRasterPos2i(x, v4 - a2);
8 i3 ^; D8 @/ X p - vsprintf(&lists, a4, va);
% a7 w# y& ^" h9 B6 s4 ^& W! [% O - glPushAttrib(0x20000u);
/ ^, D% Z$ i/ x - glListBase(base);# D" H" b2 d) f9 T/ T) F
- v5 = strlen(&lists);" j. w% ^# L" `/ e2 f$ y& |
- glCallLists(v5, 0x1401u, &lists);/ M5 B' _$ {4 q
- glPopAttrib();9 P' J3 {' b/ K" e) A
- }
9 F* t! g, X0 ^- C: i" z, [ - }
复制代码
) c/ l4 T2 [* f n' n9 W& y7 Q! [+ c( W. x
F; @. d0 T; r1 ^7 C0 |2 R7 X3 T
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)( L3 |: P, N/ W: P/ _ s
- {' c! a* H4 P( n* _! `1 Z0 v$ i9 }6 t
- GLvoid *v7; // ST08_4
& q2 ]2 t* H' C; x' X - GLsizei v8; // eax$ T/ t5 u. c) O9 o- \
- int v9; // [esp+0h] [ebp-1018h]
3 P; K; j. G; @ - char v10; // [esp+8h] [ebp-1010h]
$ t) R5 l0 {- C - GLvoid *lists; // [esp+100Ch] [ebp-Ch]& O8 K' u- W* \
- char v12[5]; // [esp+1013h] [ebp-5h]
7 x9 ^1 `, x9 \5 a - va_list va; // [esp+103Ch] [ebp+24h]
0 R e* r' Y$ [& s0 j% U3 i2 }/ @9 I
8 u$ M B* ?' y+ A- va_start(va, a7);
! [7 w! g' K' Q9 Y! l - v9 = 1;% x$ h. F- T2 W' s
- if ( a7 )! J9 a2 h4 u( l' P
- {
% Y; d4 y$ w# }) ^# C0 ~ - vsprintf(&v10, a7, va);. u8 u" _, _' u9 Y% c9 j
- glPushAttrib(0x20000u);/ V5 d5 P) S$ R" C9 k
- glListBase(base);6 x8 ^. X* x; C/ g/ M
- lists = &v10;; f2 A2 j5 r" v' s
- do# @( Z: T9 \+ G! _3 \' |
- {! \, k! O% X; J2 Y. Q2 o, p: r
- *(_DWORD *)&v12[1] = lists;
$ e8 M* ?9 X f - while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )( l, ~8 Z( I( H' h$ R+ y. F
- ++*(_DWORD *)&v12[1];
- p. l7 K2 P8 _% U* y5 ]& X - v12[0] = **(_BYTE **)&v12[1];
# u$ t& Q8 l/ ^7 l- g; t- E - **(_BYTE **)&v12[1] = 0;% v5 n7 j6 C5 }* ~% A# W
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
2 A( z2 S. J$ ~, R - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
; `; p! s3 ?4 j9 Y6 x - y -= a5;9 ?" H% G1 G( j
- glRasterPos2i(*(_DWORD *)a4 + a1, y);
9 n) N1 T9 M9 ^# B - v7 = lists;
. y( G, E& j+ _ B* [2 a$ U - v8 = strlen((const char *)lists);
5 b/ `' t7 T4 Q' o9 M5 b6 A - glCallLists(v8, 0x1401u, v7);; a6 |) T* l0 Q8 |) J. `) M! f
- if ( v9 < a3 )! G n- `* p5 W
- a4 += 4;
: a% c- H; D# }5 n9 T - ++v9;4 h4 I! v3 \4 @2 U ^
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);4 Z; }6 e) A& W) V4 A5 Y6 H
- }
' u7 Q& l! _: j2 m* L6 Q9 C - while ( v12[0] );& u5 c8 |: p" g% O2 m% ^
- glPopAttrib();
7 b& N. ?1 J- c9 c! m! `2 L - }
- T9 ~* G4 v7 Q - }
复制代码
1 X) f8 q. Y+ q3 [3 c I$ |5 d9 T+ }8 }' I
. \4 ?/ x8 w0 [* C& ^2 D
, G U/ H) d# A* i4 I
, W r$ B2 @$ w/ ~+ l( l4 A1 f( M/ @
/ A1 n& O- g' w( C, c- X# R* M( d) k- X8 ^' [! t( |
|