[原创]某加固对抗主动加载的方法
发表于:
2022-10-26 23:13
8117
一句话概括: 在DEX中插入无用类,检测到无用类的加载后随机kill自己
在用FART脱壳时经常出现方法没枚举完App就crash的情况,因此开始本次的分析。 某加固的指令抽取是通过hook classlinker的LoadMethod方法来实现的,codeitem的debug offset被壳用来做方法索引。
根据系统不同版本拼接需要hook 的LoadMethod方法签名
原始LoadMethod方法执行完后进入壳自己的LoadMethod
在壳合法的debugInfoOffset范围内,用mprotect修改insns页面权限
insns解密前会先比较debug info offset是否在黑名单中,每次解密如果计数器dword_C00DC非0,那么计数器+1, 需要满足计数器dword_C00DC的值小于dword_C00EC
比较debug info是否匹配黑名单(C00E0,C00E4,C00E8),有匹配的话 计数器dword_C00DC从零置为1
初始化debug info黑名单的地方
有一个线程会监控计数器dword_C00DC的值,如果计数器大于dword_C00EC就会kill self
在检测到DexHunter/FUPK 的特征导出函数时也会给计数器置1
计数器和上限初始化的地方,可以看到上限dword_C00EC是随机的。
总结: 在DEX中插入无用类,记录这些类的debug info offset作为黑名单;正常运行时不会加载这些无用类(没有任何引用),而当FART进行枚举方法主动调用时,会触发这些类的加载,从而导致计数器置1。计数器递增到达上限后触发kill self,App表现为随机的crash,从而中断枚举过程。
如何反制这种对抗:
hook kill,在这个例子里计数器到达上限后就不再解密指令了,hook kill阻止了崩溃但是也继续无法dump
使黑名单无效,比如hook 这个例子里的atoi返回值。
crash后跳过之前的类继续dump?缺点是需要记录dump进度
第一次发帖,欢迎大家提出建议和想法~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2022-10-26 23:14
被zqqz编辑
,原因: