·汉化新世纪 ·汉化新世纪论坛 ·百家争鸣 ·论坛集萃 ·汉化问答 ·软件介绍
文章首页 >> 汉化教学 >> 非标汉化 >> 汉化ASCII字符串的高级技巧II    Creative Commons License,创作共用协议(中文版)  署名 非商业性使用 禁止演绎

汉化ASCII字符串的高级技巧II

作者: 梁瑞本 来源:汉化教学 时间:2003-08-02 点击:12904

汉化ASCII字符串的高级技巧

---C语言字符串(2)

作者:梁瑞本   

一、前言

??当一个需要翻译的C语言字符串前后都没有足够的ASCII值为00的字符用来作为增加字符的位置,那么是否就意味着不能增加该字符串的长度呢?当然不会了,不管在VC或者Delphi程序里,都是会有方法来增加字符串长度,在C语言字符串中,使用重组数据段

二、使用前提

??这个方法在一般情况下都是可以使用的,因为大多数C语言字符串在数据段里是集中在一处的,而英文翻译成中文后,总会有一部分字符串翻译后字节数会比原来英文字节数少。但是由于此方法要修改的地方太多,因此比起上一章来说,会让人觉得较难。所以建议你在没有必要的时候不要用这个方法。原因嘛,何必自找麻烦!

三、操作方法

1、让我们看一个简单的重组数据段示例
??让我们用UEDIT32打开一个用VC编写的程序(在这里仍以Recover 4 all为例),修改任意一个字符串为大家示范一下操作过程。我们看到,在数据段里有一个C语言字符串为“File(s) of the same name already esist in”(图1),

现在我们要在这个字符串中增加“这是一个重组数据段的例子”共24个字符(每个中文算两个字符),在这里,字符串前后都没有多余的00用来作为增加字符的空间,那么应如何做呢?让我们先记下这个要修改的字符串首字符在文件中的偏移值(最后把可能修改的字符串的首字偏移都记下来),这可以把光标移到首字符上,然后在UEDI32的任务栏就可以看到。该值为“323468”,现在我们浏览一下字符串的前后,看一下离这个字符串最近的多余00在那里(注:只限于数据段)。我们可以看到向下方向的第一个字符串,由于汉化后,在字符串后面留下很多空余的00(共有44字00),足够我们增加24个字符了,那我们试试利用这些多余的00来增加字符。我们记下字符串“不能恢复目录,请选择目录里面的文件。”的首字符偏移“323512”(因为我们需要修改这个字符串的位置),然后使用移动字符串的方法来把“不能恢复目录,请选择目录里面的文件”移到第二个字符串最近的地方(字符串与字符串之间至少要有两个值为00的字符隔开)(图2)。

现在看一下,是不是在需要增加字符的字符串后面有了足够的00来增加字符了呢?不过这样直接修改存盘是不行的,因为我们已经改变了字符串“不能恢复目录,请选择目录里面的文件。”的首字符偏移了,这个字符串移动前的首字偏移为“323512”,而移动后的首字符偏移变成了“323554”了。所以还需要改正这个字符串的调用偏移代码,以使其能调用正确的字符串(在每移动一个字符串就改正该字符串的调用偏移代码,并存盘运行测试一次,以保正当前的修改是正确的,不然的话就恢复备份文件,重新修改),我们首先要改正调用“不能恢复目录,请选择目录里面的文件”这个字符串的调用偏移代码。运行代码转换器,用它来计算调用偏移代码。首先在十进制输入框中输入这个字符串移动前的首字符偏移“323512”,在调用代码框就会计算出调用偏移代码为“B8EF4400”,再在十进制输入框中输入这个字符串移动后的首字符偏移“323554”,代码转换器计算出的调用偏移代码为“E2EF4400”。知道了调用偏移代码,按下CTRL+F调用UEDIT32的查找对话框,以十六进制方法查找字符串移动前的调用偏移代码“B8EF4400”,查找方向设为“向上”。在这个程序中一共会找到两处(一般程序只找到一处),我们把这两处的调用偏移代码“B8EF4400”均修改为字符串移动字符串后的调用偏移代码“E2EF4400”(图3、图4)。

     

            

保存后运行程序,测试一下是否运行正确(要显示出该提示框,没有提示地址出错才算正确),没有问题了,那么我们就可以增加“这是一个重组数据段的例子”共24个字符(图5),

修改完后保存文件,运行程序,在保存文件时,目标目录里有同名文件时就会出现对话框,可以看到,在对话框中出现了增加的字符“这是一个重组数据段的例子”(图6)

四、问题综述

??上面是一个典型的数据段重组的例子,它是通过挪移字符串取得足够的位置来增加字符,这在一个字符串周围都没有00,而下面或上面的字符串有汉化时空余出来的00的时候是非实有用的,我们也可举一反三,通过挪移更多的字符串来取得更多的位置,增加更多的字符。例如挪移两个,挪移三个....更多,重点是能够正确修改调用挪移过的字符串的调用偏移代码以及是在数据段内挪移。如果能正确修改,你甚至可以把正个数据段重组。
??不过有时候会有特殊的情况出现,比如有的程序的基地址不是400000H,这样用代码转换器就不能正确计算出调用偏移代码了,不过由于实际上需要增加字符的字符串不多,基地址特殊的程序很少,所以这种情况是很少出现的。当你用代码转换器计算出来的调用偏移代码没有找到,那么你就要考虑一下这软件的基地址是不是特殊的,如果你不能解决的话,可以联系<汉化新世纪>来帮你试一试,或者不增加字符。
??至于如何知道数据段的大小和位置,一般情况下,你只需在字符串集中的地方用挪移就没有此问题了,当你确实需要知道的时候,也可以用Exescop来取得程序的数据段地址。具体的使用请看说明书或以后我写一篇专门介绍一下。

下一章:汉化ASCII字符串的高级技巧---Pascal语言字符串(1)

 

汉化新世纪 责任编辑: 乾 .:|:. 标签(Tag): ASCII 非标

·上一篇: 汉化ASCII字符串的高级技巧I ·下一篇: 汉化ASCII字符串的高级技巧

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

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

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

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