本帖最后由 shane007 于 2023-9-5 15:50 编辑 + C4 J0 W) a. G
4 P' J2 P- l: X: _/ ^6 I% Y! a0 g
glCallLists的调用处,共有三处。
U- T9 f2 N( t+ E" j- J此三处估计是对应游戏中三类不同的字幕。0 o. a# P M, M+ I o- k7 R2 r
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
, e' Z* N1 `. B! ?9 u分析的文件名,748 KB (765,952 字节)( m: \- H. |* P ^# \1 C$ G3 s
toh.exe
9 X, j1 w) N, G. v. L+ v6 Q' }3 m' d Y) l5 y( c/ a
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
6 N8 n9 U% T h+ p* I! E6 n等日后再仔细研究,看显示函数究竟在哪里。* _# K; }6 I8 D# S* z; D4 C
{) {* d, }2 P+ O3 _% D
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]7 {0 b: Y7 p( W1 n7 L
004316C80 F* M; ?4 K) o2 e& H
4 _& ?0 Z5 {+ v9 f( z2 T- F k9 v
第1处3 X% m2 M# h8 i7 }
- void sub_4519B8(char *a1, ...)6 z/ }$ }: Z: W& q v) X
- {
* O' D) R r3 {! u$ U( V. E m - GLsizei v1; // eax9 L, a1 [. i4 W
- char lists; // [esp+4h] [ebp-800h]
) ?, ^& D, V( C - va_list va; // [esp+810h] [ebp+Ch]/ D* v$ L1 q' R8 R3 X. t+ x
- # V. A/ X: X9 B3 t9 L' p" g; [
- va_start(va, a1);6 }! N) F" r/ D
- if ( a1 )/ C( \$ J0 u; Q7 m ] h
- {, b" K W' x7 F5 x9 g
- vsprintf(&lists, a1, va);) d, K6 ?3 p4 I0 j. S
- glPushAttrib(0x20000u);
t& {7 }. A* c5 p* ` - glListBase(base);
6 K' i8 k' ?6 z6 N4 l4 ` - v1 = strlen(&lists);
4 j( k- Y' W2 t7 y8 J - glCallLists(v1, 0x1401u, &lists);4 k+ j) x3 t* Y7 g Z g: c% v
- glPopAttrib();
* d, u6 Y3 w5 F: O9 B2 l - }8 D# f$ }0 u+ ]; ~4 z
- }
复制代码 9 d+ ^9 S/ ]1 C2 M( B) d; J
第2处
# P9 |6 e# c5 M) P% J6 R- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
, n8 N: n/ C* D/ z) T% R - {
& Z8 c. u4 J$ Q. {4 F - int v4; // eax
! n3 m" L( G& \7 q/ F - GLsizei v5; // eax) i0 |: E5 j9 s9 A5 s
- char lists; // [esp+4h] [ebp-800h]
1 Q1 z* c% N8 h% u9 T% y - va_list va; // [esp+81Ch] [ebp+18h]7 B, h" |. r( L, p$ _( |
- # D! T* S; X* `0 X* j8 O
- va_start(va, a4);
' C5 p. D; `0 F - if ( a4 )2 X1 P: t& G* O* e+ S0 V
- {
+ T8 t1 E @5 r, E) K - sub_44FDD0(a3);- s0 h6 S8 [. B, |, W
- v4 = sub_40BB44();
% @' h5 t7 N& G/ `) H$ O - glRasterPos2i(x, v4 - a2);) |3 @3 o! w& V* R' `0 n
- vsprintf(&lists, a4, va);- p1 p2 U8 h8 Q# _- c, r3 V4 w
- glPushAttrib(0x20000u);
: m) }, b, ^- k. k! | - glListBase(base);& R; v- v+ i+ y7 F# H
- v5 = strlen(&lists);
0 p9 t! C; X% I6 i. r - glCallLists(v5, 0x1401u, &lists);, X3 t( @4 s8 Y6 N4 o. P& n) Z; Y( x
- glPopAttrib();
+ R, u3 k5 r/ J - }8 C9 @; h7 y/ f6 X) h
- }
复制代码 7 `7 t" Z& h. x8 E) R. W4 Q" Z4 I
& l- ^ ]: n' j3 e
' m7 ~2 j0 _3 G% _. x
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
8 s- W @: u. @, G! _/ i- b - {
2 X0 |2 |' m* \# i0 \5 G% I% d& ` - GLvoid *v7; // ST08_4
- Q7 R9 p" w: c - GLsizei v8; // eax
m7 W% J0 ^4 o3 |& j2 @1 I0 J - int v9; // [esp+0h] [ebp-1018h]9 v4 M1 Y4 a( y Y
- char v10; // [esp+8h] [ebp-1010h]+ q ~: U; a N
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]
- k5 \4 }1 W2 e" }1 R* M9 ] - char v12[5]; // [esp+1013h] [ebp-5h]
4 U6 M$ `7 a) w2 p9 s+ Q- W4 ]' b& b - va_list va; // [esp+103Ch] [ebp+24h]
2 z5 p& y* b7 Y
; W* e# N+ K, ~/ x% r: S: T, v- va_start(va, a7);0 ^- q1 N( r, y+ b) S
- v9 = 1;% l; o, Z' E: A1 W: ]. a
- if ( a7 )
3 a( }% T; F" X1 t+ W- q( L/ h# [5 F - {8 t# }# N! v; D" B- G: v( A
- vsprintf(&v10, a7, va);& c. R9 } ]9 f. B- h2 R
- glPushAttrib(0x20000u);
4 s! R2 u( F* a; i) o/ R6 H; u- A - glListBase(base);, L* v, k4 l8 @3 c# X$ f
- lists = &v10;- O) P& W& [2 W# h: ]
- do
7 N4 c" j) _5 c' O$ V2 f+ v9 t5 [ - {
- Y. r' x( d; \# Y+ o& E+ C - *(_DWORD *)&v12[1] = lists;
' Z% G% Z$ }8 j' @6 k - while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )- ]# ]- t* j- J U
- ++*(_DWORD *)&v12[1];
0 Z% I1 F. k; E% u9 D1 m' M6 b - v12[0] = **(_BYTE **)&v12[1];+ L9 k+ X7 R1 U4 [* {
- **(_BYTE **)&v12[1] = 0;" _3 V7 \" X, [* _( N8 l3 a
- if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )+ @/ C% ^ t- m8 \5 h
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
8 |( G6 J2 }/ H5 X( {2 H( H - y -= a5;# K4 a; Z* |; t2 {0 k$ ~
- glRasterPos2i(*(_DWORD *)a4 + a1, y);$ S0 u; ^' \7 l- N
- v7 = lists;
* h4 R" [3 b# v* |3 V0 V - v8 = strlen((const char *)lists); @1 B3 D) x2 A
- glCallLists(v8, 0x1401u, v7);
" _% O8 B$ P1 c6 r4 T - if ( v9 < a3 )
, H# g' a, c1 I! X% b5 i - a4 += 4;* i$ ^6 B. ]9 w3 q
- ++v9;
' `! G6 N7 d: [' h0 p- {- W2 l P - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);- d. g# {: U# u: K
- }
5 d# Y p. X" l; @5 w - while ( v12[0] );* y" N6 j: }1 u) l W
- glPopAttrib();
2 O( ~+ D7 W% Q. b" M/ e) m/ k - }7 x1 P* {- \+ L! T
- }
复制代码
R$ s" c! H6 Y
" F5 @. N6 m- @: D9 @, ~5 j% i1 p' Y8 @/ m/ F
0 a9 a3 U) p1 D1 V5 _9 Y
6 q% Y9 Q$ `6 s- k% j: `
" }" w5 \8 k. G# u9 O9 X' D$ g3 z7 X. `/ w
0 L( B+ B" v" a |