本帖最后由 shane007 于 2023-9-5 15:50 编辑
4 i6 J* h) [4 I e+ p; x
& v! x. w$ I0 k+ VglCallLists的调用处,共有三处。
9 M4 s0 m7 ]! y此三处估计是对应游戏中三类不同的字幕。
& l8 y" U2 g3 {& [接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。3 O9 c0 u3 W, C* f% S
分析的文件名,748 KB (765,952 字节)0 r4 j, A& Y+ ?4 A& \& }
toh.exe' L9 [3 V1 c& {) c( `% u
5 g- ^8 Z/ ]8 k8 i' L
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
( [* B: b, E% Y0 M1 x4 ^等日后再仔细研究,看显示函数究竟在哪里。7 Z" [+ K# M2 U9 F' g, G. t
4 J: P/ }# X( X5 z5 Y0 e/ {
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
?3 m$ B z' \7 g+ B( s004316C8
3 H/ N! E/ R. r/ m+ }# X- T
: O: M* I& S2 c/ e R3 R+ o9 m# b第1处
. k3 z M% N% m' h% s4 ?- void sub_4519B8(char *a1, ...) j5 Y+ g0 h1 f' j1 M
- {
% w0 ~# G% K9 f H. I" w0 t6 w - GLsizei v1; // eax. L2 G! U3 ?* _9 S
- char lists; // [esp+4h] [ebp-800h]
' W# {: ^9 n* G1 s/ Q) E2 ^ - va_list va; // [esp+810h] [ebp+Ch]4 w" B8 k6 ?7 u! i, b
- $ _( @/ l0 J% r) m# b8 ^+ [
- va_start(va, a1);
7 E9 t0 X( H5 O. m5 ? - if ( a1 )( z6 V% w) D- C9 _5 u9 T& c" a p7 w
- {
6 v6 ?' J, n* f; z7 M5 ~ - vsprintf(&lists, a1, va);
t- }! q( X( p, k - glPushAttrib(0x20000u);
: H9 Y! G' q& A7 J; L - glListBase(base);1 K A* C0 V7 T: p
- v1 = strlen(&lists);
+ h5 J+ Q" g: k9 ~+ @& p( ~ - glCallLists(v1, 0x1401u, &lists);
9 ^3 \5 q$ M$ \- E7 f - glPopAttrib();
+ f) g% H+ m4 K1 M# R7 L; r - } E" z* s7 v3 [
- }
复制代码
8 x0 ]8 G4 @, u4 U) |$ l; j第2处* J' Y) B: N+ s; r' ]* v# p' Y
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)8 K/ ]0 C) b6 n: M# ^, t
- {
. ?7 G# {2 ~2 c+ x6 [/ `& Y - int v4; // eax) o6 J: x" a+ Q* o6 k5 e
- GLsizei v5; // eax
+ n& H' p3 ?9 e& M# g- y5 m4 W - char lists; // [esp+4h] [ebp-800h]
% V; U; {6 ]* D! n, F, R! p6 y - va_list va; // [esp+81Ch] [ebp+18h]
9 H- f; M0 `1 j9 X( a) q9 X( R0 f3 F1 X - * G% q" k4 v4 @# U$ Z) V7 {1 O
- va_start(va, a4);1 L, p! o% Y: c! b
- if ( a4 )
! |1 X6 g" y- _( ?& q* p - {, ?2 B" ^! ?& Q4 M6 O9 [9 _& C
- sub_44FDD0(a3);
/ u/ Z* ?" a6 M N - v4 = sub_40BB44();
6 t2 `- i9 b4 O; W& n - glRasterPos2i(x, v4 - a2);( y& l0 n' \' _
- vsprintf(&lists, a4, va);
8 T5 L- x4 L/ X. a/ ^ - glPushAttrib(0x20000u);+ E, P3 ^! m" I3 b
- glListBase(base);) `' D! B" F* G. K
- v5 = strlen(&lists);
8 z3 O+ q: C+ M; v$ v - glCallLists(v5, 0x1401u, &lists);/ T! L. q B8 u) A) i8 j" ], f1 M6 Q
- glPopAttrib();4 V1 Z2 a% p7 ^* Q( ]) S5 D* u. `+ K
- }- A4 z: F* H0 p1 N0 O
- }
复制代码 6 b* Z l7 Z @; j1 O5 p8 ^) S8 w% K
7 U. Y0 a2 Q6 P3 z$ i( y7 t2 C4 A. V g6 C4 R; p
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)9 g) u0 Q/ e7 u% {, N1 r
- {1 {$ w7 f7 y/ Z& I3 [! T& q
- GLvoid *v7; // ST08_4! D2 V X4 O, K
- GLsizei v8; // eax
5 K0 y' C% H" G9 k0 I l' C# F - int v9; // [esp+0h] [ebp-1018h]* ?; I/ ^( ]" Y+ ~. o) T
- char v10; // [esp+8h] [ebp-1010h]/ L% X3 h5 h1 ~: ]' M. V3 Q+ B
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]% z4 ] U7 D! v5 r2 ^6 Y
- char v12[5]; // [esp+1013h] [ebp-5h]
! l9 N2 a- _4 n - va_list va; // [esp+103Ch] [ebp+24h]
' f+ V. E' m0 _. B
) \# g) T8 Y- r( j. l& u# G- va_start(va, a7);
' f# ]# M' v8 j i" P - v9 = 1;
; [! E" a7 u7 A, M! J! u5 P) t6 ^ - if ( a7 )
* f- \7 y5 `5 y' ^# R R - {
' ]0 Y& Q9 X+ L$ l - vsprintf(&v10, a7, va);
$ T3 u8 E* V7 B. T; y - glPushAttrib(0x20000u);. ] J7 s ~- {
- glListBase(base);3 P: s/ A. X. ?! C0 P$ b
- lists = &v10;
0 n& H, p/ ?6 h$ G3 ~# L - do
7 z" i" @; b0 R) ~# G - {
& `; u2 [) r7 c+ x3 U& Y - *(_DWORD *)&v12[1] = lists;
3 [4 q: _ m6 y, E% `# ? - while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )4 D1 y$ A: C5 A; J7 M
- ++*(_DWORD *)&v12[1];
' k( R5 C9 ~6 H6 C - v12[0] = **(_BYTE **)&v12[1];
7 Y% u \$ H( N; i! i - **(_BYTE **)&v12[1] = 0;
8 r( B2 P3 X8 j% }9 Z - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
$ @1 p. R* b+ A5 r. |5 @ - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
; [- X4 x( p# c/ `4 N3 ^ ]: W - y -= a5;
2 N! ^% Y' C5 X! g9 e4 m - glRasterPos2i(*(_DWORD *)a4 + a1, y);7 ]) C5 H$ U+ ~5 |
- v7 = lists;
. }/ S% y3 ?5 N s" k - v8 = strlen((const char *)lists);/ M8 Q7 W% o8 u7 D/ |
- glCallLists(v8, 0x1401u, v7);
5 C2 L5 _, b# f% G4 F - if ( v9 < a3 )
. ?1 B1 _* A$ t+ r( H( d - a4 += 4;$ B2 e/ F1 Z' s$ g K! r. [" Z
- ++v9;
3 W- w: }+ j) n1 K, O - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
8 j7 H# d( I6 a7 A - }( \; G, L" t( N: D$ l; ^- o t) Q
- while ( v12[0] );/ t5 ~( I1 a3 @3 N. W& z
- glPopAttrib();
9 j4 _, j. b/ D2 d B! p* s! W - }
$ x$ h$ X! h% e5 P8 u - }
复制代码
b: P/ x/ C' e+ \6 @
/ |! @0 I5 L1 q% `7 ^ _3 R; f+ J! ? S. a* X
+ Q4 c: [+ c6 ^8 @: D7 @
; X0 w6 m+ s6 w7 }# _% [/ O6 t4 P
: \' C! [, e6 F: x5 J
9 U0 I$ K: J/ c3 C2 a" C
3 D$ H7 Z0 q$ t, c; |4 o |