杉宫竹苑工作室

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3039|回复: 0

【转】四步搞定非标字体

[复制链接]
发表于 2015-1-23 14:51:08 | 显示全部楼层 |阅读模式

正式会员享受无限制浏览网站功能和高速网盘下载,赶快加入本站吧!

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Share 于 2015-1-23 14:57 编辑

作者: 韦斯特·金
来源:汉化新世纪
源地址:http://teach.hanzify.org/article/572-1144786226.html

 我在汉化 System Mechanic 6.0s 的时候,很多地方的都需要手动修改字体,但是我对手动修改字体并不在行,所以在教学站上看了很多相关文章,但还是看不懂,索性自己研究了一番,嘿嘿,没想到居然成功了。^_^
  想到很多汉化朋友有时候也为这个犯愁(当然不包括那些高手),因此谨以此篇文章供各位同仁参考。
操作建议:在手动修改字体之前,最好先处理完标准资源,且不要汉化非标资源,这样有利于在 OllyDbg 中搜索字符串。
目标文件:SysMech6.exe (System Mechanic 6)
使用工具:FontSpy(jingulong修改版)、OllyDbg、UltraEdit
第一步:确定要处理的字体名称、字体大小
  用 FontSpy 打开要检测字体的文件(如图1,本文即为:SysMech6.exe),尽量运行各个模块,以避免遗漏。
1.gif
图1
程序运行完后,退出程序,FontSpy 会自动打开字体检测结果(本文即为:SysMech6.out.htm),得出如下结果:
(LPLOGFONT:0012FC3C:FFFFFFF5_00000000_00000000_00000000_00000190_00_00_00_01_00_00_00_00:"MS Sans Serif")
CreateFontIndirectA returns: 840A0995
(LPLOGFONT:0012FA14:FFFFFFF5_00000000_00000000_00000000_00000190_00_00_00_01_00_00_00_00:"Arial")
CreateFontIndirectA returns: 100A0A39
(LPLOGFONT:0012F20C:FFFFFFF7_00000000_00000000_00000000_000002BC_00_00_00_01_00_00_00_00:"Arial")
CreateFontIndirectA returns: 980A0CDC
  从检测结果中可以看到:此程序基本是用 CreateFontIndirectA 函数来创建字体的,而且要处理的非标字体只有 MS Sans Serif 和 Arial。
第二步:修改“标准的”非标字体
  运行 OllyDbg,点击“文件 -> 打开”(或者按 F3 键),选择要反汇编的程序(本文即为:SysMech6.exe),载入后,点击鼠标右键,选择“搜索 -> 所有参考的文本字符串”(如图2),然后在打开的文本参考窗口中点击鼠标右键,选择“搜索文本”(如图3),在对话框中输入刚才检测到的字体“Arial”并选中“整个范围”(如图4),点击确定后即可找到该字体名称(如图5),双击该行后返回到反汇编窗口中对应的位置(如图6),此时,是修改字号的关键,我发现字号的设置一般不会里字体名称很远,可以在字体名称附近寻找,一般不会超过20条语句(在图6中可以看到,用红框标记的 mov edx,8 即为该处字体的字号设置),双击找到的字号语句,在对话框中将 8 改为 9(如图7),意思就是将 8 号字改为 9 号字,然后点击“汇编”再点击“取消”退出,这时该处的字号就改好了,然后继续开始下一处字号的修改。
2.gif
图2
3.gif
图3
4.gif
图4
5.gif
图5
6.gif
图6
7.gif
图7
  选择“查看 -> 参考”(如图8),回到文本参考窗口,点击鼠标右键,选择“查找下个”(或者直接按 Ctrl+L 键,如图9),找到下一个“Arial”后双击(与上一段中的操作相同),回到反汇编窗口后在字体名称附近查找字号设置语句,双击字号设置语句,将 8 改为 9(如图10),点击“汇编”再点击“取消”完成该处字号的修改。这里说明一下,我从该程序的字体修改中发现,一般设置字号的语句不是 mov edx,x 就是 push x,而且 push x 语句基本位于字体名称下面,而且很近;而 mov edx,x 与字体名称的距离稍远,有时候也会出现在字体名称的上面(如图11);另外,有些需要修改的字号不一定是 7 或 8,可能是 -0B(如图12),此时就需要将 B 改为 C;对于那些字体名称附近没有字号设置语句的就可以暂时忽略,继续寻找下一处字体。
