本帖最后由 shane007 于 2023-8-26 14:47 编辑 1 G: ]' E% H& A. p' y
/ r0 d" u8 T0 n' m/ O
这个有的在上一波(第4波)中进行了比较深入的分析。) i+ Q+ X4 |" J' W5 v
本次在以前分析的基础上,排除无关内容,只抓和汉化有关的要点。
! V1 T/ l$ D+ f( i C
6 p6 E6 Y( h, A《1》这个游戏的初始化Directx9共有2处,一处是xcDxShader.dll,还有一处是xcDxOldschool.dll& P# K9 B0 |1 Z+ J7 ]& E* h4 s
具体要抓取哪个CreateDevice用于往屏幕上写字,需要写代码测试一下。$ H4 T/ m) G# v q/ g
2 d/ n. `% Y; E# T
《2》这个函数,以ida pro的静态分析为主,暂时认为字幕显示函数是xcEngine.dll中的SetTextString方法。+ ]4 T$ p/ _- U' L/ U, I
/ w' @4 p& w1 y5 ^" t
关键是这2句,Str是完整的字幕,char_unicode是其中一个字符。
. d9 C! s: G. G' z* ` }" {从代码上看,这个游戏是支持双字节的。但是由于采用的是图片字库,搞清楚结构不容易,因此暂定用hook方法自己写一个显示函数。" G/ y+ X0 I0 z0 O& [, N
这函数传入一个text_object,里边也许会有颜色和坐标。
' o) g, j$ ]2 `( z- char_unicode = (unsigned __int16 *)(*str + 2 * counter);
7 G0 y# d4 l$ M - *char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);
复制代码 1 X' a$ \! a7 F6 M
此外,该游戏在字体文件Sl2fnt.dat不存在的时候调用系统字库,3 i! C+ T( W$ o' f0 c
因此,也许在调用createfont的时候,能用修改参数的方法让该游戏支持中文。
: d9 O/ x) i; s7 |7 E7 g. g# M7 G+ y3 W) y% h3 W# h# S1 b& }
% n5 j$ a$ @: o; J" k) F7 m以下是修改过变量名的代码。2 W" i: V* c$ M
- int __thiscall xccFrameText::SetTextString(_DWORD *this, int length, _DWORD *a3, int show_subtitle_flag)- h. @" s+ M: I; P
- {6 F, v& h/ \+ w$ `/ e2 h
- _DWORD *text_object; // esi: b& W: b$ J1 n, y- X8 |) S
- int offset; // ebx8 n. q: w2 D# M
- int counter; // edi* }! Z. n3 R2 t, l1 M/ K
- _DWORD *str; // eax
( P) z% j1 @9 Y; b: y+ v( | - unsigned __int16 *char_unicode; // ebp. `+ H) b8 V( m6 `% m
- int v9; // edx
! h* l9 U6 X, y; ?
: Y1 m; }1 c; H; Y# k- text_object = this;3 X" R4 w& U5 H2 y; M! u4 c! c
- offset = 32 * length;0 I% Y4 ~) F" c
- counter = 0;
, |' N2 y9 `! e' ^3 ^; G - *(_DWORD *)(32 * length + this[21] + 8) = 0;
4 a/ ?, h) `: E i# B - xctArray<unsigned short>::add(*a3, a3[2]);& c7 B# C: g: l8 ?$ q; _
- if ( !show_subtitle_flag )
! ~' U" u' N4 p# } - {
' @) U- @2 `& e0 q0 y/ b2 M0 Z - str = (_DWORD *)(offset + text_object[21]);: c, a7 _1 O5 v5 h* j; ~# L
- if ( str[2] > 0 )/ s2 d+ j4 Y+ H, @- {
- {5 D5 b6 u& T2 r' g% V1 l; Z& H
- do
/ |! K" b/ C- e; X' y - {
4 c0 Q3 Z/ p- r% r - char_unicode = (unsigned __int16 *)(*str + 2 * counter);
4 E0 H& K* N& r4 ?* Y: w - *char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);( R3 M$ Z H6 Z3 I5 ]+ L, @# Q, l+ `4 i9 a
- ++counter;8 t" h: o) @! K, [) G, `$ v( p9 j
- str = (_DWORD *)(offset + text_object[21]);# l! O" I: U& K; u, N5 ~! o; j
- }* E7 w, {, S/ s& P! t1 V
- while ( counter < str[2] );& {0 n4 Z! v: d% a
- }' t$ `% J" q8 n* i& D# ~
- }& O& s( N) p: Z# E! J/ a2 ~
- v9 = text_object[21];
/ }" X- G" o7 @4 |, g' w5 r3 t# c0 R - *(_DWORD *)(offset + v9 + 28) |= 4u;8 f$ y6 s6 @) }3 u5 S
- return offset + v9 + 28;
8 U: w# i9 p+ P8 M4 M - }
复制代码
4 b4 e7 @ `* @xcEngine.dll 中的CreateFontA代码,可以尝试修改字符集和字符名称,看看是否能显示出中文。
& u8 B+ }. H+ N* F9 g6 e- h = CreateFontA(
" U' [3 B1 U" C9 ]; l1 W7 {$ t/ I - -*((_DWORD *)a1 + 1), // 字体高度(负值用于可变尺寸字体)! y. n& ?6 |& g9 q* U4 P J
- 0, // 字体宽度(0 表示由系统选择合适的宽度)
/ @4 P" L8 l# } - 0, // 文本输出方向角度$ T5 u' S* ]& k4 p
- 0, // 字体基线方向角度+ S5 }/ K5 p+ R0 i
- *((_DWORD *)a1 + 3), // 字体重量(例如:FW_NORMAL、FW_BOLD)% l7 |9 F9 @1 O- ?+ J- Q1 u0 _% e
- *((_DWORD *)a1 + 4), // 是否斜体! ~7 S9 {$ ~. N( ]+ G f& P( A
- *((_DWORD *)a1 + 5), // 是否下划线% u' ^2 P' f! T4 @0 T% L2 ?
- *((_DWORD *)a1 + 6), // 是否删除线" X9 v( r( m+ q
- *((_DWORD *)a1 + 7), // 字符集(例如:ANSI_CHARSET、DEFAULT_CHARSET), P" ^# M) D8 ~9 Q
- 6u, // 输出精度(OUT_DEFAULT_PRECIS)
* K$ N, o* [: v - 0, // 剪裁精度(默认剪裁精度:CLIP_DEFAULT_PRECIS)( y' S$ f2 W1 {3 L
- 4u, // 字体质量(DEFAULT_QUALITY)( E/ e9 e7 h) C( ?$ c0 b" C
- 2u, // 字体族和固定/可变宽标志(字符剪裁精度:CLIP_CHARACTER_PRECIS)
6 w4 |, H6 x" N- w - *(LPCSTR *)a1); // 字体名称
复制代码
# K; p3 N1 |' h用API monitor 跟踪了一下GetDrawnCharCount ,发现和画面都能对应上,比如一下2行的24和8,就是对应画面上2行字幕的字符数。# \; e; P e, B
1 O5 F! s2 k$ y5 |+ w8 B- # Time of Day Thread Module API Return Value Error Duration$ }6 U: G6 L' p) v
- 6353 2:44:57.277 PM 1 SL2.exe xccFrameText::GetDrawnCharCount ( ... ) 24 0.0000002
( n3 P, x- X$ }# B+ w- D - 6354 2:44:57.277 PM 1 SL2.exe xccFrameText::GetDrawnCharCount ( ... ) 8 0.0000001
; D7 Y, n3 b- ?# [, ^( R4 s
复制代码
) ?% d3 c9 m! M/ b' g: h% q8 B7 I3 j$ d# q+ |8 N
! K5 D3 r5 n0 i2 |8 V( T
& l: v+ N( G4 m6 p
/ ~$ q, \: g% J2 h7 H0 [: l
5 K9 q7 M R& t+ Y, y8 D
R0 r5 T; V- Q# A |