好友
阅读权限30
听众
最后登录1970-1-1
|
OPkyd
发表于 2013-11-27 07:18
本帖最后由 OPkyd 于 2013-11-27 11:28 编辑
本教程转自夏达@安智,教程内容可能有些难懂,需要具备一定的汇编和IDA使用知识。如果哪里写错了,烦请各位高手轻虐。
本次作为示例的游戏是Vritra 1.02版,教程主要讲述绕过Resource.car校验的思路和过程,至于十六进制汉化,以后有空再讲(难度不大)。
用APKTOOL解开游戏Vritra,在Assets目录下会看到一个文件:resource.car。游戏中的部分文字在此处,用十六进制编辑器打开此文件,搜索我们最容易测试到的文字,比如“Quit App”:
将其修改为任意字符,保存。然后用APKTOOL打包签名并安装,再打开游戏,游戏会出现如下报错:
很明显,游戏对这个car文件进行了校验,但是校验的机制不明,如果时间足够长的话,可以找出它的校验机制,但是本例用的是绕过验证的方法。
通常碰到这样的报错信息,第一反应就是先搜索报错的字符串。于是搜索整个文件夹,找到\lib\armeabi-v7a\libcorona.so偏移量为0x0014A860处有此字符串:
看到so文件,我们的神器IDA就必须出场了。用IDA打开libcorona.so,然后搜索报错的字符串,定位到此处:
下面解释一下这部分ARM汇编代码的意思(只学过80x86的汇编,ARM是刚刚恶补的:
[AppleScript] 纯文本查看 复制代码 BL _ZN18NativeToJavaBridge11GetInstanceEv ; NativeToJavaBridge::GetInstance(void)[/size]
[size=14px]LDR R1, =(aError - 0x60590)[/size]
[size=14px]LDR R2, =(aThisApplicatio - 0x60598)[/size]
[size=14px]MOV R3, R7[/size]
[size=14px]ADD R1, PC, R1 ; "Error"[/size]
[size=14px]STR R7, [SP,#0x2C8+var_2C8][/size]
[size=14px]ADD R2, PC, R2 ; "This application encountered a Lua erro"...[/size]
[size=14px]STR R7, [SP,#0x2C8+var_2C4][/size]
[size=14px]BL _ZN18NativeToJavaBridge15ShowNativeAlertEPKcS1_PS1_iPN3Rtt11LuaResourceE ;
第一个指令BL,意思是带链接的跳转,本例意思是执行后面那个函数;
第二个LDR是装载和存储单一字节或字的数据从/到内存,本例的意思是将后面地址的数据载入到R1寄存器上;
第三个类似第二个;
第四个MOV在8086中很常见,本例的意思如果不求甚解的话可以理解为R3=R7;
第五个ADD意思是将把两个操作数加起来,把结果放置到目的寄存器中;
第六个STR在本例的意思是将R7的内容存储到“#0x2C8+var_2C4”合成的地址,其中var_2C4在程序起始处有定义;
剩下几个参照前面所述。
知道了这些就很好改这部分,我们的目的是将错误对话框去掉,所以只需要把BL跳转语句修改为NOP。在ARM中NOP可以使用如下语句实现:
[AppleScript] 纯文本查看 复制代码 MOV R0,R0
这个语句相当于做一次无用功,也就相当于实现了NOP。
接下去就是怎么修改机器码的部分。先查询手册,查到MOV的机器码是0xE1A0(此处可能不同,主要看自己IDA反汇编出来的机器码是多少),然后用十六进制编辑器定位到最后一个BL的机器码,可直接用IDA查看HEX VIEW-A。偏移位为:0x00060598,然后再用十六进制编辑器跳到该位置,将其十六进制改为00 00 A0 E1。(有人可能会问,为什么机器码明明是0xE1A0,改的时候却要变成0xA0E1,原因在于高八位和低八位在文件中是倒置的)。
保存,然后重新打包签名并安装。
很遗憾,报错的对话框没有了,但是游戏停在启动画面,然后自动退出。
看来单纯的除去对话框在本例中无法解决问题,于是夏达在和朋友们开了几个小时CS大战后(我的水平超级菜,十发子弹,五发打队友,四发打天上,还有一发射墙上~),又重新打开IDA,一个函数一个函数的看(泪奔啊~)。
终于,在IDA分析出来的函数列表中发现了这样的函数块:
虽然我的英语不是很好,但是还是模模糊糊隐隐约约的看得懂Verify这个单词的意思,速度点击进入此函数块。
解释一下红线绿线的意思,红线是no,绿线是yes。
代码就不再分析了,和上面说的类似,思路也一样,我们要做的就是将两个BEQ跳转直接置为NOP。方法和上面一样。(我好累,就不一一截图了)。
考虑到还是有部分朋友不会做十六进制汉化,在本例一并说了吧。
首先选择一款你喜欢和上手的十六进制编辑器,夏达最喜欢用的是HEX WORKSHOP。打开Resource.car,找到要汉化的字符串,比如问题描述里说的“Quit App”,然后找一个工具算出“退出”二字的UTF-8码是0xE98080 0xE587BA,替换掉原来的字符串(大小要相等,少的用空格补)
测试汉化成功:
ARM指令查询手册:
百度盘:http://pan.baidu.com/s/148VA6
修改后的so文件:
百度盘:http://pan.baidu.com/s/16AK2z
教程到此完成,若有不足日后再完善,欢迎提出意见。
~相信自己,汉化简单致死!~
传送门:
第一课: http://www.52pojie.cn/thread-225285-1-1.html
第二课:http://www.52pojie.cn/thread-225295-1-1.html
第三课:http://www.52pojie.cn/thread-225298-1-1.html
第四课:http://www.52pojie.cn/thread-225309-1-1.html
第五课:http://www.52pojie.cn/thread-225314-1-1.html
第六课:http://www.52pojie.cn/thread-225319-1-1.html
第七课:http://www.52pojie.cn/thread-225323-1-1.html
第八课:http://www.52pojie.cn/thread-225327-1-1.html
第九课:http://www.52pojie.cn/thread-225364-1-1.html
第十课:http://www.52pojie.cn/thread-225368-1-1.html
|
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|