海外製アプリケーション日本語化のTips
意味はよく分からないが、後になって役に立つと思うのでメモ。
VB製の文字化け回避方法
00 00 00 64 00 44 42 01 00 06 54 61 68 6F 6D 61|.....DB...Tahoma
上のようなフォント指定があった場合の内容は以下の通り
00: Font charset
00: ?????????????
00: Strikethrough*8+Underline*4+Italic*2
Strikethrough = 0 'Falsetrue=1000=08h
Underline = 0 'Falsetrue=0100=04h
Italic = 0 'Falsetrue=0010=02h
64 00: Weight = 100
44 42 01 00: Size = 8.3 (00014244h=82500)
06: lenght of the フォント名
54 61 68 6F 6D 61:"Tahoma"
なので、文字化けを回避したい場合はFont charsetの場所を
80に書き換えればOK
それでも文字化けする場合は
「非日本語対応 Windows アプリケーションで日本語を表示させるための一般的手法」
http://www.tt.rim.or.jp/~naoz-i/index.html
を参照すればOK(なはず。<弱気)
文字化け回避の汎用をば
MOV BYTE PTR SS:[EAX+17],80
CALL DWORD PTR DS:[********]
JMP ********
PixelsPerInch 96→80
50 69 78 65 6C 73 50 65 72 49 6E 63 68 02 60
50 69 78 65 6C 73 50 65 72 49 6E 63 68 02 50
JMPで"CALL <JMP.&gdi32.CreateFontIndirectA> ; \CreateFontIndirectA"
をOllyで書き換えてやればたぶんOK
そのあとにDelphi(製だったかな?)はフォントサイズでPixelsPerInchを書き換えれば文字切れ回避はたぶんOK
(細かい修正箇所があるかもしれないが、FontIndirectAを使ってるアプリならたぶん大丈夫)
以上「需要無視」の741でした
>>745は酔っていて自分用メモを貼り付けただけなのでTotal Uninstallを例にOllyで開いてCreateFontIndirectAを検索
1個の JMP DWORD PTR DS:[<&gdi32.CreateFontIndi>
5個の CALL <JMP.&gdi32.CreateFontIndirectA>
が見つかるけどJMP〜は無視。CALLを調べると41ADB6の数行上に
0041ADA2 (略) Case 1 of switch 0041AD98
があるから、このCaseがある直下の(この場合41ADB6)を適当な所へJMPをいれる。(今までの経験上Case直下の所だけ書き換えたら文字化け回避できただけで100%OKとは限らない)
Total Uninstallの場合49f260以降が00で埋まっているから
0041ADA2 JMP 0049F260
0049F260 MOV BYTE PTR SS:[EAX+17],80
0049F265 CALL 00406EB8
↑あらかじめ0041ADA2の内容をコピーしておく
0049F26A JMP 0041ADBB
↑41ADB6の次の命令のアドレスへJMP
以上を書き換えてやれば文字化け回避できるはず。
CreateFontIndirectAが無いアプリ(例Mercora)は・・・おいらには無理でした
以上のやり方のきっかけ&手本になった
非日本語対応 Windows アプリケーションで日本語を表示させるための一般的手法
http://www.tt.rim.or.jp/~naoz-i/index.html
の岩間さん(でいいのかな?)に感謝
2004-07-06(Tue) 17:42