wp参考链接如下:
- Question1:尝试使用
Zygisk-il2cppdumper
dump,但是程序会卡死,dump不出文件- Question2:用
elf-dump-fix
dump下来的il2cpp.so缺少符号,未知原因,但是可以搜字符串global-metadata.dat
定位到加载函数- Question3:追踪加载
global-metadata.dat
函数的调用链,发现被hook到sec2021的函数中了,追踪到最后发现是个看不懂的地方(?)- Question4:实现无敌之后未成功绕过app的crc校验,导致重打包的apk无法运行
问题解决情况
- Question1
- Question2
- Question3
- Question4
待办事项
- 分析libsec2021.so的解密函数
- 分析il2cpp.so的代码段校验并绕过
- dump解密后的il2cpp.so
- 编译一份flappybird游戏
- bindiff恢复符号
- 实现无敌功能
- 封包成破解版apk
解题流程
- 解包APK,lib目录下有
libil2cpp.so
,\assets\bin\Data\Managed\Metadata
路径下有global-metadata.dat
,可以知道这是il2cpp引擎的游戏 libil2cpp.so
和global-metadata.dat
都是被加密的,打开libsec2021.so
发现IDA无法正确识别ELF文件,发现是文件头的e_phentsize
有问题,把23改成32即可正确识别,libil2cpp.so
也是同样的处理方式- 用
elf-dump-fix
把内存中的libil2cpp.so dump下来并修复了 - 写了一个脚本,成功把
global-metadata.dat
dump下来了
|
|
- dump下来的文件放到il2cppdumper中仍然无用,在github上找到flappybird的源码(FlappyBirdStyleGame),打算自己编译一份,结果踩坑了。。。原因是版本太新,于是用下了个版本低一点unity
废了很大力才编译出来(选了好几个unity版本都不符合预期。。。)
- 用il2cppdumper分析自己编译的libil2cpp.so,成功恢复符号并通过字符串的搜索找到对应的和实现无敌的函数
PlayerController__OnCollisionEnter2D
- 在该函数内部找到判定角色死亡的关键逻辑,但是现在目的是要在题目的so中找到对应游戏逻辑所在的位置,于是在
UnityEngine_Component__CompareTag
函数中发现有字符串信息 - 在dump下来的so中通过
bindiff
恢复了部分符号之后,也是成功定位到题目的so的关键逻辑 - 只需要把
0x540E60
处指令的BNE
修改成B
即可实现无敌 - 经过
Frida
的验证确实可以实现无敌
|
|
Question2:dump下来的il2cpp.so缺少符号(已解决)
请看下面两个对比图,符号是有一些恢复的,但是关键代码符号没有恢复
- 在别人wp中看到的
- 我dump下来的libil2cpp.so在IDA中看到的
- 下面是我dump il2cpp的过程(不知道是不是dump的时候地址范围选错了)
我目前的猜测wp中看到的是大佬编译了一份il2cpp.so然后恢复的符号,但是不确定是不是,打算自己编译一份看看的,但是不会,待办(确实是)
Question3:加载global-metadata.dat函数的调用链
如图,不明白这个加载函数为什么调用到这里了
Question4:实现无敌之后未成功绕过app的crc校验,导致重打包的apk无法运行
因为没有分析libil2cpp.so的解密函数和其他的一些代码段校验函数,所以无法实现破解版apk可以直接运行😭