冒险解谜游戏中文网 ChinaAVG
标题:
【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero) glCallLists 调用处分析
[打印本页]
作者:
shane007
时间:
2023-9-4 18:42
标题:
【Opengl游戏汉化 #3】 魔法英雄历险记(Tale of a Hero) glCallLists 调用处分析
本帖最后由 shane007 于 2023-9-5 15:50 编辑
) {% _$ z; ?6 U# _: Q6 m: f
1 ?0 Q& n' A% y
glCallLists的调用处,共有三处。
2 R7 T; B, a7 s. F% H& Q
此三处估计是对应游戏中三类不同的字幕。
/ ^2 q8 m* p3 I# Z" b7 e( a: ]3 S
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
$ M+ L) O3 k/ f/ C
分析的文件名,748 KB (765,952 字节)
9 @+ F$ m5 V7 U8 ]) Y0 |
toh.exe
6 M) U) l1 U) A% `. E
7 L7 b# G& m& }
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
9 O) E% C& C7 e8 |3 M& P
等日后再仔细研究,看显示函数究竟在哪里。
5 _9 J. h2 C. W. ^# u
# B! y0 J0 ?* y. I' N
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
$ Y% B/ I% n7 X# \9 E: @5 `
004316C8
, n2 d, ~% q; U9 C1 m1 Q) L. M
' `& E: b0 L, |8 T$ V5 n$ W- F
第1处
9 ]. d% |* s* t5 a0 V' y3 O, ?
void sub_4519B8(char *a1, ...)
+ {( Y5 f0 S3 n6 @) l1 X
{
7 l; t1 w+ I y, |# o; N
GLsizei v1; // eax
* f. ~- s: h" i
char lists; // [esp+4h] [ebp-800h]
. o0 T' D0 e# Y" m$ P( |. A
va_list va; // [esp+810h] [ebp+Ch]
' L) i0 ?- n3 g: y( f
4 w* Q P3 ]; o3 Y; f2 a, [& t; \! K
va_start(va, a1);
4 J( |( d5 u( E9 N
if ( a1 )
# J' W- S, [# E
{
6 O$ K/ q& r5 M; i5 |3 `& [
vsprintf(&lists, a1, va);
Q) n- a" o4 g9 x) V
glPushAttrib(0x20000u);
0 q3 C" o5 J# ?! ]; r0 s- L8 A. s( W0 l
glListBase(base);
4 \ T. ~/ T) a; V
v1 = strlen(&lists);
5 ^2 I6 ^+ h" Q5 Y5 d. k3 C+ D
glCallLists(v1, 0x1401u, &lists);
% M& [/ F# T7 {/ @% f
glPopAttrib();
8 M, t! {4 P( g+ f; Q- A
}
1 K. g& I! k$ N+ U& x7 G, l3 w
}
复制代码
' m1 M4 U7 Q: o" L$ W9 c
第2处
* g, l' C* T/ p1 M" G
void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
. E$ H# }+ O7 X% I% V2 y1 H C+ A( k# |$ ^
{
$ D' q- Q6 C/ E4 i6 H
int v4; // eax
0 S: U" K3 H; ?2 w# j4 |
GLsizei v5; // eax
2 D% @- T& s7 `: E' B) y, j* D
char lists; // [esp+4h] [ebp-800h]
' ?+ z, } n% _- F
va_list va; // [esp+81Ch] [ebp+18h]
; {7 o' B. w2 [) z9 d/ d4 F" @
0 v: b5 \7 o% t. x) e
va_start(va, a4);
8 G. H/ y. z: ^! K" @. R# Q
if ( a4 )
t) g! \4 i4 |" t, V9 j, |2 d' }
{
, u1 p, G$ O' t/ m0 \; q* W
sub_44FDD0(a3);
, V1 y! b5 k$ D4 w
v4 = sub_40BB44();
9 K/ ^# S( M/ b2 Z
glRasterPos2i(x, v4 - a2);
1 h) y8 [5 g/ {) g0 V$ _
vsprintf(&lists, a4, va);
* P" n: k1 M* o3 C7 c
glPushAttrib(0x20000u);
( i; }! X( J& Z; K: ~- H, g
glListBase(base);
7 Q/ @1 ~' N; z h; k
v5 = strlen(&lists);
; i( ^! m; K! U
glCallLists(v5, 0x1401u, &lists);
3 [- R- c3 W- u
glPopAttrib();
3 Q( {1 l+ u8 \. h( D
}
# l; @) x% \5 \5 z6 k! H
}
复制代码
! W% f# k' y% x, Q% U
/ Y% g8 f# |4 |- B; z7 ?, P
! Q& C* I5 z" p" u: s% ^1 g
第3处
void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
* B& f4 F& l. _
{
; b* D3 J7 j( v j! K9 q$ `" ^
GLvoid *v7; // ST08_4
" [" p c$ Z0 `; [) h# Q& ~
GLsizei v8; // eax
$ A5 r C* t+ t" h' T; ?
int v9; // [esp+0h] [ebp-1018h]
$ G0 V- c; w2 Z3 Z
char v10; // [esp+8h] [ebp-1010h]
+ u. K7 Z- T4 E6 f# v
GLvoid *lists; // [esp+100Ch] [ebp-Ch]
1 f3 Z% M( N, g2 ]6 V4 d$ z$ s3 E
char v12[5]; // [esp+1013h] [ebp-5h]
9 B: Y; ~ l8 A1 n0 b, J0 a
va_list va; // [esp+103Ch] [ebp+24h]
6 K ?6 ~' T1 ]7 L$ Q2 s
4 m0 l& v" \) ~. `" e
va_start(va, a7);
) i, ^/ a u. I4 L6 n, y+ o: m( ]
v9 = 1;
% |/ k4 g& G' W8 n! h' ]( S
if ( a7 )
' ~% W0 {$ Z3 U0 g, P! u2 Q
{
) }6 B% s. j$ T5 m1 P5 a6 h6 ]9 V
vsprintf(&v10, a7, va);
8 l, F4 D* ^. } P3 ~1 x& |% k6 T
glPushAttrib(0x20000u);
" F% o7 \6 f, ?" q* A/ Q# w
glListBase(base);
% A! A5 s+ w: t, I" d+ \
lists = &v10;
) V; L# h. {; ` m! I6 K, U
do
8 D( P; }/ C+ ?. Y3 U
{
8 x+ C' Y& F* Z/ @ m% {6 e4 z
*(_DWORD *)&v12[1] = lists;
- W' c* L$ y7 }
while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
! [* m3 U) d: g( a
++*(_DWORD *)&v12[1];
; ^, O3 ~% a# k4 Y
v12[0] = **(_BYTE **)&v12[1];
8 x% {% y* M3 k' H2 F* m
**(_BYTE **)&v12[1] = 0;
+ `- k) ~; n) |1 D! m3 ~
if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
) N# x' `% s$ d3 g, ~
*(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
6 o$ \( |+ L2 d/ \! r
y -= a5;
: R/ }1 Z+ F+ P R9 M% h
glRasterPos2i(*(_DWORD *)a4 + a1, y);
. u K) b( v: V) _% d, A. C# S1 |
v7 = lists;
! E+ D9 K- I! C8 A+ c; A: N
v8 = strlen((const char *)lists);
1 O" }+ y/ Y' g" @& Q- W5 k
glCallLists(v8, 0x1401u, v7);
7 F! A# N! W2 b5 y: l
if ( v9 < a3 )
/ o8 a# Y* i: z, Y
a4 += 4;
5 S/ |" K8 c! r2 r7 L. `% T
++v9;
2 S, e9 Z7 r% s* g6 f5 x2 C
lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
+ P' s3 h; j* c
}
8 Y' t+ t8 y9 }5 z' v5 c: U
while ( v12[0] );
, M+ E4 g4 c0 P* ~
glPopAttrib();
' u( V* Y5 X3 T
}
, I6 h) [- ?: x: h, @
}
复制代码
7 B C1 C4 @& c, y3 ]: ^. ?1 x+ [" V
5 p7 p f+ Q* Q! x% K X
P% `6 A' J7 L8 r
, z1 p5 }7 b# w( [1 Q+ G
$ T; p0 K+ v$ R$ x
/ Q1 Q: o8 b( ^! p4 y+ V- s
5 F- U% o9 k; o7 z
8 W! C2 j+ m/ Y6 Y& {7 k
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2