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

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

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

再谈一谈软件汉化后字体的修改(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