首先声明的是,我只是结合一个极简单的例子来浅浅的说说,希望对你的汉化有所帮助。还需要强调的一点是很多 ASCII 字串并不是 RVA字串,只有 RVA 字串才能使用这种方法。如果你对 RVA 字串的定义和分类还比较模糊,请先关闭此文档,先去看看伟乾写的 ASCII 资源的汉化文章,这是基础。不然你可能说,我按照你的方法,算出 RVA 偏移量,但是在文件中找不到(或改了无效),都是因为不是这种 RVA 字串的缘故。
例子程序是 B-jigsaw 4.1,一个拼图游戏,5.0 已经出来了,不过 5.0 中没有我们可利用的 RVA 字串加以代换,所以还是拿老版本说说,界面如下图所示,这是一个经过初期汉化后的软件开始界面。
大家可以看到,那个“OK”暂时没有汉化,当然你也可以译为“好”或“是”,不过今天我们要把它译为“确定”,再来看看这个 OK 在UE 中的样子吧。如图2
注意到,字符不足以让我们把“OK”汉化为“确定”,所以我们采用RVA字串的替换来实现它的汉化。再往后看,使用乾坤挪移,在这个具体的例子中,后面有个“Invalid registration code!”的 ASCII 字串,把它译为“无效注册码!”后,多出的字符位置修改为“确定”绰绰有余。(当然如果你在前期已经汉化了此字串,后面如果有足够的 00 就可加以利用),就从这里入手。将光标定位在“OK”处的首字符处,在UE的状态栏就会显示当前的实偏移量,一个是十六进制的,一个是十进制的。如图 3,639f2h 是十六进制,408050 为十进制。
打开 PosConv (偏移量转换器),图标是一个笑脸哎,软件秉承了点晴系列软件的一贯风格,简捷明快,小巧实用,主界面如下,如图4。PosConv ,支持 PE 格式的文件,(32 位 Windows 程序的格式),不支持 NE 格式的文件。( NE 是 16 位 Windows 程序的格式), 当然,也不支持 Dos 程序。:)
目前的最新版本是 0.94 版,相比较以前的版本,新版本提供热键(F12)呼出支持,这下使用就更方便啦!
|
|
图4 |
图5 |
偏移量转换器支持鼠标拖曳,找到需汉化的程序文件“bjigsaw.exe”直接拖到程序选择窗口就行了,见图5。当然你也可以通过点击“...”浏览选定需汉化的程序文件。选定文件后,我们可以点击“顶端”按钮,这样偏移量转换器就永远停留在最顶端,对于我们下面的查找替换工作来说非常方便;当然如果你不想让她停留在最顶端,再次点击“顶端”按钮取消该功能即可。
图 6 ,直接在实偏移栏中输入 OK 的十六进制实偏移值,即 639f2,代码栏则显示计算出来的代码RVA值,本例中为 F2454600。你可以看到程序已经自动根据你输入的实偏移显示了区段名,本例中为.data 区段。如图 8。点击“至剪贴板”即可将代码值复制到剪贴板内,方便以后的操作。
|
|
图6 |
图7 |
对于绝大多数软件来说,一般不需要你来选择区段,如本例,程序可智能根据实偏移值来判断并自动选择区段。只有某些很少见的软件出现区段重叠时才需要用户进行区段选择。那位朋友可能要问了,如果我“不幸”碰到一个这样的情况,该如何处理呢?问得好,其实不用麻烦你,偏移量转换器觉察到有区段重叠时,会自动跳出对话框来提示你,还是看看图吧,唉,这样的例子还真不好找,嗯,找到了,大家看看。
|
图8 |
程序提醒我们有区段重叠,并且给出了重叠的区段名称,即“BSS”和“.tls”。点击“选择”按钮,进入区段选择界面,如图 9。我们只需把重叠的区段前的复选框的“√”清除即可。如图10。点击确定继续进行,够智能吧?顺便再多说两句,进行区段选择时,当你点击任一.text、.data等区段,(装入程序不同,区段名也会有所不同),filemin,filemax,将显示该区段中实偏移量的最大值与最小值,你也可以根据实偏移量的范围来判断具体处于那个区段,不过,我很懒,所以都交给偏移量转换器代劳了。
|
|
图9 |
图10 |
好了,还是回到例子中来吧,在 UE 中打开查找功能,将剪贴板内保存的代码值粘贴至查找窗口后,如图9设置。向上搜索此代码,并记下位置。(这个向上搜索不一定,大多数情况下是在字串的前面不远的地方,不过也有在后面的例子)。
|
图11 |
在这个程序中只找到了一处,位于0x2364处。如下图所示。对于其它软件,有时我们找到的不止一处,那么倒底是那个代码需要修改呢?这就需要我们进行修改测试啦,虽然大多情况下我们找到的并不会很多,如果逐个修改测试还是比较麻烦,汉化新世纪的伟@伟乾介绍了一个比较简单的方法,+1,如 F2454600 改为 F3454600 ,存盘看看运行的界面原来显示 OK 是否变成了 K ,如果是说明我们找到了,如果不是,说明这个不是,查找下一个。如果还是没有找到,只能说明你老兄粗心,计算步骤有错,再试试。“什么什么,已经检查好几遍了,还是找不到RVA偏移量”,这个不是RVA字串,请认真看看有关文章。
现在可以回去修改程序了,例子程序中我在“无效注册码!”的后面隔两个00的位置上添加“确定”字符,即“C8B7B6A8”,如图所示。当然你也可以在其它位置修改,但要注意必须和上一字串至少要有一个00相隔。
接着,我们把光标定位在“确定”的首字符处,读出它的实偏移量,如图12所示。十六进制为63a5cH。再次启用偏移量转换器,此偏移量仍位于data区段,如图13,输入63a5c,计算出其代码偏移量为5C464600。(这里又有一个技巧了。我们用鼠标选择,从“OK”开始,一直选择到“确定”前面,看看我们选择的代码的长度,然后RVA代码减去或加上这个长度,就是我们需要修改后的RVA代码。注意,这里的RVA代码是低位在前,高位在后显示的。在本例中,距离是比较短的,所以这个技巧就很方便了。如果你乾坤挪移功力太高,距离太远了,我们可以将光标定位在两个字串的首字符处,将实偏移相减就是距离了。不过在远距离操作中,若超出了区段,这个技巧就无法适用了。)
|
|
图12 |
图13 |
在 UE 中,跳转到0x2364处,将“F2454600”修改为“5C464600”。如图14所示。
存盘,试运行一下,下图就是结果图,我们的目的实现了。原来的“OK”我们并没有动它,这就是乾坤大挪移!
文章到这里就结束了,这里主要是结合一个 RVA 字串的汉化讲了一下偏移量转换器的使用方法,希望对你有所帮助。