杉宫竹苑工作室

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

汉化ASCII字符串的高级技巧---Pascal语言字符串

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

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

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

x

作者:梁瑞本

源地址:http://teach.hanzify.org/article/62-1060099200.html


一、与C语言字符串相比较
??与C语言字符串相比较,在Pascal语言字符串中每个字符串都可以至少增加3个字符(3个字母),这对于汉化而言已经足够了。很少情况下Pascal语言字符串能够增加更多的字符(参见《梅花三弄》)。Delphi所用的是Object Pascal语言,所以提示信息为Pascal语言字符串,格式在第一章也说,这里就不重复了。
二、增加字符串长度
??以下以一个书签工具AcqURL(V3.4英文版)主执行文件AcqURL.exe为例,这个程序是使用DELPHI来编写的,我在这里只举出如何修改程序中的一个对话框提示作例子。这个提示是在执行菜单中文件-拷贝程序-拷贝到A盘,而当A盘没有放入软盘时出现(图1),
new_pa31.gif
现在让我们在提示前加上三个字符“YES”,目的是通过增加三个字节来说一下在DELPHI程序中增加字符的操作。让我们现在用Uedit32(任何一种十六进制编辑器都可以)打开这个程序来编辑,用查找字符串“Drive not responding!"来跳到我们要修改的提示信息的位置(图2),
new_pa32.gif
在这里可以看到,在字符串的前三个字节的ASCII值为00,前第四个字节是表示该提示信息的实际长度的长度标识符,前第五至第八个共四个字符的ASCII值为FF,从这里我们可以知道这是一个Pascal语言字符串,由于我们这里并没有多余的位置,所以要通过利用其它字符串翻译时多余出来的位置是不可能的(:Pascal语言字符串大多数是在代码段中,这在调试Delphi程序时可以看到,提示信息并不是集中一起放到代码段里的,而是跟在需要显示它的函数或功能返回代码后面,如果一个函数或功能里有两个或两个以上的提示信息时,才会有连续的Pascal语言字符串出现)。所以只能在自身的代码入手,在调试程序中发现,Pascal语言字符串前第四至第八个ASCII值为FF的字节在程序中并不是执行代码,本来可以用这四个FF字符来增加四个字符的,由于实际上程序需要有一个FF来作为字符串标识,需要保留一个FF来作为标识符,所以实际只能增加3个字符。
??首先把光标移到字符串的首字符上(图3),
new_pa33.gif
那么在UEDIT32的状态栏上就会显示出这个字符在这个文件中的偏移。记下这个字符串的首字符在文件中的十进制偏移“755980”(图4),
new_pa34.gif
然后修改(技巧:请参看附1)提示信息为“YESDrive not responding!”(注:在这里只是作为例子说说增加字符串的技巧,增加的字符是随意的)(图5),
new_pa35.gif
你可以比较一下修改前的图片,这实际上是把前面的三个“FF” 替换掉了,而把字符串向前移动了三个字符。在增加了“YES”后,整个字符串的实际长度就改变了(原本为15个字符)(注意:文件长度并没有改变),增加了三个字符后,字符串的实际长度是18个字符,所以要字符串长度标识符改为正确的“12”(字符串长度标识符是字符串实际长度的十六进制数)。还有的就是这个字符串的首字符在文件中偏移改变了,那么我们需人修改主调用偏移代码,以使其正确调用字符串。我们把光标移动到修改后的首字符上(图6),
new_pa36.gif
把在UEDIT32的状态栏出现的修改后的首字符偏移值“755977”记下来。
??这需要使用代码转换器了,运行代码转换器,因为acqRUl是使用Delphi来编写的程序,所以在代码转换器中要选取“DELPHI程序”检查框(图7)。
new_pa37.gif
在十进制输入框中输入刚才记下的未修改前的首字符偏移值“755980”,那么在代码输入框中就会出现计算出来的调用偏移代码“0C954B00”。在UEDIT2中按下CTRL+F键调出查找对话框,以十六进制字符方式查找,在“查找什么” 中输入用代码转换器计算出的的调用偏移代码“0C954B00”,设置方向为“向上”(图8),
new_pa38.gif
按下“下一个”,在文件中找这个十六进制代码(技巧:请参看附2),在离文件头偏移“754966”处找到了这个代码(图9),
new_pa39.gif
我们需要把它修改为修改后字符串的偏移代码。在代码转换器的十进制输入框中输入修改后的首字符偏移值“755979”,这样在代码转换器中就计算出了新的调用偏移代码“09954B00” 。把这个新调用偏移代码替换原来的调用偏移代码(图10),
new_pa310.gif
修改好后存盘退出,执行程序AcpURL,在执行拷贝程序到A盘时,出现提示框,看到增加的字符“YES”了吗?!^_^(图11)
new_pa311.gif

