本帖最后由 shane007 于 2023-9-5 15:50 编辑 ) W1 t6 `8 E" k
- h% e7 b8 j( p8 E7 u6 cglCallLists的调用处,共有三处。% N7 ~' N5 N7 q# \4 ]8 @
此三处估计是对应游戏中三类不同的字幕。
- B) \2 |2 v5 y1 m接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
; p- L1 C7 w6 k$ }8 C. f; L) [分析的文件名,748 KB (765,952 字节)
, ]2 j$ W! G/ o% C1 gtoh.exe- `) F: F, G% a ^# n
% A' ?2 X( g5 V. I& \经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,- |8 @# x4 r8 q- U- d' y
等日后再仔细研究,看显示函数究竟在哪里。. k7 G: j9 q$ N) V: y& g
6 h4 w+ x0 S$ V
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
. U, R1 X! d! Z7 Y% L; C004316C8
9 P% _/ W8 `# s b- r0 g9 j2 |% q
! b5 U. d- d C第1处0 L$ S, I# k. ?9 }
- void sub_4519B8(char *a1, ...); d1 L; x9 S9 A Y1 d8 _* ]
- {! g& l7 g0 y# E* c2 g. b/ J2 i
- GLsizei v1; // eax
& f- ?) E1 l9 A; a0 m1 K0 n. { - char lists; // [esp+4h] [ebp-800h]( f$ g. Q5 ]; S: w+ J
- va_list va; // [esp+810h] [ebp+Ch]
% e3 r: h' `, `/ o' v - / |2 W2 R( c% u+ P$ k3 o
- va_start(va, a1);
7 q S8 X9 V* y/ q - if ( a1 )5 n3 r; o' u$ _6 M, p% I3 S' B
- {/ T# h9 R0 c( h
- vsprintf(&lists, a1, va);" B) K- K2 {5 j7 w" A, W' t e! O
- glPushAttrib(0x20000u);& C6 U' L, j' V: q8 n3 F+ t) {
- glListBase(base);9 l' f: M3 ^5 O: F2 D" P
- v1 = strlen(&lists);
7 ^. @, z$ P% H3 X - glCallLists(v1, 0x1401u, &lists);
( q. {$ t0 C3 m [: O; ^3 \ - glPopAttrib();
' A6 m7 ?/ E4 u0 s, K4 Y. y/ u& f - }4 J( v! d; I6 Z1 H8 k% C
- }
复制代码 % Y; `3 J8 J7 c6 F6 g D
第2处) X! @: M: S: D' C/ T
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
. ^0 T# q5 r1 p$ A4 _4 l - {; T1 D: A) Y8 U2 Z: u
- int v4; // eax" o0 P3 J7 B x! Q3 D
- GLsizei v5; // eax+ x$ y& F0 q$ \' @) }" e
- char lists; // [esp+4h] [ebp-800h]6 @ H$ q# e! t' n
- va_list va; // [esp+81Ch] [ebp+18h]
5 a. m0 @+ K" v; e3 o! N2 E0 y; i
) ~+ p3 Q# O# f: Q- va_start(va, a4);/ D! m3 R8 i5 T1 a1 n$ n+ L9 p
- if ( a4 )- e( n, o% w9 p( `
- {: n6 F0 Y( l+ W1 k: I4 J
- sub_44FDD0(a3);
% j b# T5 H& h9 A! s- a0 e& ~ - v4 = sub_40BB44();
5 b# q6 Z3 U- _8 p& A2 k - glRasterPos2i(x, v4 - a2);
) v, L. Q6 S0 I- W - vsprintf(&lists, a4, va);
3 @+ V' S/ v; R4 `- y& Y3 B4 g - glPushAttrib(0x20000u);
Q2 o- f+ }7 Z7 {% _- \ - glListBase(base); x: w* x4 }' B5 Q
- v5 = strlen(&lists);
h0 N# y; ~+ D+ W - glCallLists(v5, 0x1401u, &lists);
1 @. N2 ?8 i+ a) m1 ] - glPopAttrib();
: L9 l2 d! \+ S4 A# R8 `: s - }, I1 M3 m0 ?6 Q: W3 T6 [
- }
复制代码 ! C0 [2 F3 k% i. t6 I7 T
: Z, w& c% ^( M3 p% l3 Y C1 W
! g5 f/ T* ? W7 [9 y第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
8 e0 E7 s% a+ P9 e" {- d% ] - {+ W! A7 N4 D7 K
- GLvoid *v7; // ST08_4+ ]' `' F8 q$ L- f r. m
- GLsizei v8; // eax" ?) v3 p) W5 \9 {5 x9 A; H
- int v9; // [esp+0h] [ebp-1018h], s6 }; g" d- W3 `
- char v10; // [esp+8h] [ebp-1010h]
2 d& P0 w3 B) c( a" Y% V - GLvoid *lists; // [esp+100Ch] [ebp-Ch]
" s: W* c8 [+ S1 e4 F }3 `0 D - char v12[5]; // [esp+1013h] [ebp-5h]% E' C3 Z6 l1 z
- va_list va; // [esp+103Ch] [ebp+24h]
! j2 S: q. h7 D8 `) w6 A2 p - , k. f1 t) a: S, |/ i& ~
- va_start(va, a7);3 S- Y2 z7 ` [3 F! p4 E2 \
- v9 = 1;
/ P- [+ Q! K2 R9 \1 j: M0 p - if ( a7 )% q0 I) Y- Q4 A, x/ v: Z* H/ ^' I
- {: |& |$ v2 P9 N+ V4 s$ A
- vsprintf(&v10, a7, va);
; A2 z' `* Q- d5 y! Z. u - glPushAttrib(0x20000u);
- B1 q8 r' ~3 V - glListBase(base);
5 y) r+ |2 u6 f$ N, W# B - lists = &v10;
2 C; z" t( y$ x9 e, T% d6 { - do8 R$ G) Q. V# X# f" o/ O) l
- {0 F5 d7 e) Y8 F4 ^
- *(_DWORD *)&v12[1] = lists;" w% E% R& _; G1 O
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 ), j2 j3 t0 O+ X; ^2 N
- ++*(_DWORD *)&v12[1];3 I/ d' _" D) N# g/ a4 t
- v12[0] = **(_BYTE **)&v12[1];. \: W; R$ S0 F9 K% `; ~
- **(_BYTE **)&v12[1] = 0;
1 m- z. A# `( q% q, K/ z# w( ]5 w - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )5 W+ R) l! g8 G% w- m" z+ s
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;4 u1 e, u n1 W, n5 T
- y -= a5;
" Q Q8 N8 c2 k% ?$ G2 T - glRasterPos2i(*(_DWORD *)a4 + a1, y);
/ m' l) c1 g7 y/ j7 L - v7 = lists;
' A% T" R- Y% j/ i5 V3 L( _ - v8 = strlen((const char *)lists);# S# d* S" T8 q- ]0 \$ i \
- glCallLists(v8, 0x1401u, v7);
; Y5 b* v$ }. j2 H: d! t8 F. W - if ( v9 < a3 )( {) F, F( K2 x# J. w6 [" @# h
- a4 += 4;
3 w$ [3 k; Y% x8 K, g - ++v9;
* A& {! A0 e' U6 S k - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
2 M! S; e# |8 c$ W! d+ M - }9 y% s/ ^- h$ L. j( r( `5 Z j
- while ( v12[0] );
6 A+ A. P7 G: l5 G% f# ]9 m$ d - glPopAttrib();
1 g0 C- c, U' y( D" L7 o - }; k0 ^6 T @% D- C- _! y8 x7 f8 x
- }
复制代码 " s0 U. H: ?% ]
2 z0 e/ p, I0 k9 r
. J8 ?8 E! e* r0 `0 J8 p6 { c, f2 }# v1 f. n
+ ~. ]! u" y+ R" f6 J. W
F0 V& ^! t }. @9 ]) z
( ]" b/ ^1 P+ N# i
/ H( P8 ^5 }; T1 M* { |