冒险解谜游戏中文网 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 编辑
. K- k8 n- D3 N# M9 H
) r# Z$ l) \3 V8 s
glCallLists的调用处,共有三处。
$ ~1 d( B; X4 K- _, z- Z
此三处估计是对应游戏中三类不同的字幕。
& Y* O/ j; M( J+ G
接下去分析清楚接口之后,大算用函数替换的方法来实现汉化。
( O, w1 M) \0 U) X$ {
分析的文件名,748 KB (765,952 字节)
, C8 f3 r0 [) j3 _5 r
toh.exe
h3 r# K4 r8 j9 h m
9 u- u) s O; i5 P( R7 t
经过hook验证,第3处没有被使用。屏幕上找到一句字幕之后,用cheatengine下断点,在以下地方断下,
+ ? h7 Y3 s6 b; E
等日后再仔细研究,看显示函数究竟在哪里。
3 X4 l, Q- I3 h$ a
' C/ C+ F" v) f" }+ \0 I. Q: G
toh.exe+316C8 - 8B 45 F8 - mov eax,[ebp-08]
0 T: K0 h" K9 I2 W: x }
004316C8
9 ^- ], H6 {; k. {
: \0 x( ~$ |! P+ _9 z
第1处
3 @7 r; k" Q# F9 ?) g$ u" n
void sub_4519B8(char *a1, ...)
' v% i7 K9 w6 c# }! f) I
{
( \3 C! Y! d% G. r2 b
GLsizei v1; // eax
5 B$ D+ S& D* n
char lists; // [esp+4h] [ebp-800h]
$ j' p; I: V& ^4 ?5 _8 e
va_list va; // [esp+810h] [ebp+Ch]
% Z6 i) o* G. b4 ?+ }
3 {) y7 X% t) s9 A; _
va_start(va, a1);
8 V( \% ~! i5 |" G
if ( a1 )
/ n# h$ W* n4 z1 M- _
{
; Q0 k" m) D8 N# \* b5 O
vsprintf(&lists, a1, va);
; D- ]& U+ a) [0 Z. K/ q& u
glPushAttrib(0x20000u);
& Z8 P2 U) Y5 o9 D% V
glListBase(base);
* n: ]% \- M% j' o* h# h
v1 = strlen(&lists);
* j! {: [7 B3 c6 n$ q
glCallLists(v1, 0x1401u, &lists);
# i. ^# W5 T9 T! ~- X- d1 |2 t! ^
glPopAttrib();
( D% L( s- b, @) `( j( X! C
}
) L0 \' F3 Z0 y! m2 N( Z$ \
}
复制代码
6 D- x, B9 h7 n' B
第2处
7 o) O( }" P7 p' F" |4 A4 O! j
void sub_451A3A(GLint x, int a2, int a3, char *a4, ...)
* O! t/ W1 I9 r, t
{
5 R Q$ A, v9 q- p3 P+ v* J
int v4; // eax
4 k6 i! Q' t; ^5 p
GLsizei v5; // eax
5 x4 p2 ^: m: w+ b8 n
char lists; // [esp+4h] [ebp-800h]
$ t/ F- g4 r, t5 {
va_list va; // [esp+81Ch] [ebp+18h]
" i" ~+ e: I6 ^7 _: Y. @" a' E
! n4 O, v5 c1 T
va_start(va, a4);
3 i5 ~5 L2 [) W' G& }
if ( a4 )
$ A) O! \+ G. d$ [+ e. B& h
{
$ }3 |& c1 k" I
sub_44FDD0(a3);
1 Z/ q. F1 |* \' d- G, \4 ]" }
v4 = sub_40BB44();
* o5 `% f: E8 ?- k
glRasterPos2i(x, v4 - a2);
4 m9 g4 i1 o. ?/ X9 P
vsprintf(&lists, a4, va);
$ x. H. a9 v. r2 t* J( H
glPushAttrib(0x20000u);
; A. E- V% _$ s' m* V9 k7 L
glListBase(base);
' M3 b0 E4 i% @5 t+ p( q
v5 = strlen(&lists);
5 N8 P& ]4 O0 X( |
glCallLists(v5, 0x1401u, &lists);
" \. W; d6 r* V+ r6 U2 y
glPopAttrib();
/ x! c& |+ ?1 n: l5 p6 @; N( C
}
, v: D; m" T( F* t
}
复制代码
/ f( C$ F3 u: @' d3 U2 r
9 v7 M% M, ^+ r' k# M
. b) w- D, U) _- j3 Y
第3处
void sub_451D7C(int a1, GLint y, int a3, int a4, int a5, GLuint base, char *a7, ...)
9 B" U, k6 z& g7 s8 L
{
1 R1 t) f) q: W z/ F
GLvoid *v7; // ST08_4
* w$ L) ~4 C# {/ t: V0 K" j3 y
GLsizei v8; // eax
; L+ V. P4 c: }2 H5 f# E m5 L5 @
int v9; // [esp+0h] [ebp-1018h]
) V; m) k# D/ _9 K
char v10; // [esp+8h] [ebp-1010h]
- k( {9 }5 q5 r/ l2 |& _
GLvoid *lists; // [esp+100Ch] [ebp-Ch]
0 f) i3 A; c4 w' @( d4 f* I ?% I
char v12[5]; // [esp+1013h] [ebp-5h]
( m! [: I8 X/ m: U
va_list va; // [esp+103Ch] [ebp+24h]
6 X- ]7 R( c0 b
: z/ N5 u/ L1 V6 @, N- u
va_start(va, a7);
) d' @6 w9 J% O0 w
v9 = 1;
- i& Q+ _- T6 g
if ( a7 )
- V" G5 f. H2 O: s4 u
{
; ~0 `% v2 t0 `
vsprintf(&v10, a7, va);
4 ^6 ?0 b6 {* M0 m4 X" i: m! p% U
glPushAttrib(0x20000u);
- i0 X1 z% K% w9 ~4 j
glListBase(base);
& l8 ^ {. p L9 p8 _( B
lists = &v10;
0 D: d, H4 P; r1 x8 Y7 B! O
do
; i& n+ T3 f0 c3 N2 M2 Q$ q6 S
{
$ W1 _1 _' r$ H6 g
*(_DWORD *)&v12[1] = lists;
+ |& G4 ~# ~% l4 |! J! q/ E
while ( **(_BYTE **)&v12[1] && **(_BYTE **)&v12[1] != 10 )
, L+ q! q) _$ {; \1 t8 \
++*(_DWORD *)&v12[1];
* M( ^- Z+ P' X" O
v12[0] = **(_BYTE **)&v12[1];
3 N! W/ o, G0 H7 Q- y+ Z
**(_BYTE **)&v12[1] = 0;
7 C. E7 j! D$ \, Z% s" R) Z
if ( v12[0] == 10 && *(GLvoid **)&v12[1] != lists && *(_BYTE *)(*(_DWORD *)&v12[1] - 1) == 13 )
$ Y% b" W3 o9 y
*(_BYTE *)(*(_DWORD *)&v12[1] - 1) = 0;
; x* o9 r5 B$ c! M2 n' r
y -= a5;
1 Y. H/ G) E1 Q4 D* D2 f k
glRasterPos2i(*(_DWORD *)a4 + a1, y);
3 W+ B1 b' Q7 t: r4 Q/ R
v7 = lists;
$ A0 B! D# l4 `. B5 b
v8 = strlen((const char *)lists);
$ r$ l1 R7 r7 p
glCallLists(v8, 0x1401u, v7);
) A% ?. f) |# p0 T/ p% a
if ( v9 < a3 )
, C) p' U' w" w5 _
a4 += 4;
: ]* F; m& k5 I `4 a
++v9;
% v8 U8 x6 s/ a) @# k$ m( H* ~% U
lists = (GLvoid *)(*(_DWORD *)&v12[1] + 1);
' |& p! Z" k, p1 V
}
7 S( Q8 b; p9 }/ t- L, v" P
while ( v12[0] );
) k' p9 H1 J# U8 Z9 \8 y4 D; d$ P* _2 O' g
glPopAttrib();
4 u/ g5 _! F% L3 V- g$ `6 c/ F
}
6 N2 o( i5 L3 o4 @6 j* s! [
}
复制代码
: U6 F; J1 H% t6 }3 Q9 x
/ J/ S$ y/ n3 e/ U' h
% s2 f* s Q. I a$ `
, N+ i9 f' A G1 v( M( k
( [! X" \/ x9 z! g1 e. c
7 O- ~. O1 {7 {6 @* K4 ^: Y
, J1 C+ b. c$ O' G- o, _0 D ^
5 N7 J3 Q. z a
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2