【破解Unity单机无壳游戏金币 -- 记录第一次逆向实战成功案例】
破解对象:https://play.google.com/store/apps/details?id=puzzle.game.find.differences
破解工具:frida frida-il2cpp-bridge Il2CppDumper
破解功能:金币随便使用,二次打包
- 解压apk包
解压apk包的工具很多:
1、直接改后缀为zip,解压即可,不过这种方式AndroidManifest.xml是无法解析的;
2、使用命令行解压,apktool d your*.apk; (推荐)
3、使用自定义工具,笔者使用的apk_pack_script,可以解包,还可以修改后重新打包;
- Dump出C#代码定义
通过解压apk包后,找到lib目录下的,cpu架构根据自己的手机选,il2cpp.so,global-metadata文件,使用Il2CppDumper生成dump.cs文件,命令
Il2CppDumper.exe il2cpp.so路径 global-metadata.dat文件路径 <output-directory>
- hook点寻找
上一步生成的dump.cs包括了类的定义 方法和字段,但内容较多,需要根据经验搜索关键字,本次破解的目录是金币无限使用,所以使用coin, gold等关键字搜索,发现有set_gold, get_gold,
function hook_set_gold() {
if(hooked == true)
return
var il2cppso = Process.findModuleByName("libil2cpp.so");
if(il2cppso == null) {
console.log("libil2cpp.so未找到")
return
}
if(il2cppso) {
console.info("hook set gold");
var set_gold_fnPtr =il2cppso.base.add("0x1204530");
Interceptor.attach(set_gold_fnPtr, {
onEnter:function(args) {
console.warn("enter set gold:", args[0].toInt32(), args[1].toInt32())
args[1] = ptr(199)
},
onLeave:function(){
}
})
}
}
可以发现修改金币是成功的,找到了正确的函数地址,就可以修改so文件了
- 修改so文件二次打包,让破解功能永久生效
用IDA打开il2cpp.so文件,跳转到上面的地址,定位到目标函数汇编代码,这时需要识别如何修改汇编才能实现目的,笔者是根据函数的第二个函数为金币数值,找到对应的赋值语句(mov)语句,替换为一个常量,这样金币消耗以后,将永远为此常量不变. 使用https://armconverter.com/,将修改的汇编语句转成二进制,再用010Editor打开so文件,找到对应的地方,修改保存,再用apk_pack_script实现打包签名,生成的apk就可以随意安装使用了
浙公网安备 33010602011771号