ASCII资源的汉化(3)
伟乾
(二)、ASCII汉化后字串变长的处理
在一般情况下,英文翻译成中文后的字节数会比原来英文的字节数少,也就不存在不够位置回写的问题,但是当英文为“yes,add,new”等等,翻译后字节变大,不够位置来回写,只能译成“是,加,新”或不翻译。
在明白的文章中讲解的字串都是RVA ASCII字串,也只有RVA ASCII字串才需要通过调整偏移代码来增加字串的长度。对于长度ASCII字串,我们只要按照有关字串的格式,取长补短,调整字串之间的位置,就可以达到增加字串长度的目的。
(一)、长度 ASCII字串:
1. 结构字串组:
我们只要保证字串间有且只能有一个00间隔,保持整个字串组的完整性。字串之间互相调整位置,达到增加字串长度的目的。
2. 阵列字串组:
由于这种字串间没有间隔符,是通过字串标示符定义字串的结束,所以我们调整字串时,需要同时修改字串标示符。
3. 独立字串:
这类字串我们一般出现在VB开发的程序,我们调整字串时,保持字串的格式,同时修改字串标示符。
(二)、RVA ASCII字串:
RVA字串分为 RVA字串组和字串组两部分,RVA字串记录了字串的相对虚拟地址(就是在内存中的地址)。我们可以通过修改RVA字串,调整字串的开始位置,取长补短,解决字串长度不足的问题。字串的相对虚拟地址可以从以下的公式得出:
字串的相对虚拟地址=字串在文件中的偏移+基偏移
基偏移=imagebase(基地址)+区段RVA-区段offset
对于大多数的使用VC或DELPHI编译的程序来说,基偏移是固定的,VC的基偏移是400000H,而DELPHI则是400C00H。不过也有例外,我们就要从文件的区段表中,查出当前字串的位置(在文件中的偏移)是处在哪个区段,然后计算出字串的基偏移。
许多工具都可以显示文件的基地址、区段、区段RVA、区段偏移、区段大小等信息,如exescope、W32dasm、Prucdump等等。
|
我们可以知道,文件有AUTO .idata DGROUP .bss .reloc .rsrs等区段,区段的开始位置是(Offset),区段的大小是(Size),区段的结束位置是(Offset+Size)。
我们首先判断字串的偏移是位于哪个区段,然后利用基偏移的公式算出基偏移的值。字串RVA=字串的偏移+基偏移,RVA字串为 4个字节,数值低位在前、高位在后,反转过来。然后查找字串的RVA值,验证是否字串的RVA,修改。
在实际操作时,我们使用 RVA转换器很容易查出字串RVA的值。
以 WinImp 1.11 中的第二个工具按钮 Open 为例,这个 Open 在可执行文件中的偏移为 49EB0h 。首先使用RVA Converter(RVA 转换器)装入文件,在Convert offset (转换偏移量)选择 File to RVA (字串偏移转换为RVA),在File(字串偏移)中输入字串的偏移量,字串的RVA值可以从RVA栏查到,同时我们还可以知道这个字串所处区段、区段的偏移、大小等信息。字串RVA值是“44B0B0”反转过来就是“B0B04400”,然后查找“B0B04400”。一般同一字串组的RVA都是在一起的,我们可以通过这来判断找到的地方是否正确。
|
在最后修改本文时,发现我们汉化人的好朋友梁利锋开发了类似的工具---偏移量转换器(posconv) 0.92 版,增加了支持十进制,做字节翻转,把结果送到剪贴版等功能,更加好用,强烈推荐!
图 24
1.C 语言字串:
我们前面介绍了这种字串以00为字串结束符,与下一字串至少有一个以上的00间隔,字串的长度与字串后面的00字串的总长度是 4的倍数。汉化时,如果字串后面有超过一个以上的00,我们只要保证字串间有一个00间隔,其它的00用来增加字节。
如果字串后面只有一个00间隔或多出的00不够增加字节用,我们就需要通过修改字串RVA来增加字串的长度。
图 7
|
如图,这里有两个字串(New , Add)汉化后长度变长。其中字串 Add后面00有5个,我们只要保证至少有一个00与后面的字串间隔。我们汉化为添加,有足够的位置。字串New后面只有一个00,不够位置写入,而后面的字串Open汉化后字串长度不变,字串后面的00有四个。我们只要把字串Open后移一位,就可以满足字串New的需要。因此我们需要修改字串Open的RVA值,把它加1。
我们使用 RVA 转换器 算出字串Open的RVA值为44B0B0,我们需要把44B0B0修改为44B0B1,由于RVA字串为 4个字节,数值低位在前、高位在后,在文件里是以B0B04400的数值存在,我们只要查考B0B04400修改为B1B04400,这个文件中查找到两处有B0B04400,我们逐个修改,然后运行程序,就知道那个是真那个是假的RVA值了。
一般我们修改字串的RVA值,字串都不会移动很远,我们往后移动字串多少字节,RVA值 就加多少;往前移动字串多少字节,RVA值 就减多少。有时候,我们会碰到这样的情况,在字串附近实在没有多余的空间增加字串的长度或者有空间但需要移动很多的字串,修改很多字串的RVA值。这个时候,我们可以在文件的其他空的位置(都是00的地方),覆盖状态下,输入字串,然后使用 RVA 转换器 根据字串当然的偏移转换算出 字串当前的RVA值,把当前的RVA值替换原来的RVA值即可。
2.Pascal语言字串,格式相对复杂些,字串后面不但有至少一个ASCII值为“00”的字串分开,而且在字串前第五、六、七,八个字串是ASCII码值为“FF”的字串,如:FF FF FF FF 02 00 00 00 C4 E3(图10)。除了跟C 语言字串那样利用多出来的00字串增加字节外,由于字串一般一个接一个聚集在一起,实际上程序只需要有一个FF来作为字符串标识,我们保留一个FF来作为下一个字串的标识符,所以实际上我们又可以增加3个字符(不过这个方法有时会导致程序出问题)。
如果还不够空间增加字节,我们就需要通过修改字串RVA来增加字串的长度,具体方法跟上面相同。不过需要注意的是,必须保持Pascal语言字串的格式,字串的前面4个字符是长度标示符,前面第五个字符是 FF(必须的),第六到八字符也是FF(有时可以不要)。具体的方法与上面相同,详细的使用可以参考明白的文章《汉化ASCII字符串的高级技巧》。
图 10
|
三、后记
至此,ASCII字串的格式、汉化的处理已经介绍完毕。与其说是写,不如说是整理。自从年初第一篇ASCII字串的汉化文章《梅花三弄》(ChinEASE)发表后,明白、梁利锋等人也发表了不少关于ASCII字串的汉化文章,使我们的汉化技术更上一层楼。拜读这些文章,加上平时积累的一些经验,一直想写一篇ASCII汉化的文章,尝试把ASCII字串归纳总结。ASCII资源的汉化的第一稿刚刚写好,就看看台湾中文化作者六手修罗的文章《调整ASCII字串的长度》。文中的ASCII字串的分类、介绍让我大开眼界,马上按照他的分类重头再写。由于水平有限,期间向多位汉化人、网友请教,指正了文中不少错误的观点。特别感谢ChinEase提供许多ASCII字串的特例,指正了许多 ASCII格式的错误之处。感谢六手修罗给三种长度ASCII字串命名,使小弟的文章有了一点专业的味道^-^。还要向梁利锋大侠说声谢谢,由于我对编程一窍不通,为了一些浅显的常识多次麻烦梁兄,还纠缠不清,让你受累了。还有......
修改第二稿时,意外地发现了一个RVA转换工具。这个工具应该99年就有了,对于ASCII的格式也早有前人总结过,更开发出工具。除了汉化界本身要团结一致,多做交流合作。更要向编程、破解的高手虚心请教,积极引进技术、工具,才能促进汉化事业的发展!
由于我接触的软件不多,可能有些 ASCII字串无法按文章的分类入座。如果你汉化时,发现新的ASCII字串格式或有一些心得。请写出来,和我们大家一起分享。
参考文章: 1.《梅花三弄》 ChinEASE
参考文章: 2.《汉化ASCII字符串的高级技巧》 明白
参考文章: 3.《基地址引深》等 梁利锋
参考文章: 4.《调整 ASCII字串的长度》/本站《调整 ASCII字串的长度》 六手修罗
----------2000.8.21--------
----------2000.8.30第三次修正 --------