在对unity游戏逆向分析的过程中,时常需要先定位到相关逻辑函数,那如何快速找到我们需要的函数?其实最好的方法就是直接通过trace工具一键hook大量函数,再看那些函数是否被调用,没调用的函数自然可以略过,如有调用再重点验证即可。目前这方面最流行的trace工具应该是frida-il2cpp-bridge,但是随之frida检测的愈发难以绕过,frida-il2cpp-bridge的使用门槛也是水涨船高,因此Il2cppTraceModule便应运而生。
简单来说Il2cppTraceModule会先获取指定路径文件中存放的类名信息,再根据这个类名信息获取该类所有的函数的地址,然后再依据这些函数地址分别下hook。这就涉及到了hook框架的使用了,Il2cppTraceModule其实先后更换过好几个不同的hook框架。
要说安卓平台上除了frida外,还有哪个native hook框架最为人所知,我觉得Dobby绝对算其中之一。因此自然而然成了Il2cppTraceModule使用过的第一个hook框架,那为什么后来又不继续使用了呢?主要还是稳定性问题或者说和我的整体设计相冲,我是要将大量被hook函数的回调函数同时设置为同一个函数,但Dobby提供的能够注册回调函数的api只有DobbyInstrument,而这个api好像确实是不太稳定,在一些app上是能够稳定运行的,但是也有导致一些app崩溃的情况存在。
像Android_Inline_Hook_ARM64以及And64InlineHook这些类似的轻量级的inline hook项目我均有尝试使用过,但其实要么是稳定性太差,要么是无法达到我想要的效果,所以最终也都弃用。
基于Kernel-Trace提供的用户层接口,我们能够直接使用uprobe去挂载任意函数地址。Kernel-Trace说起来也是为此而生,也是由于Il2cppTraceModule的使用,才能够发现并改进自身存在的诸多问题。依赖Kernel-Trace,最终达到了我所期望的效果,十分稳定,而且正确地使用uprobe去进行hook几乎不会产生任何额外特征,除了crc校验能够发现之外,基本算是无痕了。
本来是想着用其他hook框架复现下frida-il2cpp-bridge的trace功能,没想到最后还是自己去研究uprobe实现了Kernel-Trace之后才算是彻底做完这个事。
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!