关键词:ShiningNikkiTW ver1.0.118076,libNetHTProtect,Unity2018.2.7f1
priconne 内测中, libNetHTProtect,Unity2017.4.32f1
0x00 前言
本文相关工具及教程如下,感谢大小姐@perfare的强力创作:
0x01 Dump
已知该游戏有壳,运行时使用GameGuardian将内存中解密后的libil2cpp.so dump出来即可。过程不再详述。

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

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

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

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

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

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

红框内的三条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,得唯一结果:

跳转至该处:

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

可知codeRegistration和metadataRegistration实际值分别为:
codeRegistration:0xBEE09754 - 0xBBAC4000 = 0x3345754
metadataRegistration:0xBEE0978C - 0xBBAC4000 = 0x334578C
0x04 使用Il2cppdumper的手动模式
如图:


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)暴力搜索出指针地址。


0x06 结语
本文仅抛砖引玉,欢迎各位大佬用力鞭笞我这个蒻
Comments | 17 条评论
讲的不是很明白 看的一脸懵逼 请问可以出视频教程嘛 或者有讨论群可以加嘛 好希望能回我邮箱哦
大佬,priconne这游戏的反调试有啥思路可以过掉吗?
@3u
还没公测吧这游戏..
冰鸽: 谁没看懂!
我(弱鸡): 我没看懂!
啪!
@大JJ
神他妈大JJ,凑不要脸
@大JJ
狗磁暴,让我逮到了,没想到整理个书签能看到你
嗯嗯,这样啊,我已经完全搞懂了(完全没懂).jpg
@热冰器惹不起
????你是谁
#该评论为私密评论#
@pollux
感谢赏识。部分不适合公开的部分会加密,还请谅解。如果对哪方面想做更深入的了解可以通过留言告诉我们
#该评论为私密评论#
不太懂
请问arm64 需要怎么寻找这两个值呢 求解
大佬您好,我用自己创的unity项目里的il2cpp.so,用il2cppDumper找到了metadataRegistration,但是在ida里按x没有跳出引用界面是怎么回事呢
@Cokko
啊。我明白了,是文件太大还没有加载完
问题好多 大佬能指点一下吗 初学者
1、使用010 Editor打开dump出来的bin文件,可以发现ELF头已经被抹掉。 怎么判断头被抹掉了
2、使用官网的ELF模板 覆盖 怎么覆盖 是把对应2个数据段直接拼在原来导出的前面吗 为什么这样处理 没看懂
3、图二是用什么工具查看的 经过上面处理已经可以正常解析成这样了吗
4、为什么使用Il2cppdumper手动找了地址 然后 去ida里面 再找地址 然后又用Il2cppdumper dump 没看懂
@cookie
1.看有没有”ELF”的magic header;
2.3.4.现在用最新的dumper(ver6.7.25+)已经不需要用上述文章中提到的办法了,基本上dump出so文件后,处理好dynstr/text/rodata几个段就能正常dump了