本帖最后由 shane007 于 2023-9-5 15:50 编辑 0 G$ Y0 W, ]; M- Z) T: @# G
, {- S, z! }/ e4 ~
glCallLists的调用处,共有三处。
& B# B) q% D. ~5 h% h; y, ~此三处估计是对应游戏中三类不同的字幕。
5 n Y+ q9 d" a6 Y; Q5 X接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。/ g4 k' m5 Q% b
分析的文件名,748 KB (765,952 字节)
1 F* d5 i4 h6 Ytoh.exe7 J9 B! D9 P, ^0 F% B
, [+ c# G1 j+ x
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
% ~! B$ m7 R3 T6 p+ _/ N+ i等日后再仔细研究,看显示函数究竟在哪里。* L& I9 s) c) U& ]' A& q
. b; l& N4 |' D' k, x* o% J3 Ytoh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
g/ @! g2 N0 V* }' n004316C8
) W3 }& f5 M3 X, v- ~6 l* A. g/ }2 T3 U% g- ^6 H
第1处+ | \4 Z6 z$ C$ e) @
- void sub_4519B8(char *a1, ...)# e8 b3 C9 A$ f0 U: ~# |) C
- {. r5 v F3 ^- r4 i" c. X) F! Q
- GLsizei v1; // eax
: t+ ?" P) C" @2 F4 ^5 `) ^ - char lists; // [esp+4h] [ebp-800h]
0 W6 c9 l T1 R. a6 ]( S; f - va_list va; // [esp+810h] [ebp+Ch]$ z7 a& ~% L: _% k2 n1 r7 c
- % }* d* c9 _7 n; k. k& k5 U
- va_start(va, a1);2 w" n, t2 A, {8 I" G) j
- if ( a1 )' ?5 @. t* x" x/ e2 j& s, R; m, U
- {9 \/ _# |, }( H1 _
- vsprintf(&lists, a1, va);
" n! E- c8 o: l1 X% Y' ` - glPushAttrib(0x20000u);
! q4 @4 D+ l5 v L {4 s - glListBase(base);% k! h8 h9 L- j; R
- v1 = strlen(&lists);" b+ k, f# ~" ^
- glCallLists(v1, 0x1401u, &lists);
. y9 E5 I+ G" N2 d3 Y. P Y - glPopAttrib();
* B& u4 F# S& G# h - }
8 P w6 ]# b( \! T: H+ B+ a" b - }
复制代码 + k v3 T" ^- n; ~# G5 ^
第2处
; W- N' Y; r( i2 b7 O2 A' V8 c- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)8 B4 S' t8 S% c- o* W2 y
- {/ Y% G' n& M a4 G9 @% `
- int v4; // eax/ i+ G5 `* V1 h" Y& l0 x6 }
- GLsizei v5; // eax
1 t+ z, M+ i. }* g - char lists; // [esp+4h] [ebp-800h]5 \' j2 J% K3 v! X" X
- va_list va; // [esp+81Ch] [ebp+18h]
0 l/ u( {, w ^+ v" G5 {2 R - + u" H$ H4 X! S/ G% q' k* a* ~
- va_start(va, a4);
# K1 {) y+ V, h - if ( a4 )
9 q+ p9 [2 I5 X/ R9 N; j& r - {% O1 S% k5 I ?: j& N* c
- sub_44FDD0(a3);! w6 P6 c |: L1 J2 \
- v4 = sub_40BB44();
1 w' ~8 B A" }5 Y4 P; ]; Y - glRasterPos2i(x, v4 - a2);* w' H" @1 m2 u% _% ^
- vsprintf(&lists, a4, va);: w2 F# Y0 s( Z- l
- glPushAttrib(0x20000u);
; A* P6 z( i0 S( T1 T. |/ x& Y - glListBase(base);
1 F- P4 d5 c" ? - v5 = strlen(&lists);/ T! U8 C% B8 L: [* t) b; z* l
- glCallLists(v5, 0x1401u, &lists);3 A! N q- \5 f @) k2 D6 I
- glPopAttrib();3 L- b( D" {: a/ R4 d( X8 {
- }
. _3 Z" w% z% D$ p' }* ]' w% M - }
复制代码 7 ?$ w1 l% L3 P: z) c: j
3 b0 h- [' k8 D0 ]
" H& n( z6 y/ Y% q# }# t6 s! z第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)' U$ ~9 h% a' L9 ?4 _% J
- {
* p, k* n, v: ~/ K5 h( ] - GLvoid *v7; // ST08_4, W3 i! u3 z+ C* ?
- GLsizei v8; // eax: l9 I9 Y2 P' j
- int v9; // [esp+0h] [ebp-1018h]
& V; P; K; k& O# c4 ]- ]5 `% n% q/ _0 Z - char v10; // [esp+8h] [ebp-1010h]
8 O9 _' U, O0 l# X4 o - GLvoid *lists; // [esp+100Ch] [ebp-Ch]
( R, a- l3 R/ I4 N - char v12[5]; // [esp+1013h] [ebp-5h]: h& E4 u( z: c: r: J, y" t5 t
- va_list va; // [esp+103Ch] [ebp+24h]
} k) {" S6 j
8 O, Y; M. J2 u& P# [- va_start(va, a7);
S: G9 C& z! b' Q: G - v9 = 1;" U. a. V; m2 j4 h0 x
- if ( a7 )
% l% h/ B; p& u( T - {( E7 x. X: b2 [
- vsprintf(&v10, a7, va);" G; X# ?+ D" |+ D8 f0 _) N* H
- glPushAttrib(0x20000u);- q) M' ~0 `- _
- glListBase(base);! ~$ w+ z0 D' Q2 n @2 z: C
- lists = &v10;' M1 W& {# u n( D" M2 c( Y1 o
- do
, y f8 J; O1 O: q2 s m, r) J3 G4 F - {. s2 A4 X7 |! F& B3 k; z# H3 ? J
- *(_DWORD *)&v12[1] = lists;
/ Q F9 V4 V1 J! Z- t - while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )4 c4 {9 Y. a, `; m' Y0 o
- ++*(_DWORD *)&v12[1];1 `9 d0 O$ P- p4 m6 u
- v12[0] = **(_BYTE **)&v12[1];
5 q y9 O# V. B v* G- J: U - **(_BYTE **)&v12[1] = 0;3 l1 h5 j- f1 s2 D M! s6 D/ U
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
3 Z' ^/ n: E) |0 z - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
& n* b% O2 b: D1 p/ H8 R5 l# { - y -= a5;
- Y: Y0 k% h( Y% H; Z - glRasterPos2i(*(_DWORD *)a4 + a1, y);
/ o8 Y D' }+ h5 e" U$ I0 [7 d - v7 = lists;$ a; }. x. F2 o0 e/ C
- v8 = strlen((const char *)lists);$ r- _+ o* V9 O& c* z
- glCallLists(v8, 0x1401u, v7);& g* W; p$ }) e$ r" w, T* T
- if ( v9 < a3 )# r4 Q( d* i' H' s7 l5 C8 F
- a4 += 4;
* n1 F% L( F- w9 `- ^$ o) {5 g - ++v9;: m; a8 F1 @8 H8 j: P6 p
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);, x' F7 d& D" r/ x5 c5 ^. S" W
- }# A9 a* |* w& r1 T3 X1 X
- while ( v12[0] );2 i/ U+ a" a# l, [1 M7 m( m
- glPopAttrib();
5 O% i, c. ?' B - }
$ F) ?1 B, Y+ N3 F& p4 X - }
复制代码
5 N# ^8 b# F E5 H# W. p& ^
& K% L1 ~ Q2 g- b" a& v9 k- y7 [( j" e0 f- A
9 z) T/ ~' r+ |- \" a# u5 r5 M: f9 k
h, o% `: a/ R0 k
6 r0 H( ?+ o$ G9 m! b2 }# g" e T0 }3 d1 m
& f' l4 i: Q; X$ ]9 m |