Post

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重新安装

This post is licensed under CC BY 4.0 by the author.