8.gif
图8
9.gif
图9
10.gif
图10
11.gif
图11
12.gif
图12
  按照上述方法将所有字体名称为“Arial”的相应字号语句修改后,在反汇编窗口中按鼠标右键,选择“复制到可执行文件 -> 所有改动”(如图13),在弹出的对话框中点击“全部复制”(如图14),之后,在打开的文件窗口中按鼠标右键,选择“保存文件”(如图15),将修改后的文件换名保存即可(如图16),最后关闭文件。
13.gif
图13
14.gif
图14
15.gif
图15
16.gif
图16
  此时,只处理完了“Arial”字体,“MS Sans Serif”稍后处理。接着,用“点睛字串替换器 v1.05”查找 Delphi 字串,将找到的“Arial”全部改为“宋体”,然后替换字串。此时,可以运行处理后的文件,看看是不是每一处字体为“Arial”的地方都改成了“宋体”9号字,如果还有的话,请检查一下标准资源中对应窗体中的字体、字号是否已经修改。
第三步:修改“特殊的”非标字体
  上一个步骤中讲了“标准的”非标字体的修改方法(我所谓的“标准的非标字体”,是指属于 Delphi 字串类的字体名称,即可用“点睛字串替换器”的“查找 Delphi 字串”功能找到的字体),如果用 FontSpy 还检测到其他“标准的”非标字体,同样可以用第二步中的方法进行修改。而很多 Delphi 或 C 语言类的程序中,我们在搜索 Ascii 字串时往往会找到“MS Sans Serif”字体,当我们用 UltraEdit 打开文件后找到相应位置的字体时可以看到它的十六进制不是 Delphi 字串的“FF FF FF 05 00 00 00 41 72 69 61 6C”(即字串“Arial”的 Delphi 格式)形式,而是“0D 4D 53 20 53 61 6E 73 20 53 65 72 69 66”(如图17),最前面的 0D 是长度标识,并且在查找该处字串的偏移时要以 0D 的位置来查找,而不是后面的 4D。这种“特殊的”非标字体,往往会被程序用在提示信息对话框中,下面继续处理这种字体。
17.gif
图17
  用 OllyDbg 打开第二步中修改后的文件,用同样的方法搜索“MS Sans Serif”,找到以后可以看到,除了在字体名称下面有一处 push x 语句之外(如果是 9 的话就不用改了),上面不远处还有一个 push 8 语句(如图18),这里也是需要修改的。完成后用同样的方法保存文件,然后关闭文件。
18.gif
图18
  接着用 UltraEdit 打开修改后的文件,找到那个“MS Sans Serif”,将它改成“宋体”,即把“0D 4D 53 20 53 61 6E 73 20 53 65 72 69 66”改为“04 CB CE CC E5 00 00 00 00 00 00 00 00 00”,注意修改前面的长度标识(如图19),最后存盘。
19.gif
图19
第四步:修改其他未处理的非标字体
  当我们执行完以上步骤之后,运行程序,再检查一下是否有遗漏的地方。这时,我发现有一个地方的字号没有修改(如图20),记下这里的字串“Last Run:”,退出程序。再用 OllyDbg 打开修改后的文件,还是用同样的方法搜索“Last Run:”(这里就体现出为什么在处理完标准资源之后就手动修改字体的原因,因为 OllyDbg 不能搜索中文字符串),找到之后可以看到临近的几个字符串也与图19中出现的相同(如图21),可以确定这里就是要找的那个“Last Run:”了,双击后回到反汇编窗口,在字串附近找了一下,发现上面有一个“mov edx,7”(如图22),参照上面的介绍以及图19中看到的字体大小可以排除那个“mov ebx,8”,那么,“mov edx,7”就是要找的字号设置语句,修改它,然后保存,最后关闭文件。
20.gif
图20
21.gif
图21
22.gif
图22
  最后再运行修改后的程序进行检查,非标字体基本处理完了,如果还有的话,就继续按照第四步的方法进行处理。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SgzyStudio

GMT+8, 2024-5-4 00:05 , Processed in 0.129653 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表