Android Packer对抗主动加载的一种方法

by nemozqqz, 26 Oct 2022

一句话概括: 在DEX中插入无用类,检测到无用类的加载后随机kill自己

在用FART脱壳时经常出现方法没枚举完App就crash的情况,因此开始本次的分析。 某加固的指令抽取是通过hook classlinker的LoadMethod方法来实现的,codeitem的debug offset被壳用来做方法索引。

LoadMethod

可以看到根据系统不同版本拼接需要hook 的LoadMethod方法签名

OrigialMethod

原始LoadMethod方法执行完后进入壳自己的LoadMethod

mprotect

在壳合法的debugInfoOffset范围内,用mprotect修改insns页面权限

decryptinsn

insns解密前会先比较debug info offset是否在黑名单中,每次解密都需要满足计数器dword_C00DC的值小于dword_C00EC

cmpdebuginfo

比较debug info是否匹配黑名单,有匹配的话 计数器dword_C00DC从零置为1

initdebuginfo

保存debug info黑名单的地方

counterwatcher

有一个线程会监控计数器dword_C00DC的值,如果计数器大于dword_C00EC就会kill self

dexhunter1 dexhunter2

在检测到DexHunter/FUPK 的特征导出函数时也会给计数器置1

initcounter

计数器和上限初始化的地方,可以看到上限dword_C00EC是随机的。

总结: 在DEX中插入无用类,记录这些类的debug info offset作为黑名单;正常运行时不会加载这些无用类(没有任何引用),而当FART进行枚举方法主动调用时,会触发这些类的加载,从而导致计数器置1。计数器递增到达上限后触发kill self,App表现为随机的crash,从而中断枚举过程。

如何反制这种对抗: