[Unity]正确食用Il2cppdumper

发布于 2019-04-20  15.32k 次阅读


关键词:ShiningNikkiTW ver1.0.118076libNetHTProtect,Unity2018.2.7f1

priconne 内测中, libNetHTProtect,Unity2017.4.32f1

0x00 前言

本文相关工具及教程如下,感谢大小姐@perfare的强力创作:

1.Il2CppDumper v4.4.2说明

2.超简单的il2cpp游戏修改教程

0x01 Dump

已知该游戏有壳,运行时使用GameGuardian将内存中解密后的libil2cpp.so dump出来即可。过程不再详述。

bbac4000为lib vaddr

0x02 初步修复

使用010 Editor打开dump出来的bin文件,可以发现ELF头已经被抹掉。将bin文件重命名为dump.so,将原版libil2cpp.so文件的elf_header以及program_header_table共0x340字节,覆盖到dump.so中。

此处使用了官网的ELF模板

program_header_tableprogram_table_element[2]下的vaddr改为0xbbac4000(原始值为0x00000000),即实际内存中的起始地址,便于后续ida的分析。

使用Il2cppdumper时此处不可修改

0x03 codeRegistration and metadataRegistration

使用过Il2cppDumper的人都应该知道,codeRegistrationmetadataRegistration必须已知,Il2cppDumper方可正常工作。初步修复后, Il2cppDumper的auto模式4、5是无法正常使用的。因此我选择手动寻找 codeRegistrationmetadataRegistration,使用手动模式1来完成dump。这个方法实在是没技术含量大家千万不要学我啊啊啊啊

模式4、5报错

通过查看资源文件等方法可以确定该游戏的引擎版本是2018.2.7f1。从Unity官网下载相同版本的引擎安装完毕后,编译一个自己的游戏项目(还是那个熟悉的FlappyBird),使用Il2cppDumper的auto模式进行dump如下:

记好红框内codeRegistrationmetadataRegistration的值

用ida打开FlappyBird的libil2cpp.so,按g跳转到0x5a1d28,按x查看xrefs如下:

双击图中蓝色选中,跳转,即为关键点:

void MetadataCache::Register()

红框内的三条ARM指令可以视为一种“特征”。将其对应的ARM HEX记录下来:

LDR              R1, [PC,R1]    //01 10 9F E7
ADD R0, PC, R0 //00 00 8F E0
ADD R2, PC, R2 //02 20 8F E0
binary search string: 01 10 9F E7 00 00 8F E0 02 20 8F E0

用ida打开修改过vaddr的dump.so,搜索上述hex string,得唯一结果:

跳转至该处:

双击图中黄色选中,可以看到实际值:

可知codeRegistrationmetadataRegistration实际值分别为:

codeRegistration:0xBEE09754 - 0xBBAC4000 = 0x3345754
metadataRegistration:0xBEE0978C - 0xBBAC4000 = 0x334578C

0x04 使用Il2cppdumper的手动模式

如图:

注意第一个选项选"No"
成功生成了dump.cs和script.py

ida可正常识别:

0x05 另一个游戏-priconne

这是啥游戏不用多说了吧

首先还是说说手动dump的事儿。直接对dump出来的so暴力搜索对应的arm hex,到达预定位置:

双击dword_3A435DC

codeRegistration:0x39A34B4
metadataRegistration:0xD58F94EC - 0xD1F56000 = 0x39A34EC

虽然得到的值是没问题,但因为一些未知因素,手动dump会报错。这时候换上@perfare的Il2cppDumper-v4.7.1再试试吧:

1.Auto模式

源so文件复制elf_header以及program_header_table到dump so对应位置,对于这个so来说,长度是0x34+0x120,之后直接用dumper载入即可。

2. Auto(Plus)模式

首先将源so文件复制elf_header以及program_header_table到dump so对应位置,然后修改属性为RX和RW的loadable segment将起始地址全填为0,长度填为so的大小,用Il2CppDumper载入后可以用Auto(Plus)暴力搜索出指针地址。

两个Loadable Segment
起始地址置0,长度对应填写,另一个Segment同理

0x06 结语

本文仅抛砖引玉,欢迎各位大佬用力鞭笞我这个蒻