前几日和朋友聊起各式音游,对解包产生了很大兴趣。当然也被科普了各种防逆向知识,由此想罗列一番做个随笔。
JAVA: class loader 热加载
加壳的目的无非两种:压缩或加密。类似于 Minecraft Forge,在运行时中将所需要的字节码转入内存中,这种方式能很好地隐藏 OEP。
而对策便是直接替换class loader,将写入内存的部分输出到文件中,便能获取到所有运行时源码。
字节码按规律修改
在《Project SEIKAI》中,游戏资源被一种特殊的方式所加密。其步骤为:开头128个字节每8个字节的前5个字节二进制取反。这种方法可谓异常简单,只需对比一遍原生 Unity 未加密的资源包二进制文件就能找出规律。
refer: 解包PJS资源的进一步探索, 黑鲸.
CPU级加壳
这种方式是将在指令头做一个映射,修改译码过程。这种方式可能连操作系统都不一定能捕捉到。
卷尾
加壳的方式非常之多,还有 int3 陷阱等不再赘述。我也推荐他试着逆向原神,不过难度确实很大,据我所知成功的也仅寥寥几人。日厂手游开发中 Unity 使用率越来越高,这也导致了很多 Unity 上的安全问题能在各种产品中重现。而回忆当年《Love Live!》用的自家引擎,也算是一种原始的加壳方式吧。