·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> 工具使用 >> 使用 Idag 修改字体全过程,兼谈 Idag 使用方法    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

使用 Idag 修改字体全过程,兼谈 Idag 使用方法

作者: rwen 来源:汉化教学 时间:2003-12-06 点击:10663

我不太懂汇编,所以可能有些说的不正确的地方,各位达人看到后千万要指正一下。
我最近正在汉化一个程序,可是汉化后界面上部分字体非常难看,因此用自动字体修改工具改了一下 CreateFontA,结果出现下面图中的情况:
下面是修改前的截图:

修改后截图

再改动 CreateFontIndirectA ,没有效果。
没有办法,只好手动修改了,通过论坛上各位达人指教(感谢雅枫及其他指教的同好),终于修改成功了。下面就介绍一下我的修改过程。
根据使用自动字体修改产生的结果可以确定软件内使用的是 CreateFontA 处理标题的。
开始反汇编把。新世纪的教学中静态修改一直推荐使用 W32Dasm,但由于行业关系,我更习惯使用 Idag,虽然 Idag 反汇编的时间要远远长于 W32Dasm,但功能也要强大得多。听我细细道来:

先用 Idag 调入文件,然后就等待吧,一直等到反汇编完成。
好的,先看一下界面:

我们主要关心的是 CreateFontA 和 CreateFontIndirectA ,所以先在右侧的" Names Window"中查找 CreateFontA(先排序会好找一些)。找到后双击 CreateFontA,左面的 IDA View-A窗口显示如下图:

按上图所示,在CreateFontA 上按右键,在右键菜单中选择第一项:Jump to Xref to operand,就会显示调用表,程序内全部直接或间接调用CreateFontA的地址都显示在调用表内,如下图:

下面就应该挨个修改察看了,那么如何快速确定呢?当然是看压入的参数了,我们现在所要查找的是纵向显示的文字,所以
压入的参数 lfEscapement肯定不等于零,应该等于多少呢?根据msdn的说明 lfEscapement中每个数值对应0.1度,我们所查找的文字是90度显示的,那么 lfEscapement的值就应该等于900,转换为16进制,就是384H。好了,双击第一项进去看看吧:

从 CreateFontA 处向上看,第一个 push 是高度,第三个是 lfEscapement,
push ecx ???,这是将ecx寄存器的数据压栈,那么ecx是多少呢?
接着向上看,在0050bdcd 处有一句
Mov ecx,384H 这是将384H送入 ecx,然后到 0050bdda 处再将这个值压栈。
看来我们的运气非常好,在第一处就找到了(实际上我由于不熟练,先找了 CreateFontIndirectA,所以花了一周的时间才找到这里)
下面看一下字体高度 lfHeight 是如何传递的吧,
从 CreateFontA 处向上看,第一个 push 就是高度,此处压入的是 eax,那么接着向上找和eax操作相关的语句
在0050BDD8 处有一句 neg eax,查了一下汇编指令,应该是把 eax/2 ,所以还要向上找。

在0050BDAC处找到了两句
.text:0050BDAC mov eax, [ebp-6Ch] ; 计算字体高度
.text:0050BDAF sub eax, [ebp-8Ch] ; 计算字体高度
这两句是根据EBP-6CH和EBP-8CH计算字体的高度,EMP-6CH和EBP-8CH中的值显然是前面计算出来的,我们就不去管它了,下面开始修改吧
根据世纪的教程,很明显如果我们想要将字体修改到正常大小,应该令 lfHeight =F4FFFFFF,也就是把0050BDDC 处的
push eax 改为 push fffffff4,但push fffffff4 的机器码为 6AF4,需要两个字节 而push eax的机器码为50,仅一个字节,该如何处理呢?
这时我们就要用到上面找到的.text:0050BDD8 neg eax 这条语句了。这条语句的长度是两个字节,只要把这个语句删掉,然后把后面的 push ecx 和 push edi向前移动两位,这样我们就有了3个字节了,多出的字节当然是用90替换了。
好了,调出 HexWork, Ctrl-G跳转到 00100bdd8,看到 HEX串为 F7D8515750,修改为51576AF490,Ok,测试一下,成功了。

看一下效果:

这个程序中纵向标题栏所使用的字体是 Arial Arrow,不能修改,否则会造成上面的 x和 三角符号显示错误,所以就这样了。
至于横向显示的字体,处理方式同上,世纪的教学中有详细地说明,我就不班门弄斧了。

在这里向大家隆重推荐专业的反汇编软件IDAG,功能实在是太强大了,上面用到的调用表就是一个非常方便的工具,可以帮助大家迅速到达各个调用处进行察看。大家再看下面的图,这是一个程序内动态生成的logFont,大家可以看到 IDAG 已经将 logFontd 各个参数的含义都标注了出来,这样使用起来真的是简单了很多。



汉化新世纪 责任编辑: 莫名 .:|:. 标签(Tag): Idag 字体

·上一篇: 非连续日文字符串汉化经验 ·下一篇: pediy之画猫篇

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

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

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

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