本帖最后由 shane007 于 2023-8-26 14:47 编辑
* d8 |, e+ G, v% }! F3 f* R9 m- ~1 n L) y
这个有的在上一波(第4波)中进行了比较深入的分析。
, a2 f- w" [* O本次在以前分析的基础上,排除无关内容,只抓和汉化有关的要点。8 a$ V6 U3 c5 I- u
7 \6 ^( I2 \( {! z" B《1》这个游戏的初始化Directx9共有2处,一处是xcDxShader.dll,还有一处是xcDxOldschool.dll
+ P' C7 Z" @4 G9 W# v8 I. y0 n' B 具体要抓取哪个CreateDevice用于往屏幕上写字,需要写代码测试一下。
. A" G' F+ J' ~2 ~" j/ @% U& C% W8 l4 H9 _
5 O$ t" M" _& G+ m《2》这个函数,以ida pro的静态分析为主,暂时认为字幕显示函数是xcEngine.dll中的SetTextString方法。
7 c3 z' [' ^$ Z2 F
) K0 E2 W/ \, Q6 l2 l/ g% S1 R关键是这2句,Str是完整的字幕,char_unicode是其中一个字符。) ^! G9 s3 f! P
从代码上看,这个游戏是支持双字节的。但是由于采用的是图片字库,搞清楚结构不容易,因此暂定用hook方法自己写一个显示函数。
4 ~, C4 ]+ r- Y6 u, ]这函数传入一个text_object,里边也许会有颜色和坐标。
' u$ U8 K/ G5 K- char_unicode = (unsigned __int16 *)(*str + 2 * counter);
! ~: B/ H6 z2 c. Q7 I7 _/ @ - *char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);
复制代码 1 n3 H/ J: Z0 w4 F1 ^4 K
此外,该游戏在字体文件Sl2fnt.dat不存在的时候调用系统字库,
: v; n1 O. E' ~" _% ?/ g因此,也许在调用createfont的时候,能用修改参数的方法让该游戏支持中文。
3 W/ d6 R7 {+ h! o( Z9 p: `
+ `; z4 T, y0 Z
) h3 _: j! x' R6 n以下是修改过变量名的代码。 }. D+ }# Z+ h
- int __thiscall xccFrameText::SetTextString(_DWORD *this, int length, _DWORD *a3, int show_subtitle_flag), ]6 W( w+ X: ]
- {
. l5 d" c% R/ T7 t. \ - _DWORD *text_object; // esi
2 o/ Z& S: r K4 H - int offset; // ebx+ J5 J) @- b; Y4 v) j' a3 G% B. ~- G: D
- int counter; // edi
) s. A. ~8 e6 \" c2 G/ k: M - _DWORD *str; // eax7 R* g8 i- z9 `# x; V H) L
- unsigned __int16 *char_unicode; // ebp
' n6 e: U: S( C: P1 I - int v9; // edx* M8 Q m9 O' |1 V: {7 ^
- f; W3 z$ H* C
- text_object = this;
' M: T/ f2 p5 | - offset = 32 * length;
" `* w' T6 x; q7 W - counter = 0;% f M) c4 h& e! B* Q# P) @
- *(_DWORD *)(32 * length + this[21] + 8) = 0;; C4 Q& A. d" i' E4 U
- xctArray<unsigned short>::add(*a3, a3[2]);4 o: b( J/ Z4 f0 V9 p
- if ( !show_subtitle_flag )' w0 g) Q4 e5 \. V) D% y
- {
+ r7 f3 c7 N9 A* Y7 o4 } - str = (_DWORD *)(offset + text_object[21]);
: y3 ?6 s' W" d+ N# d: @ - if ( str[2] > 0 )' w& {" _/ U, B( ]: K+ {
- {1 v+ }* K9 `. E' Z
- do
4 W6 i. S$ {/ h+ P - {
. C" V" Q0 B- d8 ~3 e. ?# ~ - char_unicode = (unsigned __int16 *)(*str + 2 * counter);
) P$ K/ h" W( F) H- ]% R9 v - *char_unicode = xccTextureFont::GetCharacterIndex((xccTextureFont *)text_object[20], *char_unicode);
, K4 V) P2 s9 F - ++counter;# y- @# Z- A5 j4 @" ?/ ^! M
- str = (_DWORD *)(offset + text_object[21]);2 P& ?6 X# i- s+ g$ Q2 K+ a
- }7 h/ U- J' A8 y b" E8 d
- while ( counter < str[2] );! Z7 F- T, Z! ?' k( K- n: b
- }
. m4 L! w& v# L6 N3 h+ o - }- q3 P5 l0 ?/ B+ ~+ @$ D9 s; w& V
- v9 = text_object[21];& ~! b5 }7 L" e% r! g2 D
- *(_DWORD *)(offset + v9 + 28) |= 4u;7 e0 y! ~! f3 J2 {$ q6 ^
- return offset + v9 + 28;. t+ P4 x8 B" ]
- }
复制代码
- @6 Z6 K2 o3 |/ I4 txcEngine.dll 中的CreateFontA代码,可以尝试修改字符集和字符名称,看看是否能显示出中文。
5 v2 w+ b* e: s( i" A9 J- h = CreateFontA(
, ~& @) f. n% Q - -*((_DWORD *)a1 + 1), // 字体高度(负值用于可变尺寸字体)# l$ n, i/ {; B7 s( f8 r
- 0, // 字体宽度(0 表示由系统选择合适的宽度)/ }' E! R9 u& F3 I2 F9 R7 |
- 0, // 文本输出方向角度
3 [/ D' K4 F& t: P0 l' q - 0, // 字体基线方向角度- M" j8 ~ {1 ?* o" i
- *((_DWORD *)a1 + 3), // 字体重量(例如:FW_NORMAL、FW_BOLD)( \7 m/ [1 k S- T5 }! B: h
- *((_DWORD *)a1 + 4), // 是否斜体) [5 [* Q% y/ @0 Q1 T
- *((_DWORD *)a1 + 5), // 是否下划线1 I5 M- @! h. R- C0 u
- *((_DWORD *)a1 + 6), // 是否删除线
0 h: \2 U+ K* V M8 x# z - *((_DWORD *)a1 + 7), // 字符集(例如:ANSI_CHARSET、DEFAULT_CHARSET)$ n+ J. o9 r% E: i4 Q/ E
- 6u, // 输出精度(OUT_DEFAULT_PRECIS)
! F/ _: M' g) k% [ - 0, // 剪裁精度(默认剪裁精度:CLIP_DEFAULT_PRECIS)
( G( i, T+ \' E1 |% j6 K - 4u, // 字体质量(DEFAULT_QUALITY)
% r! c7 E! w7 P) H. @9 F2 J1 f# Y - 2u, // 字体族和固定/可变宽标志(字符剪裁精度:CLIP_CHARACTER_PRECIS)
4 H6 X4 ~/ U& Z N - *(LPCSTR *)a1); // 字体名称
复制代码
/ c; R1 p7 k! D用API monitor 跟踪了一下GetDrawnCharCount ,发现和画面都能对应上,比如一下2行的24和8,就是对应画面上2行字幕的字符数。& d' R- M7 h7 y1 G" F O3 A8 I
+ E& a# \7 h8 t! g) t! R
- # Time of Day Thread Module API Return Value Error Duration
^, a$ h8 {8 L" H& f7 D# r1 H! a - 6353 2:44:57.277 PM 1 SL2.exe xccFrameText::GetDrawnCharCount ( ... ) 24 0.0000002
$ f9 Y, `1 v! Q# u/ ] - 6354 2:44:57.277 PM 1 SL2.exe xccFrameText::GetDrawnCharCount ( ... ) 8 0.0000001
+ q* l7 `3 L$ W) _1 S- p: p
复制代码
2 J' R, q# O0 x2 n8 h b
0 n4 |$ P/ }) G* J! c" j5 x# y" S C( K6 _% F8 U. Q5 i' g. h/ R2 k
. G- V3 m5 O8 w1 |' l
]- e3 d( _* p1 ?$ b
" n \1 ~, C! ^7 |4 k. g1 h
+ P3 {' q+ T8 w9 e |