IL2CPP是Unity游戏最广泛使用的编译方案,而IL2CPP Dump是攻击者逆向分析Unity游戏的第一步。本文基于真实攻击场景,深度分析Zygisk-Il2CppDumper的完整攻击链,以及金丝雀安全的三层防御体系如何实现毫秒级拦截。
一、攻击链完整分析
阶段1: 环境准备
攻击者设备 → 安装Magisk → 安装Zygisk → 安装LSPosed → 安装Il2CppDumper模块
阶段2: 进程注入(Zygisk阶段)
Zygote fork新进程 → Zygisk在fork后注入SO → LSPosed加载模块
阶段3: IL2CPP Hook(目标进程内)
il2cpp_init被调用 → Dumper Hook il2cpp_init → 获取IL2CPP运行时指针
阶段4: 元数据遍历(目标进程内)
遍历Assembly → 遍历Image → 遍历Class → 遍历Method → 遍历Field
阶段5: dump.cs生成
格式化输出 → 写入/data/data/<pkg>/<pkg>-dump.cs → 攻击者获取完整类结构
关键时间窗口:从进程启动到dump.cs生成完成,通常需要2-5秒。防御的核心是在这个时间窗口内发现并阻止攻击。
二、Zygisk注入机制
Zygisk是Magisk提供的模块化注入框架,其注入时机在Zygote fork新进程之后、应用代码执行之前。
注入流程
- Zygote fork:Android所有应用进程由Zygote fork产生
- Zygisk pre-fork:Zygisk在fork前加载模块SO到Zygote进程
- 子进程继承:fork后的子进程自动继承Zygisk的SO映射
- 模块初始化:Zygisk回调模块的zygisk_module_entry
- LSPosed加载:LSPosed作为Zygisk模块,在此阶段加载目标模块
可检测的注入痕迹
痕迹1: /proc/self/maps中出现Zygisk相关SO
痕迹2: /dev/socket/.vendor_socket_hook_prop文件存在
痕迹3: /data/data/<pkg>/<32hex>/<PID>/ 下 .so + .dex + .js 共存
三、IL2CPP Hook过程
Il2CppDumper的核心是Hook il2cpp_init函数,这是IL2CPP运行时的初始化入口。
il2cpp_init()
→ il2cpp_domain_get() // 获取AppDomain
→ il2cpp_domain_get_assemblies() // 获取所有Assembly
→ il2cpp_assembly_get_image() // 获取每个Assembly的Image
→ il2cpp_image_get_class() // 获取每个Image的Class
→ il2cpp_class_get_methods() // 获取每个Class的Method
→ il2cpp_class_get_fields() // 获取每个Class的Field
四、dump.cs文件特征
// Image 0: Assembly-CSharp.dll
// Image 1: UnityEngine.CoreModule.dll
namespace GameNamespace
{
public class PlayerController : MonoBehaviour
{
public int health; // 0x0010
public float moveSpeed; // 0x0014
public void TakeDamage(int amount) { }
public void Die() { }
}
}
关键特征:dump.cs文件内容固定以
// Image N: xxx.dll开头,Unity游戏运行时绝不会在数据目录生成.cs源代码文件。
五、金丝雀安全三层防御
第一层:早期检测(init阶段,<10ms)
在游戏init阶段最开始执行检测,只检查铁证:dump.cs文件存在且内容以"// Image "开头 + 当前PID的LSPosed注入结构。发现铁证立即SIGKILL。
第二层:高速监控线程(50ms轮询)
50ms专用线程扫描数据目录下所有.cs文件,验证内容特征。发现dump文件立即调用unlink()删除并触发闪退。比通用循环快3倍。
第三层:通用循环检测(150ms轮询)
持续检测所有安全策略,包括Zygisk痕迹、LSPosed注入结构、dump.cs文件等,提供全面持续保护。
六、防御效果数据
| 指标 | 数值 |
|---|---|
| 早期检测延迟 | <10ms |
| 高速监控响应 | <50ms |
| dump文件删除率 | 100% |
| 攻击者获取完整数据概率 | ≈0% |
| 正常设备误判率 | 0% |