本帖最后由 shane007 于 2023-9-5 15:50 编辑
( Y# P4 n& x$ j+ U- J- \- a3 z
, V1 x; E ~6 `glCallLists的调用处,共有三处。; h' \2 p! Z' H# X1 Q
此三处估计是对应游戏中三类不同的字幕。9 r+ h# x; K( m' p2 U# [$ O
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
+ M- [6 |; {6 u+ e分析的文件名,748 KB (765,952 字节)9 J. B1 ~( k' ?9 H
toh.exe
6 ~- w5 Q" o1 ~3 q
) y" W" o9 E2 p2 S经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,3 U$ f$ v& Y+ L* g
等日后再仔细研究,看显示函数究竟在哪里。9 P" _0 L% H0 ?; I" O
( S2 j Y0 l4 C/ \5 k" {, htoh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
' s( A1 r& f+ Y6 c B7 r004316C8" K i9 U' | @0 P- D* h
2 A3 ?) m+ a' o( l- _- X第1处
3 S+ e/ w5 ?" N9 t6 _: z7 I( \- void sub_4519B8(char *a1, ...)9 U* g4 |7 m, q3 A" h; z9 D
- {
: M/ ~) q6 [2 P8 P+ B; R' x - GLsizei v1; // eax
) y/ \' J5 O. g' {" _ - char lists; // [esp+4h] [ebp-800h]
0 [9 |7 v ?, y% z/ H" K9 A - va_list va; // [esp+810h] [ebp+Ch]
3 B, G8 q: R8 W; t& v# q- i
2 Q# `7 D( ]) f: I% j1 F- va_start(va, a1);
}2 h) a1 G+ H1 K" O - if ( a1 )
# C* H- u1 ~4 W+ |/ G/ f - {, s2 ?$ z0 P" C6 r5 W& A* U
- vsprintf(&lists, a1, va);& L0 D, p) ^! ]! I
- glPushAttrib(0x20000u);3 L3 u+ C+ e6 ~
- glListBase(base);
8 B" N! e- ?% z) z9 z; o* Y7 H& ^ - v1 = strlen(&lists);
6 G1 @- X9 ^0 j. U! I - glCallLists(v1, 0x1401u, &lists);0 B$ J4 o7 o8 x+ T. v
- glPopAttrib();+ N6 k- z% R6 G; B1 [7 E9 {2 c
- }8 x* Z, u' t$ e9 t
- }
复制代码 / V: }% O: p: P2 y7 {6 ]# K. K
第2处% W* }) [+ Y1 y$ u* h
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)% G# ~) o/ X5 U' [8 Z/ F- W/ f4 u
- {) y$ `% i. s* B! g e# e
- int v4; // eax9 W) P! o$ l5 ~( r- E
- GLsizei v5; // eax
) `5 u& c$ Q8 Q% P$ T - char lists; // [esp+4h] [ebp-800h]5 }3 ?8 K8 G9 w5 l9 u& |
- va_list va; // [esp+81Ch] [ebp+18h]
3 l% o, q$ m. S% p
8 P- ] i: a- B' ]5 A- va_start(va, a4);
! \* ~; a" S* M* z - if ( a4 )- t. A. J& m) F7 o( V2 r/ n# T
- {
% n0 F- K- X, q* t - sub_44FDD0(a3);4 y3 b5 y' C# o! x5 J7 z- y+ w1 z: ]
- v4 = sub_40BB44();6 r* }/ q+ p( _
- glRasterPos2i(x, v4 - a2);4 X9 r0 K {. y; C7 A9 \
- vsprintf(&lists, a4, va);; {2 s" x5 _+ y8 z
- glPushAttrib(0x20000u);; @5 @; F" [2 f
- glListBase(base);
$ V0 \: H5 S3 Z5 H% v - v5 = strlen(&lists);; j% a! W' _4 x% L
- glCallLists(v5, 0x1401u, &lists);8 [. d5 y, y9 c+ Y' U8 B' U
- glPopAttrib();* y4 Z. U8 ]; x! _
- }4 S6 s/ h; \- L7 y5 l$ F
- }
复制代码 " O4 W. u+ B/ W9 j; c6 L
: T( _- E( H. B
9 F5 C+ w, Y9 j: x1 y l* u( H4 J第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)2 |6 @# G- A2 D, H8 F0 _* b
- {
& ?2 ]4 R# s0 Y' {4 J) { - GLvoid *v7; // ST08_4
0 K7 s2 ]# Q% ^: v/ i% b - GLsizei v8; // eax* B- J/ e3 l# x, y- ?/ Q0 N
- int v9; // [esp+0h] [ebp-1018h]- |1 M4 n! L# i6 ~, c% U$ a
- char v10; // [esp+8h] [ebp-1010h]+ H( e& F- _, m8 J% U+ e/ R
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]3 B) s+ o: h, i
- char v12[5]; // [esp+1013h] [ebp-5h]
5 y1 E% k& d- u9 C - va_list va; // [esp+103Ch] [ebp+24h], c' c/ n6 L9 A) I) ?* w
5 n$ [8 P' s, k# S) B- L4 {0 t/ w% j- va_start(va, a7);
& E0 ~0 }& I u( F - v9 = 1;
! G" U! y$ b- i- H - if ( a7 )9 G# n% `& n6 N1 N c2 ?
- {( t. h% X' C5 y8 u( [5 q# x
- vsprintf(&v10, a7, va);
( C, u+ a4 M* Z: e3 V+ d - glPushAttrib(0x20000u);) n7 c* G: T- i; q
- glListBase(base);
2 I/ @% Y+ N' n$ N* q, R: e( K - lists = &v10; H: T+ a! r- G" x' M
- do' ~6 w8 n# `1 Q5 Q1 M8 y
- {+ E C) O8 {* \# C. V! X
- *(_DWORD *)&v12[1] = lists;' O+ M3 T% J7 S* p9 n* v3 H9 B: g+ e
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )! ~4 q1 ]) p2 j4 Y. N$ N
- ++*(_DWORD *)&v12[1];
2 X% h$ y' z2 D3 J5 d - v12[0] = **(_BYTE **)&v12[1];# Q( k0 G/ J I% h6 z" Q: u7 Y8 d
- **(_BYTE **)&v12[1] = 0;
& `9 v0 K. q3 ` - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
Z2 |( X% o% q; C4 n - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;, O, p. o8 s- _% @
- y -= a5;
- k$ y' o& L6 N - glRasterPos2i(*(_DWORD *)a4 + a1, y);
9 `9 P, D6 K2 d - v7 = lists;* e; \6 a3 x" N8 E9 R* e' O
- v8 = strlen((const char *)lists);+ O) g6 K, \8 |4 D8 ~% s* Q; n
- glCallLists(v8, 0x1401u, v7);# i) G: @% v$ ~; a
- if ( v9 < a3 )
6 O2 X4 {+ n; X7 N4 o7 c( o - a4 += 4;
4 ~; j& v1 ]7 u5 a1 s - ++v9;% b8 u8 O( g0 q* K9 L
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);# F* ~% f$ {: s/ x8 |1 |) B' Q
- }; B E6 s9 A% s0 }/ I# \# Z
- while ( v12[0] );. z% @- L% v ?& w0 d
- glPopAttrib();
: U/ ?/ I) I& [* o$ @ - }! i' s9 m5 Z* T4 l1 U7 t% b
- }
复制代码
0 F$ ]/ F* a& \; s" r* n9 b( W- b$ k; o: n+ p. {! o! o, b
8 Z; k0 V# W; O
# r+ d2 M) m% u) z9 o% [2 S$ u V
5 h6 U. z3 I; V0 S! d
* a9 s) d8 k) r' Z0 W; X, [3 v4 Y `2 M/ R: w( j" k0 k+ f1 l
, D7 w6 m3 Y/ s0 K
|