杉宫竹苑工作室

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

汉化ASCII字符串的高级技巧---C语言字符串(1)

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

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

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

x
作者:梁瑞本
源地址:http://teach.hanzify.org/article/4-1060012800.html

一、前言

??在一般情况下,英文翻译成中文后的字节数会比原来英文的字节数少,也就没有不够位置(注:这里指的位置是指在程序可以正常运行下,可以修改的字节数,以下同!)来回写的问题,但是当英文为“YES”而需要译成“确定”时,“NO”译成“取消”时,那么就会因“确定”比“YES”多一个字节、“取消”比“NO”多两个字节而不够位置来回写,只能译成“是”或译成“算”(意思是“算了”也就是取消的意思 ^_^),这样看起来总让人别扭,那么有没有方法来增加位置,以下就是对C语言字符进行增加字符串长度的详述,C语言字符串的特点是一般可以增加10个字节以上,只要位置足够,就可以任意增加字符串长度,而操作难度不会增加。但是当没有位置时,虽然现在有相应的解决方法,但是操作难度就大大增加了,这将在下一篇里介绍。

二、增加字符串的例子

??让我们用Uedit32打开一个用VC来编写的程序Recover 4 all(图1),
new_pa21.gif
我们可以看到在该程序中已有一个ASCII字符串翻译了,在翻译后由于译文比原英文的字节少,把多出来的字节用00来填空(指ASCII值为00),大家如果看了上一章就会明白,这是一个C语言字符串(目前只分为C语言符串和Pascal语言字符串两种,所以不是Pascal语言字符串就可以断定为C语言字符串),让我们来试一下增加字符串的长度,在“File(s) were recovered to:”前加上“这个是证明了可以增加字符”共24个字节(图2),

new_pa22.gif

保存文件后让我们试运行这个程序,当在程序中保存文件时就会调用一个对话框来显示这个字符串(图3),

new_pa23.gif

虽然程序并没有出错,但并不如想像中显示出我们所增加的字符串。我们现在知道了直接增加长度是不行的,那么是什么原因不能显示增加的字符串呢?在上一章中,我们讲述了在程序调用一个提示信息时就会先把字符串的偏移地址移到寄存器中,再调用显示函数,刚才由于增加了字符串,所以要显示的字符串的首字偏移改变了,而在程序中的相对应调用字符串的偏移地址还没有改变,所以调用显示函数时还是原来的的偏移代码,显示的还是原来的字符串,那么是否修改字符串的偏移代码为增加后的偏移代码就可以显示增加的字符串了呢?那么我们试试修改字符串的偏移代码,看一看是否可行!
??这次需要用我编写的一个代码转换器(图4),

new_pa24a.gif

是用来在十进制、十六进制以及调用偏移代码(调用字符串的偏移地址代码,下同)之转换之用。在十进制输入框中输入的是ASCII字符串首字符在文件中的十进制偏移地址,十六进制输入框是则是输入对应的十六进制的偏移地址。当你输入后,在调用代码框就会计算出要查找的调用代码(具体的使用在增补篇中详细讲述)。好了,现在我们试用一下,把在Uedit32中,把光标移到首字符处(图5),

new_pa25.gif

那么在UEDIT32下面的状态栏中就会显示出这个字符在文件中的十六进制和十进制偏移地址。(图6)

new_pa26.gif

在代码转换器中的十进制输入框中输入该字符串首字符在文件中的十进偏移“323592”(图4)或者在十六进制输入框中输入十六进制偏移“4F008”,在调用偏移代码输入框就会有计算出来的调用偏移代码“08F04400”(图4)。在UEDIT32中按下CTRL+F键调出查找对话框(图7),

new_pa27.gif

在“查找什么”输入框中输入在代码转换器的调用偏移代码输入框中所显示的调用偏移代码“08F04400”,以十六进制方式查找(就是不要选取“查找ASCII字符”检查框),查找方向设置为“向上”,按“下一个”开始查找。在离文件头“74309”处找到这个字符串(图8),

new_pa28.gif

记下这个偏移,回到刚才的字符串中,记下增加后字符后的实际偏移“323568”(十进制值)(图9),

new_pa29.gif

用代码转换器求出调用代码为“F0EF4400”(图10),

new_pa210.gif

把这个代码替换原来的调用偏移代码(图11),

new_pa211.gif

保存文件,试运行软件,但是只是和刚才一样(图3),

还是没有显示出增加的字符。也就是说刚才修改的不是这个对话框的调用偏移代码,那么再次打开文件(不用恢复备份文件,因为这个字符串偏移代码可能是另一个对话框使用的),重新向上继续查找,在偏移68898又找到这个字符串了(图12),

new_pa212.gif

像刚才那样修改调用偏移代码(图13)。

new_pa213.gif

重新运行程序,在保存文件时终于出现了新增的字符串(图14),比较一下未增加字符前的(图3)。

new_pa214.gif


三、可以增加字符长度的前提??

??由刚才的例子可以看出,只要可以把调用字符串的偏移代码修改为增加字符后正确调用代码就可以了,但是前提是有足够的ASCII码值为00的字符用来替换,由于VC程序把字符串集中放到代码段中,所以可以使用在翻译其它字符串时留下的00位置来增加字节。当完全没有多余的位置时,那么就需要更高级的修改方法来增加字符串长度,这将在下一篇里专门写这一高级修改方法操作。

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 09:28 , Processed in 0.120117 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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