·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> Delphi汉化 >> 再谈一谈软件汉化后字体的修改(Dephi篇)    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

再谈一谈软件汉化后字体的修改(Dephi篇)

作者: 飞鹰 来源:汉化教学 时间:2003-08-05 点击:15244

再谈一谈软件汉化后字体的修改(Dephi篇)

作者:飞鹰(flithawk)


  大家好!自我介绍一下,我叫飞鹰,从事汉化工作已经有一年多的时间了,如今是汉化新世纪的成员之一,今天我想与大家共同探讨一下软件汉化后字体的修改。有人可能会说:软件汉化后用 eXescope 这类软件就可以很轻松的改变字体了,还需要再探讨吗?其实,你错了,不是每一个软件都可以用这种方法来修改字体,我在汉化当中就发现很多软件汉化后,字体也全部改成为了我们希望的“宋体,9号”,但运行软件一看,还是有些地方的字体非常难看,遇到这种情况我们就需要“强制定义字体”了。现在,我就以一个实例具体讲解一下修改这类软件字体的方法。

参考文献:
《Delphi 字体修改一例》  作者:梁利锋
《Delphi 字号修改之二》  作者:梁利锋
《汉化 WinImp 的一点心得——实战 ASCII 字符后期处理》  作者:Ronnier
《还我庐山真面目——WinZip Self-Extractor 字体的修改》  作者:Ronnier&飞鹰

改法详解

  实例软件:PE Explorer 1.40
  测试工具:FI 2.5
  修改工具:W32Dasm 8.94 汉化版,UltraEdit32 8.20 汉化版(简称UE),点睛偏移量转换器 0.94B。
  修改方法:首先,用 FI 2.5 检测可知 PE Explorer 1.40 是用Dephi编写的,我假设你现在已经把该软件中的所有 RCData 资源与ASCII资源都汉化完了,运行软件后出现如图一所示的界面。
(图一)
从图中可以看出,用红色框起来的菜单栏中的字体非常难看,下面我们就来修改一下。用 UltraEdit32 打开该软件,查找ASCII码“MS Sans Serif”,每找到一处就把该处的修改为“System”,后运行软件看一看有问题处的字体是不是变大了,如果改变,恭喜你!找对突破口了;如果没变,把该处改回原样,继续往下找,直到找对为止。对于该软件,当我把查找到的第二处地方改为“System”时,运行软件一看,界面菜单的字体变了,如图二所示。
          (图二)
下面,我们先把该处改为“宋体”,不足的部分用00填充,改变字串长度计数器的值为04,并记下该处的偏移地址,此处是f8137H,如图三所示(注意:记偏移地址的值时光标一定要压在整个字串的前一个字节上)。
     (图三)
现在我们要把该偏移地址转换为RVA值,打开点睛偏移量转换器软件,按这样操作:先点击“...”浏览按钮,选择需要载入的文件-->在“实偏移”文本框中输入字串的偏移地址(即f8137)--> 之后,RVA值可以从“虚偏移”文本框中看到(这里显示为4F9337),如图四所示。
           (图四)
后用 W32Dasm 反编译该软件,查找“4F9337”,可以找到三处内容相同的地方,如果你发现找到的地方向上看时有“push 00000009”这样的语句,就说明它已经是9号字了,无需再改;直到你找到的地方向上看时有“push 00000048”、“push 00000008”(说明它是8号字)和“* Reference To: kernel32.MulDiv, Ord:0000h”这样的语句,才能算是找对地方,如没有上述这些特征的话,一律表示字体大小的设置肯定不是该处。在该软件中,找到设置字体大小的反编译代码如下:

* Referenced by a CALL at Address:
|:0041D9F7
|
:0041D81C 53 push ebx
:0041D81D 56 push esi
:0041D81E 57 push edi
:0041D81F 6A48 push 00000048
:0041D821 A110D64F00 mov eax, dword ptr [004FD610]
:0041D826 50 push eax
:0041D827 6A08 push 00000008

* Reference To: kernel32.MulDiv, Ord:0000h
|
:0041D829 E86E7FFEFF Call 0040579C
:0041D82E F7D8 neg eax
:0041D830 A330934F00 mov dword ptr [004F9330], eax
:0041D835 A160C34F00 mov eax, dword ptr [004FC360]
:0041D83A 80780800 cmp byte ptr [eax+08], 00
:0041D83E 746F je 0041D8AF
:0041D840 E893FFFFFF call 0041D7D8
:0041D845 8BD8 mov ebx, eax
:0041D847 8BC3 mov eax, ebx
:0041D849 2C80 sub al, 80
:0041D84B 7406 je 0041D853
:0041D84D 2C08 sub al, 08
:0041D84F 7431 je 0041D882
:0041D851 EB5C jmp 0041D8AF

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041D84B(C)
|

* Possible StringData Ref from Code Obj ->"俵俽 俹僑僔僢僋Times New RomanU嬱3繳h撡A"
|
:0041D853 BEB4D84100 mov esi, 0041D8B4
:0041D858 BF37934F00 mov edi, 004F9337

  注意:上面用蓝色字标出的位置是查找到的地方,从这里向上看就可以找到软件设置字体大小的位置;上面用红色字标出的位置,这就是Dephi程序设置字体大小的特征,切记!!!接下来,我们在 UltraEdit32 中查找“6A48A110D64F00506A08”(注意:这里不是查找ASCII码,所以,软件中“查找ASCII”选项不必使用,否则,无法找到需要的内容。),找到后改为“6A48A110D64F00506A09”,再运行软件一看,界面菜单的字体正常了,是我们希望看到的“宋体,9号”字了,如图五所示。
           (图五)

  当我发布了该软件汉化版后,我们汉化新世纪的监督执行官 来信说,在他的系统中运行该汉化版,在“资源编辑器”选项(CTRL+R)里的各个项目查看时,都会出现乱码的现象,如图六所示,但这个问题在我的系统中没有发现,我汉化时只是觉得该处的字体很奇怪,但还看得过去,我就没有修改了,没想到竟会出现这种问题,这次又得重新返工了,真是惨呀!
 
(图六)

  按照上面讲过的查找方法:

  1、查找字体名(这里为“Courier New”,共可以找到六处,经过测试发现这六处都需要修改,才能大体上解决该选项中出现乱码的问题,这里我只以“版本”项目中的乱码问题为例,其它项目中的乱码问题的解决方法完全一样,这里不再讲述。);

  2、每找到一处修改为“System”,再运行软件看效果(这里当我改了找到的第二处后,再运行软件一看,“版本”项目中乱码问题没有了,字体也变大了,说明找对突破口了。),软件运行后没有变化就把此处改回原样,继续往下查找、修改;

  为了让大家加强记忆,我把上面这两个步骤取个名字,就叫“查找排除”法吧!

  3、把该处的字体名改为“宋体”,并记住此处的偏移地址的值(这里为b9e57H);

  4、调用点睛偏移量转换器软件,求出RVA值(这里为4BAA57H);

  5、用 W32Dasm 反编译软件,查找已知的RVA值(这里应该查找4BAA57),找对地方后在UE中修改。

  在这里很奇怪,没有找到4BAA57,哪么我就减少一个数字再查找一次看一看,这里我再查找4BAA5,共找到九处,其中有一处最为可疑,反编译代码如下所示:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BA9C7(C)
|
:004BA9ED 8B03 mov eax, dword ptr [ebx]
:004BA9EF 8B8048010000 mov eax, dword ptr [eax+00000148]

