本帖最后由 shane007 于 2023-9-5 15:50 编辑 ' h7 v0 o* }3 }; k; c5 D& t8 G0 l( J
" {7 W/ Q/ Z8 D2 f- W5 VglCallLists的调用处,共有三处。
0 w2 I+ j9 ?: K% O此三处估计是对应游戏中三类不同的字幕。' p/ P3 [2 z* @9 N) j* b1 [
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
; ^3 k( f& C+ c' }1 b分析的文件名,748 KB (765,952 字节)
0 t" L# x: o/ p/ w# atoh.exe
7 R: X A4 C! n0 B I
* c1 Z. i& v- M6 y经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
: ]2 I6 G2 v6 z. g8 e等日后再仔细研究,看显示函数究竟在哪里。
3 P0 s6 C& H2 \$ m# e8 [7 z- ~6 w& K% ]8 l# S# P2 L
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
e$ I2 H' |6 V0 F! Z, t7 H# Q004316C8; a$ ]% }8 Y, W$ u4 E6 O) j) N# p! h( i+ i
5 B5 A9 G; b: _$ r! u X第1处
! F- K2 q+ b7 v1 R% _- void sub_4519B8(char *a1, ...)) J0 J7 C) h% n2 u8 L5 ^
- {; V7 ^9 ]# q2 i4 y0 l
- GLsizei v1; // eax* k$ E9 j' K" Y7 P/ c r5 p
- char lists; // [esp+4h] [ebp-800h]
7 z' D, B. r* t( ?0 V - va_list va; // [esp+810h] [ebp+Ch] `- Z7 G" @+ O3 h; D
- ) a! |" f( Z& {
- va_start(va, a1);$ g \. }( z+ S0 L: s- _0 R
- if ( a1 )- s* Y d5 P4 }# e! B
- {1 o: h# q2 Q7 I `2 \) e
- vsprintf(&lists, a1, va);+ V5 Q" u! z% V: M3 X; ~1 P
- glPushAttrib(0x20000u);
, |0 k; E* n. T, ]% \ - glListBase(base);- O* I2 y. \3 b y/ M: l3 G
- v1 = strlen(&lists);" f0 v( }+ x; Y* }) O$ R% @! e
- glCallLists(v1, 0x1401u, &lists);
5 \ E% h- B2 ^ B0 C4 K/ J1 f. ^ - glPopAttrib();
& z# h; f6 p' N; E - }
" y+ ?& E) z$ A4 I7 Q6 ?: \- V - }
复制代码
" Q Y, Y X1 I" G第2处
/ J+ `. ?+ ]9 }- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
1 x6 f: `) |7 o2 L1 [ w - {: m7 N* m5 ^( a* o8 {$ r B
- int v4; // eax# P6 T @, m; v
- GLsizei v5; // eax
' s) s7 {+ W7 a) H/ @2 k# d# M9 k - char lists; // [esp+4h] [ebp-800h]
# d, Q( y# R9 A( \0 O - va_list va; // [esp+81Ch] [ebp+18h]
6 v, a0 i! A1 K% Q
. k0 u0 \4 c2 o+ ]( \- va_start(va, a4);
2 Y" m4 A3 C/ I/ n/ p; N - if ( a4 )* @5 i0 B3 T5 H/ c, E. {
- {3 c! y1 {3 U: V% o. g1 I
- sub_44FDD0(a3);
% T6 {- [/ r1 }# u) f* W$ ] - v4 = sub_40BB44();
, @. ~* ~4 D0 ~" Y* D5 w - glRasterPos2i(x, v4 - a2);9 p" _8 {! V, O/ E
- vsprintf(&lists, a4, va);$ |' o+ T0 Q4 {+ m
- glPushAttrib(0x20000u);$ k- Y k3 ]5 s3 ~% Z% y
- glListBase(base);, M6 Z# ~. T3 l$ ~
- v5 = strlen(&lists);; I6 Z9 H0 x {& ?3 H" ?1 Z, A
- glCallLists(v5, 0x1401u, &lists);
$ Y, g! | m! g: [! W! s - glPopAttrib();
8 N' k. q/ f3 H7 T1 W" ]: a - }
1 m9 i& V( ?/ W1 Z% ~7 | - }
复制代码 - D; w$ E: H+ H7 f, R. s
# Q) n9 K0 D, m
9 n9 j7 Q! [2 A9 r( Q& X" @( Z
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...); v# O$ r0 m; c( ]
- {
4 ^2 s6 v1 {% b. N) y0 Z - GLvoid *v7; // ST08_4- z! U8 M& O+ i4 z- j" z, m3 t
- GLsizei v8; // eax! b" R, u8 W2 j/ r2 A3 b9 b" T
- int v9; // [esp+0h] [ebp-1018h]! @: p6 @- u/ L. N
- char v10; // [esp+8h] [ebp-1010h]+ O# h6 D$ W" E, [ y* y: F& p
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]
, A7 j, J8 ]5 |! R+ U# d1 N - char v12[5]; // [esp+1013h] [ebp-5h]
; S$ U* J& D8 f% H7 D! ?/ f7 I( y% x m - va_list va; // [esp+103Ch] [ebp+24h]! h& Q& o" U. o$ L5 A/ Z
4 E. Q, W( X2 q- c- va_start(va, a7);
- a0 U. W9 t( f% Y - v9 = 1;, U& p* @1 I; @( T; p
- if ( a7 )' N& D9 x9 ]+ j d- c' q
- {
% J) n0 n% I! o - vsprintf(&v10, a7, va); @! t6 u* q7 l" _
- glPushAttrib(0x20000u);
7 E# C" w% p# L. V - glListBase(base);4 k; z% t3 f) t6 S1 Z
- lists = &v10;
. @- q+ s* n9 E$ X+ ]( q X - do2 d" M( p) T/ }& t5 A1 S. U1 M
- {" e: Z- W" M& n" E. Y. O0 _* k# z
- *(_DWORD *)&v12[1] = lists;4 ?" w @8 ~+ @8 B
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )0 M+ X! P! b, t9 g
- ++*(_DWORD *)&v12[1];2 `2 N; P t6 @9 Z9 `* ]& n% m
- v12[0] = **(_BYTE **)&v12[1];* h* O) b2 R1 H3 W
- **(_BYTE **)&v12[1] = 0;' o7 H' a8 K8 g
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
; c- z; E& ~( U2 ^) U5 k9 u - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0; g$ @/ M* @& h4 M
- y -= a5;
) O8 p" L' _3 ] - glRasterPos2i(*(_DWORD *)a4 + a1, y);. Q% y: X% ?, [
- v7 = lists;
$ |. s+ H* t u9 y# X- d - v8 = strlen((const char *)lists);
* r C, u" V! B% V5 _! ? - glCallLists(v8, 0x1401u, v7);
2 E: \! F* @: @* C. D0 t% G" ` - if ( v9 < a3 )0 y3 F# R% V' g2 O) A
- a4 += 4;
5 B' G! K& I( q9 x* l - ++v9;
6 m( Q. C8 o" L1 C: [ - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
2 ^, C/ D0 U5 y% u/ N' C% P) { - }2 \/ e) v, R2 g" b) \- c* S
- while ( v12[0] );
- G. [$ J- Q' d5 F - glPopAttrib();
4 F$ }3 ?" z. B* P. c3 s - }
+ J( W2 P; b) J8 C: `& b. b - }
复制代码 8 z: Y' i" F& F: Y
i) F2 K" e. V2 E/ J
$ B) u- o4 H7 @# p3 U" m: i
2 l: A" b7 h) K2 U3 ^( c( B0 ]
$ N `& Z& i" v/ K8 u0 f8 k
, Z1 K V* ]9 C5 q6 b6 j7 q* V. i# z& c
& K- @, u1 g+ `0 E7 }$ C: g" [2 i# ~/ ?
|