本帖最后由 shane007 于 2023-9-5 15:50 编辑 1 w0 i5 Q3 b# u
3 M3 h; ]: @; v9 r/ oglCallLists的调用处,共有三处。
8 O+ Y, X( L+ Y& Q7 n* y4 i此三处估计是对应游戏中三类不同的字幕。
8 g$ w' [6 s1 c# R' t4 r3 u接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。! q1 O* B x: J
分析的文件名,748 KB (765,952 字节)% L6 A. l u7 q* o+ ]
toh.exe. E3 K. |( k0 y
6 T. f4 J. U# a- l: Z; z4 d1 T3 Q
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
0 _. S6 [( D2 w1 R等日后再仔细研究,看显示函数究竟在哪里。. _* { T, q. H( v* M+ _$ m! D+ f
+ G* [5 O5 U, l" i4 u Z; S. s6 P9 j
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
: C- l9 [0 C% B9 ~004316C8
/ Z; p4 w9 h3 g b( e( J; c( k+ ~' a+ T5 O. @. ?2 I
第1处: C: l! p% N7 K* `7 T
- void sub_4519B8(char *a1, ...)
% N4 l0 w) v* [+ {( }7 C" s# W! g - {0 i4 L+ m- Y/ H( M w
- GLsizei v1; // eax( ]% w2 U& U6 Y% i( ?5 ~
- char lists; // [esp+4h] [ebp-800h]
, ^% N7 J2 o% B% a - va_list va; // [esp+810h] [ebp+Ch]
9 r# S1 `$ {# D$ p, X$ Y' |+ D - 5 s: \; M# l6 G# X0 p% W
- va_start(va, a1);
$ T4 S) m2 U. K# C3 E7 p - if ( a1 ): b1 H( h) D+ y5 p' O" |! q
- {5 ]1 ]# }$ F9 [4 e
- vsprintf(&lists, a1, va);7 o( o+ v6 U7 I
- glPushAttrib(0x20000u);) s$ }: d! u b |$ h- z+ K
- glListBase(base);7 Q1 s9 ~, G' Q# S+ T% T6 P: a
- v1 = strlen(&lists);
( P, A9 t+ q! V- M; N7 _9 j - glCallLists(v1, 0x1401u, &lists);9 `) q5 Q6 d; C# p8 |* }; l0 V& g
- glPopAttrib();
2 F9 M: V0 s1 F" s - }2 I. T: S$ s9 U& J; `& _
- }
复制代码
" R! r& C! C* p' X7 w5 h第2处( }+ T1 y: P& n1 |! P) Y. `
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
* h9 V+ A7 C3 i( O1 T- d7 R - {6 j Z( U- P, Q: n4 Y
- int v4; // eax2 @2 v& x l z
- GLsizei v5; // eax/ o6 D; M( |6 ^% j
- char lists; // [esp+4h] [ebp-800h]& n* D7 R/ s" |& d! o
- va_list va; // [esp+81Ch] [ebp+18h]
2 H( O' y9 [& Y4 _
6 b+ n+ e9 f- o$ Y- va_start(va, a4);
" ^* @" J4 w4 x+ G& A ~ - if ( a4 )
/ v. X* j' I( i6 V - {9 W" q. G; l: q5 k% I& w$ }
- sub_44FDD0(a3);
; v' r% v- H/ H! q2 N4 ]! N. J - v4 = sub_40BB44();1 Q* p2 T, _ n- O6 J1 y
- glRasterPos2i(x, v4 - a2);
2 V( L. q6 N3 K% a0 g - vsprintf(&lists, a4, va);
: D* m# i6 U, ^2 E8 u. N - glPushAttrib(0x20000u);& V+ f6 ~+ f( R/ G; E# _; Q' E
- glListBase(base);4 F; o8 [6 w$ W( P p/ O3 N. p
- v5 = strlen(&lists);
/ s- Q; J( j/ h! o3 J* ]7 f - glCallLists(v5, 0x1401u, &lists);4 O1 D' o, x- r0 i+ j
- glPopAttrib();; U; J. a. |1 [ A+ N, m
- }3 W- ^8 [ V% k8 `$ n% Y# j
- }
复制代码
) o2 j, h, S, y0 q. u) l, J
6 x5 [* I g/ y9 ~, C9 @0 U1 A' ?" K6 f( s; _
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
7 b) q6 ?1 X R1 E/ B" _* h2 h- [7 k' ~ - { N& w! {+ Q7 `. w# l
- GLvoid *v7; // ST08_47 M, m& K2 F* j' |4 @' w
- GLsizei v8; // eax
8 s( M7 ~! m8 m6 X: E$ J' D - int v9; // [esp+0h] [ebp-1018h]8 F. i4 z* J9 `7 @$ r
- char v10; // [esp+8h] [ebp-1010h]8 {4 N8 u. Q/ `; U. ]
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]
; q0 R# Z6 a# D - char v12[5]; // [esp+1013h] [ebp-5h]+ z0 H. z5 ~2 p. V
- va_list va; // [esp+103Ch] [ebp+24h]' w: X9 Z4 P7 [5 n0 j- I# Y# d
3 s5 s; B/ g5 P( V- va_start(va, a7);
4 i4 n0 x$ y M, s - v9 = 1;2 L: V3 f% ?! \$ q( u) K1 l5 v
- if ( a7 )
9 j& E |2 F$ z& S# A8 m% A - {6 {9 c q2 f4 k% B
- vsprintf(&v10, a7, va);
G' _: @, O( N! P: } - glPushAttrib(0x20000u);
' N$ r; l0 @1 c$ } - glListBase(base);# F. v) E) n; x( V/ O: S
- lists = &v10;
( B2 _& U* s1 D4 s. f( @! A - do6 f p% V- q4 O3 I
- {) R9 A& M' g- J0 C
- *(_DWORD *)&v12[1] = lists; d1 j! |9 d. f1 a
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
& f% _2 c" o L$ } - ++*(_DWORD *)&v12[1];7 d0 W* m: b/ Z9 n4 M1 q y
- v12[0] = **(_BYTE **)&v12[1];' i/ e% v9 F' M5 y4 y4 z
- **(_BYTE **)&v12[1] = 0;; r; e* I3 y+ _6 Q( n+ H3 V
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )$ w8 f# a% ^6 [
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
% ~3 o. H" s; I/ N7 p$ O& Q1 f - y -= a5;, z! o* b6 ~3 c$ Q
- glRasterPos2i(*(_DWORD *)a4 + a1, y);1 O3 A% |0 R3 s+ Q p* R
- v7 = lists;
3 ]1 y+ H( T4 x" {6 _ - v8 = strlen((const char *)lists);
" y' b0 X5 P+ i, c# I - glCallLists(v8, 0x1401u, v7);
1 j- }8 |+ o; {; o - if ( v9 < a3 )
# G* W \) a* V9 b( Y# u - a4 += 4;
* m/ N9 |: X( Z, Y4 r: q - ++v9;6 Q7 f5 \7 U# R6 u3 u6 V
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
. W) m+ R L9 t- f2 }1 Q - } Z, g a7 R4 g. K! U# h! v
- while ( v12[0] );
+ z! N/ E% o0 H5 g+ e4 ]. b% [ - glPopAttrib();* [1 t6 ?( T4 V$ ?% B3 Z' s7 m
- }
1 A+ _+ s7 y8 q5 ? - }
复制代码
' [* t' j# o! z$ y$ U% H8 O
6 N8 Z8 n) H$ l4 q) O
3 L1 @7 e1 G, S# w/ W/ M# m3 J, c0 ~) o1 o" P. Y; e
2 S# B, W6 y) `5 }$ f: {( A$ v0 n- h" ^- t& P" ?3 B7 e
5 w: h$ u( o/ A. h
# f( u4 H: v& i/ ~: V$ @: }
|