相信等的那一天会到来

厚积而薄发

 

【破解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,

   SetPlayerGold等方法,通过一个个hook运行,找到了正确的方法为SetPlayerGold,使用frida实现如下:
  
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就可以随意安装使用了

posted on 2023-12-08 17:59  奔跑吧  阅读(792)  评论(0)    收藏  举报

导航