本帖最后由 shane007 于 2023-9-5 15:50 编辑
# L: h) v4 z$ o. B! R
: ?6 ^ n+ R4 |/ H- ~" R3 mglCallLists的调用处,共有三处。- Z2 `' t2 {; _0 W& Z6 ~ o
此三处估计是对应游戏中三类不同的字幕。$ U7 Y- Z# o* B4 ?
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
/ S# L% ^. N9 b, F* [- @ C0 z分析的文件名,748 KB (765,952 字节)
. |, K5 D$ T& a$ ]. otoh.exe
# X( x ?* Y: T" m1 e$ \" U. t: w- w9 e6 c2 H5 f- h: w/ \; S
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,: h! X6 V) r( w
等日后再仔细研究,看显示函数究竟在哪里。" i0 [2 J) r& r& _7 `
) }4 O+ m3 }1 a2 N x5 d+ c# A; x
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
! D5 [- }4 Z) ?% c+ ~, J) R/ ]) J004316C8
m% P/ v# Z, f0 ^4 N; i1 u2 |/ j- o' M. q3 r9 D0 Z+ s9 v
第1处' _8 I9 S% t9 O$ s
- void sub_4519B8(char *a1, ...)$ E, C( Y& G+ U+ x( {" v7 k( ~
- {8 I3 b) H( V- W7 }1 `$ B9 m
- GLsizei v1; // eax
' e. y% o6 F: A( ]8 [2 I- ? - char lists; // [esp+4h] [ebp-800h]& ~* b! R7 }* |1 c, h+ U( j
- va_list va; // [esp+810h] [ebp+Ch]2 o0 S1 Y. H% c
( C9 e/ ]5 T! j, |9 }& ]" u- va_start(va, a1);1 W7 v( m! {. F: F' T+ y, k
- if ( a1 )
, E$ I6 O! i- n8 z - {/ l. H6 L3 ]9 ?: Y. ~
- vsprintf(&lists, a1, va);# d c# F x5 A' C
- glPushAttrib(0x20000u);" {" x* v: W3 p' w" {
- glListBase(base);8 U# ^2 c' W' A! p; {1 h) C
- v1 = strlen(&lists);
5 V! h$ z4 j! @5 Z/ J3 Y - glCallLists(v1, 0x1401u, &lists);
" p0 B& G$ W6 ], I, N - glPopAttrib();
3 O; P9 p/ |; \ - }/ {) p8 R# u1 ]% K5 d: W
- }
复制代码 , V& \4 r& x& I- a( a" E" G
第2处, [+ @. q7 f- e, r" g
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)4 @. ^3 a6 C; M- a4 x
- { ]% ~2 [$ c, X v1 |
- int v4; // eax
* m- ?' F7 ~1 W& ` - GLsizei v5; // eax' T; {; O5 A0 A2 |. V- I
- char lists; // [esp+4h] [ebp-800h]+ g7 C! b J, L6 X4 e7 w
- va_list va; // [esp+81Ch] [ebp+18h]
5 n' V( ^8 A2 X5 I
: p+ V7 ]. X- e$ U- va_start(va, a4);; P& b: f/ F2 {' |/ W# j5 c5 C
- if ( a4 )+ c5 U9 V9 f% m+ b+ z n4 F: n
- {
8 w6 c' s$ I; U) N. B ]2 x - sub_44FDD0(a3);
( R5 S0 }+ n1 m. t: Y - v4 = sub_40BB44();
5 u3 j8 `3 g; w6 d: V+ C8 t4 w! C - glRasterPos2i(x, v4 - a2);
8 R$ @ f4 U: H3 k/ ?1 X - vsprintf(&lists, a4, va);
( K* i: e7 T3 n8 I - glPushAttrib(0x20000u);& J4 a( v" J% l' z4 C
- glListBase(base);
( e/ ?$ ?( }" x - v5 = strlen(&lists);
e. F Z4 _7 O2 [3 `* n - glCallLists(v5, 0x1401u, &lists);5 ?$ O6 C% L% ?8 U: R! F7 h" A/ F
- glPopAttrib();, Q& |& p+ U5 r
- }
$ M4 `7 L' m' `) k, G5 e - }
复制代码 8 K# |9 e4 e9 \9 ]! _, z! f
' |8 s4 J4 I2 u
& B* W! F7 j' w& B+ x6 F& a
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
, J4 Y5 N1 A4 W5 h: b: \6 ?7 { - {
+ u* H. P' q6 f& s4 q6 F, d$ ^% ]; b - GLvoid *v7; // ST08_4
- x2 a3 p% `% P: J7 ?% J - GLsizei v8; // eax
) A* A# B4 R- ^ - int v9; // [esp+0h] [ebp-1018h]
' V! ?# [8 s5 H( i2 X& n4 Q" ?) @ - char v10; // [esp+8h] [ebp-1010h]
" s8 Z7 N- Q4 ~% E7 k$ C% _& x - GLvoid *lists; // [esp+100Ch] [ebp-Ch]1 T- M% [4 { B8 H
- char v12[5]; // [esp+1013h] [ebp-5h]
# `' _9 \: j$ x! f - va_list va; // [esp+103Ch] [ebp+24h]1 u* l2 g" Y. m+ u9 Q
- 5 ~1 ~8 J, _1 h! l
- va_start(va, a7);$ v2 F! J. w% G% l: I; Q* L
- v9 = 1;
4 h/ t/ p! B7 ~6 Y3 Z* c" O - if ( a7 )
4 h9 m; O" G: g! Z! g' O3 P- t: x - {
5 u* R5 D; ]3 Y) x - vsprintf(&v10, a7, va);* E/ @7 ^2 J$ A2 }
- glPushAttrib(0x20000u);; t* h1 D& s7 @; Y% E
- glListBase(base);2 X2 B- N% D0 @$ T# Z; Z
- lists = &v10;
_0 }* q5 N: I. T/ o1 U - do
+ R$ ^9 X9 \2 d7 J0 B/ u - {5 a; y. p9 Y- A- j& M
- *(_DWORD *)&v12[1] = lists;
/ P( ?* T+ ?) p9 e - while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
/ G2 ~& i9 h4 ^2 o' ~6 d6 S - ++*(_DWORD *)&v12[1];* Q: ~# z; j: A" E3 {$ \" [ l' W
- v12[0] = **(_BYTE **)&v12[1];
* e0 M( W8 O! k - **(_BYTE **)&v12[1] = 0;$ X& g6 `/ G u1 @& y& F
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
1 N' a4 t* l* I O& X+ y" H4 T' U& { - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
- M$ j; u. c# j& T2 B0 {6 Y - y -= a5;
2 u* h: L! f( j2 P) j# @ - glRasterPos2i(*(_DWORD *)a4 + a1, y);
- e' _" W6 o& A# ^- T' I/ t - v7 = lists;
, V; D# D# J) r - v8 = strlen((const char *)lists);( G6 B. H& G) p) q8 E/ C. h
- glCallLists(v8, 0x1401u, v7);5 }; H) M) z8 i, B. y7 y
- if ( v9 < a3 )6 i; |8 p3 Z7 k' {0 C6 ~3 V6 k
- a4 += 4;) T0 K1 F3 B' c" U" W. Z
- ++v9;
9 m7 E0 k: ~; B# r* g! i - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
2 f( T1 F0 r2 J+ M - }* J7 ]# L- l, G2 X4 z. R2 ~0 A" L
- while ( v12[0] );# A: O6 L8 D3 Y1 z7 r; n
- glPopAttrib();9 P" U: ?& m w6 U- f, t! L& ^2 y/ K
- }4 }/ @! S# E8 C/ v5 c
- }
复制代码 ) E: B1 @: C2 U" Q# m0 k
9 K' |3 A( {. [/ b% O
4 E+ F6 K- r& ?7 l) n% C$ O
) V$ h; ], K6 B3 T9 _# O" Z+ ^- U1 |# A' ^
8 U0 t6 ^0 R8 R1 F: p3 K+ {' ]2 i+ g+ r
% P, X( X( J$ a8 H; n
|