* Possible StringData Ref from Code Obj ->"宋体"
|
:004BA9F5 BA58AA4B00 mov edx, 004BAA58
:004BA9FA E8FDEAF8FF call 004494FC
:004BA9FF 8B03 mov eax, dword ptr [ebx]
:004BAA01 8B8048010000 mov eax, dword ptr [eax+00000148]
:004BAA07 B201 mov dl, 01
:004BAA09 E832EAF8FF call 00449440
:004BAA0E 8B03 mov eax, dword ptr [ebx]
:004BAA10 8B8048010000 mov eax, dword ptr [eax+00000148]
:004BAA16 BA08000080 mov edx, 80000008
:004BAA1B E870EAF8FF call 00449490
:004BAA20 8B03 mov eax, dword ptr [ebx]
:004BAA22 8B8048010000 mov eax, dword ptr [eax+00000148]
:004BAA28 8A1564AA4B00 mov dl, byte ptr [004BAA64]
:004BAA2E E889EBF8FF call 004495BC
:004BAA33 8B03 mov eax, dword ptr [ebx]
:004BAA35 8B8048010000 mov eax, dword ptr [eax+00000148]
:004BAA3B BA08000000 mov edx, 00000008
:004BAA40 E8EBEBF8FF call 00449630
:004BAA45 8B03 mov eax, dword ptr [ebx]
:004BAA47 B201 mov dl, 01
:004BAA49 E87ACEF7FF call 004378C8
:004BAA4E 5B pop ebx
:004BAA4F C3 ret

  其中,用绿色字表示的位置不就是我们刚才修改的字体名吗,真是太通俗易懂了!用蓝色字表示的位置是查找到的地方,也是压入字体名的地方;红色字表示的位置就是字体的大小,看到“00000008”这种的句样,就应该引起你的高度重视。好了,在UE中查找BA08000000E8EBEBF8FF,修改为BA09000000E8EBEBF8FF,问题已经解决一大半了!如图七所示。

  
(图七)

  从图七中可以看出,还有部分字体没有修改,继续改吧!还是以改乱码处为例好了,我继续开始讲解。老办法!在UE中查找字体名(这里为“Arial”,共可以找到三处,经过测试发现这三处都需要修改,才能完全解决“关于”项目中所有的乱码及字体大小问题。),每找到一处修改为“System”后测试(这里当我改了找到的第三处后乱码消失),求出RVA值(这里应为4BC4CFH),在 W32Dasm 中查找4BC4CF,还是没有找到,再查找4BC4C,共可以找到十三处,其中有四处最为可疑,反编译代码如下所示:

查找到的第一处:

:004BBBE3 A0C4C44B00 mov al, byte ptr [004BC4C4]
:004BBBE8 50 push eax
:004BBBE9 6800008000 push 00800000
:004BBBEE 6A08 push 00000008

* Possible StringData Ref from Code Obj ->"宋体"
|
:004BBBF0 68D0C44B00 push 004BC4D0

******************************************************************************************

查找到的第二处:

:004BBC20 A0C4C44B00 mov al, byte ptr [004BC4C4]
:004BBC25 50 push eax
:004BBC26 6880000000 push 00000080
:004BBC2B 6A08 push 00000008

* Possible StringData Ref from Code Obj ->"宋体"
|
:004BBC2D 68D0C44B00 push 004BC4D0

******************************************************************************************

查找到的第三处:

:004BBC44 A0C4C44B00 mov al, byte ptr [004BC4C4]
:004BBC49 50 push eax
:004BBC4A 6800008000 push 00800000
:004BBC4F 6A08 push 00000008

* Possible StringData Ref from Code Obj ->"宋体"
|
:004BBC51 68D0C44B00 push 004BC4D0

******************************************************************************************

查找到的第四处:

:004BC31C A0C4C44B00 mov al, byte ptr [004BC4C4]
:004BC321 50 push eax
:004BC322 6808000080 push 80000008
:004BC327 6A08 push 00000008

