本帖最后由 shane007 于 2023-9-5 15:50 编辑 0 N& _# q6 q; ^( Z/ Z2 i
" I% f2 E. f$ [8 [2 |glCallLists的调用处,共有三处。4 X" d7 i" }( `& w4 N, ^3 e
此三处估计是对应游戏中三类不同的字幕。
7 i F: h o/ \" Q4 {" ]接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
+ A: X/ ]2 X% K分析的文件名,748 KB (765,952 字节)
9 ~8 R& Z$ @; W) S: Qtoh.exe) |( n( D( ]/ u9 k4 E
+ P$ ~8 R5 M2 q+ \' p经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
: J8 K1 a/ M3 d* D0 f等日后再仔细研究,看显示函数究竟在哪里。
# x& i* Z% [5 C4 H- H* }- S4 l7 k7 _. {3 V
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
3 v5 d" g* l( k! _, z R6 Q* V004316C86 x* ]: e. Y) `9 \: n/ j+ ~
& G2 p8 U, d5 p3 u2 e% p
第1处
' s% _' Y; _- t1 D- void sub_4519B8(char *a1, ...)1 ^( R) }$ r" e
- {8 f/ ]- m1 D" J/ S6 [0 T
- GLsizei v1; // eax" U3 R5 w& x# l% Y# n
- char lists; // [esp+4h] [ebp-800h]
% W* g3 [! ~/ Y! ? - va_list va; // [esp+810h] [ebp+Ch]
0 d' I& K9 O$ b7 j5 w - " c- M. A$ B) m) J
- va_start(va, a1);
5 `3 {: f% A$ Q( T - if ( a1 )' O1 M: t/ T$ F' d9 E
- {* |2 G8 M$ r g
- vsprintf(&lists, a1, va);
8 j) X( i# C' v3 N; }9 @1 } - glPushAttrib(0x20000u);) i0 o8 H, v Y7 ~( J
- glListBase(base);
5 ~; v W. T; v; W6 F( G0 T; ` - v1 = strlen(&lists);- ]- l x" ~% H2 e
- glCallLists(v1, 0x1401u, &lists);
; Y: ~& p; T' p/ _ - glPopAttrib();
8 Q& n: s$ }* t1 Q) t+ \% w- w2 t - }3 A% `. v }; T8 e& h0 B) s# Z
- }
复制代码
( a8 y6 @9 v v# X5 s第2处2 Z+ d) A5 m3 O# B* _
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)5 ^ L* S, V. G. B% Y
- {
+ K2 X2 g4 B2 S" ] - int v4; // eax
5 X, C/ b6 c1 Z7 F# j - GLsizei v5; // eax q, ]( D/ ^! S: g8 p
- char lists; // [esp+4h] [ebp-800h]
$ M! D* I$ [; w# `, } - va_list va; // [esp+81Ch] [ebp+18h]
2 J0 ?( N* @# q7 O - ! o- H$ J; R; |4 {
- va_start(va, a4);
) p) l! X" z7 [: ? - if ( a4 )* m. b. m; H% _ b9 x s
- {: Z% p6 {) R% M1 P- m
- sub_44FDD0(a3);
+ n3 b2 S6 Y- y# b - v4 = sub_40BB44();- ^7 ~7 W/ g6 B
- glRasterPos2i(x, v4 - a2);4 \" _' r5 n8 z) z
- vsprintf(&lists, a4, va);
' M5 ~( W; F* H3 O: b. y - glPushAttrib(0x20000u);
4 _! d- Q) d: B4 ^6 r1 M0 ]! m - glListBase(base);
$ b+ L; @' e7 P - v5 = strlen(&lists);
& z$ v: Z1 V8 b# P# C- w; K1 P - glCallLists(v5, 0x1401u, &lists);
% y2 C k- \7 v. m8 j - glPopAttrib();4 R8 S4 ~5 z! u) T& J* }
- }
0 Z3 T. S( L$ b/ Z; K, S( W - }
复制代码
8 {; a0 J9 J; C4 {$ C2 @5 Z/ W1 p, h7 A
5 {3 H2 {) ?- S& ?第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
+ _7 r0 P; e; N. @6 S - {
- E8 W* e6 [+ B" M% _4 O - GLvoid *v7; // ST08_4" Z& J3 e' C1 ]& n! t
- GLsizei v8; // eax
6 R+ f: @) p* W" M# {* U - int v9; // [esp+0h] [ebp-1018h]
8 ?* M- ~* O. U" V/ J2 V6 {# q( t - char v10; // [esp+8h] [ebp-1010h]: L' R( n8 K) G, U! O2 C, N
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]
3 k! x+ b4 r- w) i2 g - char v12[5]; // [esp+1013h] [ebp-5h]4 y7 b/ e" o( |2 E5 p8 U( ]' U
- va_list va; // [esp+103Ch] [ebp+24h]
$ W0 p9 W4 Q! X- n9 X6 F6 j - ( K& K- m/ x; a$ t9 z
- va_start(va, a7);0 |2 B8 b( {7 }7 j! _: b
- v9 = 1;5 S( B; k) X8 [: m7 o- a- \
- if ( a7 )0 R& c3 P6 R9 d# b7 _
- {+ s/ d- l4 e4 w7 L' L3 x9 i" [
- vsprintf(&v10, a7, va);
9 V' ? w$ G+ P+ f$ K - glPushAttrib(0x20000u);- [, j$ V# f H3 h* f0 i
- glListBase(base);# S- w. W( J2 D
- lists = &v10;
- w) r& x5 V9 L- |' E# e9 n4 w - do3 T' w, j# R( J4 y: _7 X8 a
- {
+ x) ?- W' Q) s9 g) @8 I - *(_DWORD *)&v12[1] = lists;$ j- D: |0 Z/ n3 g7 O
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )# e9 d5 B1 `1 C
- ++*(_DWORD *)&v12[1];
: D, H0 d3 N9 n, Q; B9 }/ H0 ^ - v12[0] = **(_BYTE **)&v12[1];/ O! ^( d3 ^, L
- **(_BYTE **)&v12[1] = 0;. O/ G1 P* Y4 J/ g3 p4 q
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )% I* D/ Z) k- E% [
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;. J0 C& I: ?0 s6 S( l. @% w0 H0 E. x
- y -= a5;
+ C! U l; A& `# _" c+ U - glRasterPos2i(*(_DWORD *)a4 + a1, y);! o% x' p1 y! N5 I" R- ]
- v7 = lists;
! s- U7 W4 E& ^. K - v8 = strlen((const char *)lists);# e" {2 \% L2 b( R( B
- glCallLists(v8, 0x1401u, v7);" l8 h* B6 J+ y
- if ( v9 < a3 )
9 u1 J% H/ P- G6 d$ i8 o - a4 += 4;$ f w1 Y5 |- p ~7 X- K! y
- ++v9;9 a% ?7 E5 W( m& z; x/ @
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);( I4 \6 s# g: h! }0 K! P
- }& G! M2 }* B6 t/ o6 A# Y
- while ( v12[0] );- J; J' y; e4 H& A c
- glPopAttrib();
& M7 ?% Y& i2 o" ^ - }
' g3 b$ Q! x* s: S - }
复制代码
! l5 H4 @' @) m+ {1 n9 L
- Y- e8 A, s! B8 }: M$ S$ O9 U! ~
3 ]0 X6 J2 J7 `1 Y
( |4 H! B! I# D y4 ]
+ o4 M( K6 D3 d; x! {0 c( e8 l0 n* f3 U T0 _
' ^* d5 s' h4 ~3 p1 E7 e0 o" d
1 Z0 l. L) z% e( P5 W' f; @ |