海外製アプリケーション日本語化の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