* Possible StringData Ref from Code Obj ->"宋体"
|
:004BC329 68D0C44B00 push 004BC4D0

  不知道大家注意到了没有,上面找到的四处地方用紫色字表示出来的位置其实就是要压入的字体名的地址,这里要压入的字体名的地址相同,说明它们都使用同一字体,唯一不同之点就是它们各自设置各自的字体大小;用蓝色字表示的位置是查找到的符合条件的地方;红色字表示的位置就是字体的大小;绿色字自然表示的就是字体名了。修改方法很简单,只要把全部找到的地方的6A08改为6A09即可。

  该软件中其它项目字体的修改方法与此大同小异,这里我就没有必要继续讲下去了。全部字体修改完成后,效果如图八所示。
  
(图八)

  关于文章中我为什么事先就知道字体名称呢?我在这里说明一下方法,只要你用可以抓取DEPHI中ASCII码的工具(例如:点睛字串替换器),把抓取出来的ASCII码进行分析,找出其中所有的字体名称(比如:MS Sans Serif、Arial、Courier New等),英文软件中最常见的字体名称就是“MS Sans Serif”,你可以先找它修改,如果没有效果,再找其它字体名称修改,只要你有耐心,一定能修改成功的!

心得总结

  其实修改DEPHI程序的字体,最简单的方法可以先反编译需要修改的软件,后这样操作:

  1、对于决大多数情况,我们可以先用 push 00000048 做为辅助判断条件来查找,如果找到,再向下看是否有“00000008”这种句样存在,如果有,你可以先把该值改大些,例如:“0000000F”,运行软件后看有问题地方的字体是否会变的非常大,如果变大,说明你改对位置了,后再在UE中来改字体名即可(可用上面提到的“查找排除”法来完成操作);如果没有,继续查找,直到找完全篇代码为止。

  2、对于比较特殊的情况,用 push 00000048 做为辅助判断条件来查找一无所获时,你就可以试着用字体名做为辅助判断条件来查找,找到字体名所在的位置后,你再向上或者向下找是否有“00000008”这种句样存在,如果有,你可以先把该值改大些,例如:“0000000F”,运行软件后看有问题地方的字体是否会变的非常大,如果变大,说明你改对位置了,后再在UE中来改字体名即可(可用上面提到的“查找排除”法来完成操作);如果没有,继续查找,直到找完全篇代码为止。

  因为,这个软件比较特殊,上面提到的这两种简单修改方法都同时存在于其中,只要一开始就认真阅读了这篇文章的朋友,一定不难看出上面总结的简单修改方法的由来。

  在写这篇文章前,伟兄还特别交待我,文章要写的尽量简单、容易理解些,不知道我是否做到了呢?总之,只要大家能从这篇文章中得到一点字体修改方面的知识,我想写这篇文章的目的就已经达到了。

  这篇文章中涉及到的所有工具和实例软件,你都可以到汉化新世纪网站上去下载。

飞鹰山庄汉化天地飞鹰 写于2001年9月3日

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): 字体 Dephi

·上一篇: VB 软件汉化实践 ·下一篇: 字体修改一例 (Advanced PDF Password Recovery Pro 1.50)

· 版权申明: 本文引自《汉化教学》,如有版权疑问请及时联系本站,以便本站处理。

· 转载申明: 本文引自《汉化教学》[ 作者: 飞鹰],如需转载请直接联系原始作者,并请注明原始出处。

相关文章                                                                                发表评论 打印此文 关闭窗口

| 设为首页 | 加入收藏 | 联系我们 | 友情链接
Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎
本站内容,除转载或版权特别申明的内容外,皆遵守 创造共用协议中文版之“署名-非商业性使用-禁止演绎 2.5 中国大陆”条款
This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 2.5 China License.
本网站内容源自汉化新世纪论坛的摘录和汉化新世纪成员的原创文章。
凡汉化新世纪论坛的文字皆默认为汉化新世纪与原作者共同拥有并授权发布。
如对本站发布文章有所异议请来信告知,我们将及时删除。
凡商业摘录本站文字请先与我们联系,本站将保留非授权商业发布的追究权利。
凡非商业摘录本站文字请明显注明出处和原作者,并不得改动,凡改动必先征求原作者同意。
苏ICP备05002283号