本帖最后由 shane007 于 2023-9-5 15:50 编辑
* f+ C7 D/ v% y! F; c" d6 _, V
7 V7 G9 t! Q" `- rglCallLists的调用处,共有三处。
. I$ R( v2 }) i x, p此三处估计是对应游戏中三类不同的字幕。# R! Q$ R2 R- p4 N, b/ D
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。! P9 J. q% a5 C" p$ l7 ? L
分析的文件名,748 KB (765,952 字节)- J, ^+ \3 V% j H" M% J
toh.exe
! o" e; C a. V% h0 H" q3 Q
$ M, {" ~1 i7 v' ~, X经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
1 ]0 m5 h' J+ T, G- i. k5 x等日后再仔细研究,看显示函数究竟在哪里。: F- o% ]) \) i, x4 B( ?$ e
+ y# Z: D q, ktoh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
2 \2 A6 q' x) S) H004316C8, ]$ N" F0 |9 @/ I! N, M; p' z2 i
4 Q A) M: u4 ^1 _9 b5 g) D! o
第1处; N; M8 M! d z9 I9 ?* c- `& W3 g
- void sub_4519B8(char *a1, ...)
$ R5 U @2 O, @$ d* s - {4 n4 S/ \5 x. A) K6 Y
- GLsizei v1; // eax* N* ~& h( w4 ^2 _
- char lists; // [esp+4h] [ebp-800h]! h8 K9 I: X5 x, l l
- va_list va; // [esp+810h] [ebp+Ch], E3 k/ o, ^" t& c
- 5 Z! T' w; P& q! k
- va_start(va, a1);' A" |+ H' G( S0 E' L( z+ K
- if ( a1 )
! r0 e$ u O, S" J: W# ^7 \ - {
/ I) c- v) v3 s - vsprintf(&lists, a1, va);
0 O, g6 E8 S: i$ f! l/ x* K; f - glPushAttrib(0x20000u);; l# ^5 o+ y6 J
- glListBase(base);
9 ~3 P. e4 n2 Y6 Z& |% X6 _ - v1 = strlen(&lists);
# k* u+ p6 N2 v. I% O+ s9 p$ E - glCallLists(v1, 0x1401u, &lists);: [8 J+ k# |( n) `% q
- glPopAttrib();
& w5 z% |% N+ O - }% Z3 P. g K5 ]' G$ t3 H5 h- P
- }
复制代码
. m7 ^ C. o7 @9 k8 j3 R第2处
. s2 t5 _* H8 \* K- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
$ Q. @0 k' {) b - {* }* ]3 f/ g' G, b# b
- int v4; // eax
1 [& } W3 l9 L) R0 c - GLsizei v5; // eax) ] ]$ q% r- z2 ]1 T3 B
- char lists; // [esp+4h] [ebp-800h]
- b# }; r& A4 C/ O8 H - va_list va; // [esp+81Ch] [ebp+18h]
, C9 D9 U$ j. c8 e - 2 e2 D0 q# `4 T% w+ d7 a+ s
- va_start(va, a4);% x T v7 d3 M8 P3 j4 a- Y
- if ( a4 )% N) X3 J* I( \
- {
$ G9 p2 b5 [5 T! N! {/ T8 w - sub_44FDD0(a3);
2 c( [+ w) U+ z" O# ? - v4 = sub_40BB44();
2 T: H) x! C; B# u% S - glRasterPos2i(x, v4 - a2);
# b- e! Y% p" Z7 W1 i0 K8 H1 G - vsprintf(&lists, a4, va);
, a( Z/ A/ b" Q, \ - glPushAttrib(0x20000u);8 o/ n, \$ C$ Z9 N) B- z, c- X( O0 n6 q' x
- glListBase(base);' h8 A. j9 w0 U0 w& b
- v5 = strlen(&lists);% r0 w7 E; D0 t4 M
- glCallLists(v5, 0x1401u, &lists);
/ t# B. @( e9 W, w9 \ - glPopAttrib();
5 G0 Y* n6 c$ a7 B7 [8 v% n, I; B - }
H: H: y, ~+ }) P+ E - }
复制代码 8 v/ L6 A/ p I" o( {! P( G! A* m
; O' }8 [; V( V2 @- T1 v1 x/ x$ q4 F/ d, L: L
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
& {0 k, H$ F# \5 ^ U( F - {
, y E' @1 w# D- j( [ - GLvoid *v7; // ST08_4
: G0 z: [$ n1 u) I/ G$ R5 X( T - GLsizei v8; // eax! q% r/ t8 w1 o9 j! a% ?( ~0 j
- int v9; // [esp+0h] [ebp-1018h]% T7 E, H: ^" c# [+ K
- char v10; // [esp+8h] [ebp-1010h]
" E& W+ C9 h8 n8 x4 o - GLvoid *lists; // [esp+100Ch] [ebp-Ch]+ r% U; u. H9 o- g t3 V( v1 F5 ~6 K
- char v12[5]; // [esp+1013h] [ebp-5h]! K) G- b$ Q7 Y% M" S; ]& W
- va_list va; // [esp+103Ch] [ebp+24h]% T6 z |* T$ R& o( y' u" N
, W5 f& K9 n0 b" G- va_start(va, a7);% q0 n7 R9 b; e" t3 s k" ~
- v9 = 1;. d/ K+ |# i" y n. H; {$ w9 R5 u
- if ( a7 )
- ?/ A5 K, e& V2 S% a - {
1 f6 j! Z& T/ M5 r# J - vsprintf(&v10, a7, va);) x; {! l+ D. v3 J* D# a; f! t
- glPushAttrib(0x20000u);
( j ?! r6 a9 V- |. t, o: [ } - glListBase(base);* M d) _: b3 C- z; O, q
- lists = &v10; J/ R8 J9 ?* _
- do, J, |% t" j2 o5 H$ k
- {
8 ?1 S3 u9 I, i# G! v. @( d4 t( { - *(_DWORD *)&v12[1] = lists;: W( y/ N/ r/ e+ ~) {5 E
- while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )) R3 C' m _( b I
- ++*(_DWORD *)&v12[1];
' T- J" I8 k; d( G4 s% i) I - v12[0] = **(_BYTE **)&v12[1]; S0 v, u/ n# N. s) [
- **(_BYTE **)&v12[1] = 0;
7 |: Y. o L$ t* B' C - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )/ r, u/ _0 w- P% C; j
- *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;: m R3 k+ X; m: q; L( ^ j4 i5 T' i
- y -= a5;0 J/ q4 c3 C( c; y8 T" ~
- glRasterPos2i(*(_DWORD *)a4 + a1, y);
5 n& v, C p) a2 M, [ - v7 = lists;& ]' N ?" }) L0 M, L2 h
- v8 = strlen((const char *)lists);
" c1 k. x( {% q6 f9 Z4 T+ ^* U - glCallLists(v8, 0x1401u, v7);
) M7 P v3 x) u1 e$ S; T - if ( v9 < a3 )
4 T' G" I8 r1 E E; K, K3 f- H5 I - a4 += 4;
6 x. M3 ^4 J( R$ c* s - ++v9;+ [) Y' k- |4 n; ^! s
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);; O6 \$ X* x" u; ^7 L
- }5 G* L0 G) C. B% _3 v# @
- while ( v12[0] );9 W# C9 c- ~, N0 F) B; d0 p1 U: }/ o
- glPopAttrib();8 G8 r* t# e- J& v, y! ?& d
- }
6 J7 A8 i9 c, @2 |6 O3 F% Z - }
复制代码
& `2 U7 I g- c7 |% L9 Y4 `7 Z0 p3 E
2 f$ {" a S7 v# S O% D7 l$ U( }$ ?. p# Z
: T6 V4 z3 f2 b- R$ ~) [) x# f) @; C7 r" |! Z4 E+ ?& v; ~& E, g( Z
, b2 t! Q' S7 w* a/ S' b+ w0 l F$ v+ O6 y/ f$ v
' c6 q6 p& J& y* S |