本帖最后由 shane007 于 2023-9-5 15:50 编辑 - y5 j% ~9 `' h8 U0 T' {
7 ^% u' N3 [+ S0 v" i% f
glCallLists的调用处,共有三处。. F( d2 a; A2 R0 t+ h; K) a
此三处估计是对应游戏中三类不同的字幕。
0 G; X4 k" j! P: c( Q$ M5 X接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
0 }8 E& V2 L' z+ D* U0 L7 D2 S2 K2 R分析的文件名,748 KB (765,952 字节)! P- f7 B! k5 Q5 j" }; ]1 j3 U6 k
toh.exe
! m: \6 Y ~# i. c2 f3 s
1 u# @. S2 N9 B( g- w! j5 g8 m经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,3 L; }. e W i3 {
等日后再仔细研究,看显示函数究竟在哪里。
0 p' t9 ^7 b( C3 H" `% u1 R- K% \; @! V2 F& g' L" T
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]" V+ u- M: v3 j6 b0 \3 b3 [
004316C86 `( e' e5 `' P5 }8 g
+ W$ [: O( a _2 T1 ]第1处
. S4 j# c( t! b; l- ~- void sub_4519B8(char *a1, ...)8 s y" q6 N, B9 a( L
- {
0 ?) O! N, I, m- P/ b! e7 Q& M/ L - GLsizei v1; // eax. ~4 T R4 y. x# q
- char lists; // [esp+4h] [ebp-800h] N, C; I1 ]/ X* f/ U W
- va_list va; // [esp+810h] [ebp+Ch]
% I9 s" j9 Y6 I! C4 H& C! R
; n" p7 t) p; i3 O7 s- va_start(va, a1);$ d2 X8 F) ] W6 L
- if ( a1 )' m" h; R* W4 A/ ~9 B" c
- {) }2 Y3 n0 C- ~) o4 {" r2 Z$ a9 r7 t
- vsprintf(&lists, a1, va);
) s, I- h7 f8 F% K6 n V - glPushAttrib(0x20000u);; g7 R: M! h/ g6 j; h) h: ~; o
- glListBase(base);9 b+ p, d! e" w+ F+ a
- v1 = strlen(&lists);
1 z: m f1 s7 a) Z- H( P( N* u - glCallLists(v1, 0x1401u, &lists);
) p7 n' L( a* \" A7 M - glPopAttrib();" G( K3 u$ p6 K$ _- N Q4 u
- }! R4 q; [( ^$ |: I- _
- }
复制代码 ) _, F9 V! M3 ]
第2处
- K4 Q! Q% r) h0 ]) o! c- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)# t$ V9 l) v+ l. w7 F; n3 c" c
- {7 Y& p, c, \) }+ A+ r- c
- int v4; // eax
* l. z0 A) y9 `* W - GLsizei v5; // eax' H2 |8 C4 J5 h/ y/ J
- char lists; // [esp+4h] [ebp-800h]$ s- U( T8 @7 M' X
- va_list va; // [esp+81Ch] [ebp+18h]. A! Y* P) ]3 u: C0 Q, k
, s& J1 Z. W5 N8 H2 r0 _. I- va_start(va, a4);
0 r# O2 m, d2 Z! N5 X! F( N7 a - if ( a4 )% C' D! G2 @7 i4 Z
- {+ }5 \: Q/ u3 Y5 F4 u8 ^
- sub_44FDD0(a3);
9 W5 [: M! m6 c& } - v4 = sub_40BB44();
7 _! l# }' u7 d: k - glRasterPos2i(x, v4 - a2);" y$ x9 n1 q% d6 W6 d v; P* `
- vsprintf(&lists, a4, va);( @! ?( N* n& Q& q" w$ h) q
- glPushAttrib(0x20000u);
" j. B( B ^6 q" n- ]( { - glListBase(base);6 u+ X, K# V2 `; c$ k+ N7 e5 g
- v5 = strlen(&lists);
: L* _6 w: L' z( z- [ - glCallLists(v5, 0x1401u, &lists);+ l \% a" L0 {0 O2 \* ~
- glPopAttrib(); C. w3 Q5 h9 }& [( z
- }7 m8 W, q5 x! ?; D
- }
复制代码 " @2 z+ }: T" X9 e6 m9 l% T0 O5 N
$ ] y! t1 p p2 B
- L3 B( n0 s4 N0 d8 t; C) D, }第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
! n/ v/ Y8 Z) Y" g - {
+ L3 W, R: D- K4 ~, B" i6 N$ Y - GLvoid *v7; // ST08_4
$ b! ^ e+ H2 R/ q) W0 r$ e - GLsizei v8; // eax
0 A5 C( I( @, n0 ]) I1 P - int v9; // [esp+0h] [ebp-1018h]
- S& W9 Y' e+ C; Z - char v10; // [esp+8h] [ebp-1010h] C2 q5 d5 h0 g
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]
& `0 M: m/ N7 j) H6 i3 v# W& f0 K5 I - char v12[5]; // [esp+1013h] [ebp-5h]+ m# e: K, `4 l
- va_list va; // [esp+103Ch] [ebp+24h] [& |# v; l9 l7 w
- 4 ^/ B1 r" k t! p
- va_start(va, a7);$ P4 x1 B0 F; U( z0 A* m8 _
- v9 = 1;- a U$ d( c- |! I, E+ z! d! N
- if ( a7 )
& B4 E \+ l$ N$ N5 _6 ~; p; Q6 Q4 I - {
1 ]% }1 B- R8 Q+ D - vsprintf(&v10, a7, va);- ^7 M# B- _, q5 v3 m
- glPushAttrib(0x20000u);. p0 C, y0 W' e; p" {4 Q) {0 \
- glListBase(base);% N2 v/ k( }( N# Y- S) [
- lists = &v10;
! ]3 ^. s7 y* W, c' o - do4 B. z. r' @, c0 ?# a& C
- {3 g) x6 J# f9 A& J2 F
- *(_DWORD *)&v12[1] = lists;
' o% Y1 V8 g9 S: H+ z - while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )' T- @% M# ^: d
- ++*(_DWORD *)&v12[1];& N, D3 ^. w% x: K% Z8 ]
- v12[0] = **(_BYTE **)&v12[1];
6 H" g% N+ a0 f! _" G - **(_BYTE **)&v12[1] = 0;
( L6 I7 y' s& Y2 K6 C: o - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
9 I5 c& q N3 g& e+ P* {# j - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
1 y# A: W4 C' U; G2 i$ Q - y -= a5;6 |0 e% ~! |" j/ L# E
- glRasterPos2i(*(_DWORD *)a4 + a1, y);
- g4 y" M+ y9 ]9 Y) @ - v7 = lists;
& w' N7 U$ b S. Q. e/ I- a* N3 ~ - v8 = strlen((const char *)lists);! e: y1 z1 L- w: n$ {) w+ m6 _
- glCallLists(v8, 0x1401u, v7);3 D& t; a) U/ l/ \
- if ( v9 < a3 )# x# ~8 N# J: B! J3 p) o3 p1 {& E
- a4 += 4;8 r/ _4 ?) J* [) Z! y) \' R _6 \
- ++v9;) g: h: \4 F! ]+ N" A7 e
- lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);9 d( |5 M H- r
- }
A5 D+ F1 s1 [/ t9 [0 Y v - while ( v12[0] );. B% ?1 r5 E' Q1 x8 K
- glPopAttrib();( m8 k2 ?! h4 G( `0 I5 z! C
- }- U% T# q3 c' S5 e8 K
- }
复制代码
8 @$ D) }- M ~+ c. d3 R4 p" }( P. z1 Y4 T& x# W
) s% }4 [; t ]9 B* q8 \& |
$ J6 N! U0 D' m! Z. Z' X
6 g5 h+ ^7 m! k! L! P, I6 S7 l
) |- L& s1 ^" ~0 m# f& z5 Z; s" A! l' G4 s3 ]5 M4 @
5 a9 H- G) p' n; \, I F9 w/ M
|