三、总结
??增加PascalL语言字符串的操作与VC差不多,重要的是把修改前字符串的调用偏移代码改为修改后字符串的调用偏移代码,这是整个操作的关键,并且可以用这个方法引申出更多汉化ASCII的技巧,如ASCII字符串提取器就可以利用调用偏移代码来取得ASCII字符串的位置,从而可以准确的提取出需要汉化的提示信息。能够利用修改或查找调用偏移代码,完美汉化不再是问题了,
附1
??在Delphi中增加ASCII字符串长度时,可以先计算出需要增加多少个字节,然后选取包括字符串长度标识符在内的提示信息部分(图12),
new_pa212a.gif
向上移动多少个字节,这样就可以修改移到提示信息后面的FF了(图13)。
new_pa213a.gif

附2
??一般DELPHI程序的调用代码会在提示信息的前数十个或数百个字节的范围内,所以一般第一次找到的都会是正确的调用代码。如果有找到两个以上的话,只好自已测试那个正确了。

高级技巧

一、使用前提

??当汉化一个Pascal语言字符串时,当需要增加的字符超过三个的话,那么前面的方法就不能用了,因为前面的方法只能增加三个字符。以下的方法请你只有在必要的时候(需要增加四个或以上的字符)使用,因为修改后对软件是否会有影响我还不得而知,不过我测试了几个程序,证明是可行的。
二、操作过程
??和以上几个方法一样,让我们用UEDIT32打开一个含有Pascal语言字符串的文件,在这里依然使用AcqRUL为例。使用的的字符串还是“Drive not responding!”(图1)
new_pa51.gif




这回与上次不同,不是修改或替换FF来增加字符,而是通过更改字符串的位置来创建一个新的字符串,这次我们更改字符串为“这是调虎离山的例子,很成功!”,共有28个字符。增加7个字符这么多,采用上次的方法根本行不通,现在让我们转到字符串的位置(方法同Pascal语言字符串(1)),把光标移到字符串的首字符上,记下在UEDIT32状态栏出现的该字符在文件中的偏移地址“755980”。现在,让我们往下寻找一个有很多ASCII值为“00”的字符的地方。终于在偏移文件头“804256”处发现了很多的00(指ASCII值为“00”的字符,以下同)。现在,让我们把提示信息放到这里吧,首先选择适当的地方,具体为与“00”开始和结束之间要保持至少相距5个“00”以上(为了保险),这是修改后的图片(图2)
new_pa52.gif
我是在“00”中间进行修改的。我们的目的是创建一个新的Pascal语言字符串,用来替换那个旧的字符串,所以这个字符串与其它的Pascal语言字符串一样,有字符串标识符FF,有字符串长度标识符,然后由三个00隔开字符串。我们现在已经完成创建新的字符串的工作了,那么我们要把新的字符串关联到程序中去,让程序显示的是新的字符串,而不是以前的那个。
??运行代码转换器,在十进制输入框中输入旧的字符串首字符偏移“755980”,取得原调用偏移代码为“0C954B00”,把光标移到新建的字符串的首字符,在UEDIT32任务栏中得到新的首字符的偏移为“804278”,再用代码转换器求得新的调用偏移代码为“B6514C00”,按CTRL+F调用UEDIT32的查找对话框,以十六进制方式查找“0C954B00”,方向设置为“向上”,按下“下一个”在文件中查找。这个代码在离文件头偏移“753968”处找到,把它替换成“B6514C00”即可。修改完成后保存文件,就可以运行程序来测试一个是否增加成功。这是修改后的提示框(图3)
new_pa53.gif
四、常见问题
??这种方法常见的问题是,创建新的字符串时不小心增加了文件的长度(我就试过好几回),造成程序不能运行。二是用来创建的地方不是程序空余的地方,而是含有代码或数据,这样会造成不可预知的错误,所以当你修改程序后不能正常运行,而你又确定没有增加文件长度,并且字符串的调用偏移代码修改正确,那么你可以试试换一个地方来创建字符串。一般向下寻找“00”来创建的成功率比较高。由于文中的一些常用操作在前两篇已详细介绍了,所以在这里没有给出图片,所以有什么不明白的话,可以参考一下前几章的操作。

五、最后的话

??至此,我们介绍了如何增加C、Pascal语言字符串的长度,已经可以应付目前大多数的WIN32程序了,当然,新的方法和新的工具不断出现,以后可能会有更好的工具来代替手动操作,那时我们汉化ASCII字符串就更容易了。


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 05:22 , Processed in 0.122531 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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