本帖最后由 shane007 于 2023-9-5 15:50 编辑
2 J1 m6 Z: M* V& E& R) g6 d: P& E$ ^
/ u9 X; S4 m% c0 |/ w! R' p9 U! sglCallLists的调用处,共有三处。
' L* T' |# l* g" J. K此三处估计是对应游戏中三类不同的字幕。
* Q2 h9 B2 u1 f接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。8 Y( ]# ^ d. W+ Z ]& [
分析的文件名,748 KB (765,952 字节)
4 o% |5 M" \! U) L- c# Z; C7 U0 p+ utoh.exe: b! Q" ]+ G+ r2 T0 c k6 Z( h
/ X! Z2 K# M: z0 I) \$ m经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,2 J: t' G* G5 K
等日后再仔细研究,看显示函数究竟在哪里。
$ Y' g3 u) p' i" K% ^5 Z' j
- }4 G% j6 _: E4 S. ^toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]9 W9 f$ R( e+ J: Q2 t/ M6 n8 z
004316C8
( Q! n' C( e0 Q/ s
; Y4 {2 O% E; P2 z$ \' c第1处
0 u/ a; u$ g- v% N7 P! z' U: t- void sub_4519B8(char *a1, ...)
! s8 y9 u+ w) Y6 b8 n - {6 u/ X, J3 P {9 M1 X( f4 u! t/ o
- GLsizei v1; // eax. G4 z" a- e, G3 V2 M
- char lists; // [esp+4h] [ebp-800h]/ G: [% @1 u) F1 J' H' r$ g6 f5 i3 |
- va_list va; // [esp+810h] [ebp+Ch]9 m1 v8 _ S4 v- i' J6 E: D
- 8 Q- D9 }+ K' O8 v$ F6 M: ~
- va_start(va, a1);
* b6 R) ]% K# @# R# x# r - if ( a1 )
* F7 r! D8 {9 H8 ]) i; | - {
0 i& D9 |$ ?, {- y7 d - vsprintf(&lists, a1, va);
* V6 y2 D, H9 E. s' Q - glPushAttrib(0x20000u);
2 b9 V7 _5 Y3 ?$ B7 n+ C- H - glListBase(base);6 L; a( ^, q3 F/ D+ @" g& n
- v1 = strlen(&lists);
6 A. u6 _4 i3 P, w5 s - glCallLists(v1, 0x1401u, &lists);: e2 P Y# S& Q, s. [7 T0 T
- glPopAttrib();
1 A# N' ~/ T' J - }4 J/ R" B! d: U' }7 b' P& k* j" A
- }
复制代码
9 r9 J. B* c X1 N7 p& Q第2处; ~1 F* b7 n( r
- void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)8 q0 z$ ?0 T0 B$ ?5 z# @
- {/ F5 V* }; \. D0 V" `8 L5 a4 T
- int v4; // eax. M8 A4 z. r v3 L V
- GLsizei v5; // eax/ p, U3 o' x, E, ^5 B
- char lists; // [esp+4h] [ebp-800h] @ H) B# J% H/ z6 F" o1 i8 k e
- va_list va; // [esp+81Ch] [ebp+18h]
+ m9 I- {# u/ u3 i
1 q9 Z7 @2 i. Q. s- va_start(va, a4);
$ d4 G1 ~$ x/ I1 a& n/ {8 H/ s - if ( a4 )
8 i- Z; x1 T0 M$ }. h - {
$ W8 j$ W; A& U% t: h4 @ - sub_44FDD0(a3);! k7 w$ L2 F! l: q7 A
- v4 = sub_40BB44();: E9 g! ^) O. a9 S- r5 U; q j
- glRasterPos2i(x, v4 - a2);
% b+ D4 k# @' T+ b6 A3 Y4 j - vsprintf(&lists, a4, va);
- g: {4 z+ E2 v) V# A( w - glPushAttrib(0x20000u);
" V; l6 |6 x5 s: ?: P/ g$ M( u" d1 V - glListBase(base);
: E# w* B# @) I - v5 = strlen(&lists);
1 H0 r* s/ J" {7 X8 C0 _4 ? - glCallLists(v5, 0x1401u, &lists);. y* W$ I7 t" c
- glPopAttrib();
; K* k+ D# y: d4 M - }
2 C6 d6 \+ c: A$ @( p( y4 i8 ` - }
复制代码 + _. i! k2 W1 L, c0 s
4 @' s3 y& z2 x: v4 P0 B) K3 d( [- J3 j3 M% h) S7 t7 p
第3处- void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)( G" R) d) y6 t. F N
- {
) I( w g& f j - GLvoid *v7; // ST08_40 m! y7 |0 n: [& Y
- GLsizei v8; // eax4 p; s% C5 G R! g+ V- a$ A
- int v9; // [esp+0h] [ebp-1018h]7 O% x4 p9 E5 Q* q5 M* r
- char v10; // [esp+8h] [ebp-1010h]% r5 c1 V# j: V, V; e) o5 r4 C
- GLvoid *lists; // [esp+100Ch] [ebp-Ch]
" S* v1 z2 v& d t+ h! a9 C& o0 a - char v12[5]; // [esp+1013h] [ebp-5h]
+ Y( M( p B' x - va_list va; // [esp+103Ch] [ebp+24h]0 q# y, i/ |* f9 G+ v7 K
- ! o1 [% [3 @3 m: \% c3 k
- va_start(va, a7);/ {0 E* T' r. K' F$ O1 f, D% D# |
- v9 = 1;
9 G( g9 M! u2 K: x' K- @. h7 M - if ( a7 )
2 `3 V, Y8 V$ L8 F) o" N - {
8 d4 @' T! T( d! y# r* k - vsprintf(&v10, a7, va);! u+ y, N$ L8 ]* p% I
- glPushAttrib(0x20000u);/ _, B* D7 p& ~0 R6 E" S
- glListBase(base);3 S" T; j8 j3 |7 X, K4 @3 M: H! Y
- lists = &v10;8 V. A, J3 G6 O$ R+ l: \; T
- do% N5 Q5 g, P/ w! ?% S; e$ B
- {; @% s/ d9 W( l
- *(_DWORD *)&v12[1] = lists;
' M5 {( w2 _, t; `" D I - while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )( e1 A8 H' A/ I) i" x. k0 S
- ++*(_DWORD *)&v12[1];
; e/ x& m4 h& ^4 J - v12[0] = **(_BYTE **)&v12[1];
1 y2 y/ Q+ b8 d$ G7 _: e0 l% i - **(_BYTE **)&v12[1] = 0;
8 \% @9 m% i2 \ `6 I# x- |# @ - if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
6 U& d' U3 O) c* X! t3 g - *(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
0 z& O( D5 n* }; }0 L( ]& G a8 G - y -= a5;
0 s" m- [. x! z( e7 U - glRasterPos2i(*(_DWORD *)a4 + a1, y);0 `: C" G: ?- @: S2 D, ~$ C# a+ i
- v7 = lists;
7 z$ h* i3 t0 d. k. ^! K0 } - v8 = strlen((const char *)lists);
$ L( v y s F6 Y - glCallLists(v8, 0x1401u, v7);- u# A' {% o! J4 g9 j
- if ( v9 < a3 )
1 }2 T; b0 ?3 ~+ G2 m - a4 += 4;
9 k9 [' P" |5 t( s1 A. \! c3 t# s7 ~ - ++v9;
8 d! V% r' Q& I( c - lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
' B( S+ [- ?2 j7 O5 J - }
( g* k% A5 v0 z - while ( v12[0] );
5 ?6 q0 d3 v) x, Q* }& u - glPopAttrib();; W! B0 H% U6 r% d! |" K% J
- }+ [8 L5 q7 F( {& F% [7 J
- }
复制代码
l0 [$ j* Z% M0 C
1 P$ b: \( x" g. {6 r5 N0 K( o q e2 R) i# d9 P( ]$ V
, y+ q/ C/ t2 z, U: n3 N4 N1 B! Q, j3 j7 s* G& }& ?
3 j5 H9 r. i q: c
$ N: W2 s; @0 O: g2 ?7 j# _/ I9 z1 R/ T2 P+ J/ m
|