【Android安全-以退为进的il2cpp dump工具il2cpp_class_dumper】此文章归类为:Android安全。
前言
unity游戏的攻防自其诞生之初就已经开始了,现如今已经到了白热化的阶段,il2cpp_class_dumper就是为此而生,但在介绍它之前,让我们先以攻击者的视角来回顾这场攻防对抗。
静态dump,基于Il2CppDumper
传统的静态dump
在很久以前的时候,游戏厂商还没开始重视游戏安全,这时候存储unity app程序集关键符号信息的global-metadata.dat甚至没有任何经过加密就直接放入包体中,这时攻击者只需将包体中的global-metadata.dat和libil2cpp.so提取出来,再使用Il2CppDumper这个项目即可得到unity app程序集的关键符号信息。
但随着游戏厂商开始注重对global-metadata.dat的静态加密,这种方法越来越不适用。
动静结合的静态dump
既然直接从包体中提取global-metadata.dat不行,但若是直接在游戏运行时从内存中搜索global-metadata.dat再将其dump下来不就行了吗,以上方法在global-metadata.dat整体加密整体解密的情况下其实是适用的,在这种情况下dump下内存中已经解密的global-metadata.dat再使用Il2CppDumper即可顺利完成符号dump。
但是如果内存中始终没有完整的global-metadata.dat呢,它可能是分块解密再分块加载呢,这种情况实际上是非常常见的,这样的话,单纯的内存dump已经不能够解决问题了,在这种情况下可以直接分析libil2cpp.so中加载global-metadata.dat的逻辑来对原包体中的加密过的global-metadata.dat进行解密还原,但这种方法过于复杂而且因为不同游戏的加密方法不一致很难做到通用,所以攻击者往往都会选择第二种方法动态dump。
传统的动态dump,基于Zygisk-Il2CppDumper
正如前面所说,静态dump已经变得十分复杂且不通用了,动态dump便应运而生,即便到了现在这种无视静态加密的动态dump方法也还能dump绝大多数Unity游戏,就这么一种通用且使用方便的dump方法,它的原理其实十分简单,概括起来就是利用libilcpp.so中的il2cpp框架的关键系统api的导出函数的主动调用来获取unity app的程序集的符号信息。默认情况下很多il2cpp的系统api是直接暴露在libil2cpp.so的导出表当中的,这也是使用Zygisk-Il2CppDumper的前提条件。
但是如果游戏刻意隐藏了il2cpp框架的关键系统api的导出呢,只需隐藏一两个dump工具需要用到的il2cpp api就能阻碍动态dump工具的运行,实际上现在很多游戏都是这样做的。
这种情况下可以选择给dump工具打补丁,如果只隐藏了一两个il2cpp api那攻击者可以自己找到相应的il2cpp api的地址再修改dump工具的相应位置的源码不就顺利解决这个问题了吗。但如果隐藏的不是一个两个而是所有的il2cpp框架的关键系统api的导出呢,这种情况下再自己手动的一个一个找,不说耗费的时间要多少,能不能做到都是个问题。
自动化地寻找il2cpp api
对于没有魔改unity引擎的游戏来说,自动化地寻找il2cpp api是可行的,可以使用frida-find-il2cpp-api这个项目中的find_il2cpp_api.js来自动导出il2cpp api来供动态dump工具使用。
但是这种方法仅限于在没有魔改unity引擎的情况下使用。
以退为进,针对魔改unity引擎的dump
正如前面所说,在魔改unity引擎这种情况下,想要得到全部的il2cpp框架的关键系统api已是困难重重了,但我们不妨想想我们真的需要这么多il2cpp api吗,如果我们将需要的il2cpp api削减至个位数,在这种情况下就算一个一个api手动查找需要的时间也不会很多,虽然这样得到的符号信息也会比传统的动态dump少很多,但必要的取舍还是需要做出。
妥协的动态dump方法il2cpp_class_dumper
与其说il2cpp_class_dumper是动态dump,它更像是一种动静结合的dump方法。
该方法的核心思想是在il2cpp框架的SetupMethodsLocked放置hook,这样可以拦截到加载的所有klass并将其保存,待游戏加载完成所需要的klass后再通过主动调用极少部分的il2cpp api来动态dump klass的符号信息并保存至本地。
正是因为需要的il2cpp api非常少,目前该方法只能dump游戏程序集中的方法信息。
总结
通过上述回顾,可以明显看出现在关于unity游戏程序集符号信息的获取是愈发艰难了,il2cpp_class_dumper算是我个人想到的一个权宜之计。路漫漫其修远兮,吾将上下而求索。
更多【Android安全-以退为进的il2cpp dump工具il2cpp_class_dumper】相关视频教程:www.yxfzedu.com