il2cpp IDA修改
背景
native层存在server证书验证(C#)
Plan A:
在VirtualXposed或VirtualAppEx的IOUniformer.cpp里实现一劳永逸的hook,参见:一套强劲的 Il2cpp Hook 框架 by Himeko の 妙妙屋,但我暂时没有成功。
Plan B:
每次应用启动时用Frida + 手动获取的函数偏移值进行hook。这个方法是最容易实现的(但维护和执行费时),适合临时使用。
最近想把测试目标从真机移到模拟器上,但VirtualApp / VirtualXposed / Frida都不支持x86架构的native hook,无法挂钩应用内lib(甚至AVD的ARM模拟器也是如此),因此方法A和方法B只适用于真机,x86模拟器可能只能写原版xposed模块来进行native hook了吧?
Plan C:
本文的内容。直接修改libil2cpp.so中的ARM指令让证书校验返回true(每次apk更新都得重新修改)。主流模拟器都支持ARM应用运行所以理论可行。
流程
0 IDA
IDA打开libil2cpp.so(IDA 32位对应lib/armeabi-v7a,IDA 64位对应lib/arm64-v8a),根据模拟器或真机具体情况选择。因为分析极其耗时,最先进行这一步。
1 il2cpp分析
用perfare佬的Il2cppDumper,生成dump.cs和script.py
2 ARM指令分析
我用的IDA 7.0 32位不能导入python脚本,64位可以导入script.py还原symbol和string
在dump.cs中找到对应函数的偏移值:
1
public override bool IsValid(Uri serverUri, X509CertificateStructure[] certs) { } // RVA: 0x113E070 Offset: 0x113E070
等IDA分析完成,根据Offset定位相关函数; 右键Graph或者Text视图都行。然后找到关键命令。(我这里找的是返回值)
查看操作码:Options -> general -> Number of opcode bytes: 32位填4 64位填8(?)
3 ARM指令修改
如上图,MOV R0, R1
对应的操作码为E1A00001
(十六进制和汇编代码是大体颠倒的)
使用ARM指令<->HEX在线转换将MOV R0, #1
(修改返回值为1) 翻译为E3A00001
Edit/Patch program/Change byte
Edit/Patch program/Apply patches to input file (会覆盖原文件)
4 替换libil2cpp.so
对root后的设备,参照这篇文章:unity游戏生成与修改so文件教程
替换已安装的APP的库:data/app/xxxxxxx/lib/libil2cpp.so,可以避免签名校验
未root的话,对替换so后的APP重新打包,卸载原APP重新安装