目录

脱壳机学习

不同脱壳机原理比较分析

反制措施及解决方法

反制措施

在二代壳的基础上,有几种反制脱壳机的措施:

  • 垃圾类,应用检测是否存在垃圾类类的加载,若加载则闪退或重启进程
  • 检测系统特征,例如root,su等特征,若存在该类特征则不允许加载
  • 在开发时就针对某些类进行异常检测,若主动加载某些代码,则抛出异常,本质上同垃圾类的方式比较相似

若脱壳失败,如何确认是在哪个时机导致脱壳异常,此时可以看脱壳后的二进制文件在主动调用时的大小,若每次调用时的大小相同则说明脱壳已经完成,反之,若文件大小不一,则说明在脱壳进程中发生异常,脱壳失败。打开脱壳不成功的dex中调用时机晚的类,检索类名,基本就可以知道究竟是何处发生了异常

通过使用jadx切到smali,基本可识别出使用了什么样的壳,若全是nop,则存在函数抽取壳

这里提供几个样本:

  • guilv2.0.1.apk 贵旅优品

  • 安心e购

上述二者都以SplashActivity作为启动Activity

解决方法

去除环境特征,脱壳时跳过框架层代码,针对性脱壳,按需修复

什么是按需修复,即对于需要的类进行主动调用和修复,而这一点可以从Manifest中进行获取,在第一轮运行中,脱壳机先输出所有加载的类名,我们再选择需要脱壳的类加入白名单,脱壳机通过读取白名单中的类,再进行主动调用,就能实现按需修复。同时,可以在生成时回填,从而省略使用python脚本进行修复的步骤

总而言之,我们要保证应用运行在它认为“可信”的环境下,才能够进行脱壳和修复,在这个过程中如果不确定应用检测了什么设备指纹,可以先尝试运行,通过反馈的结果再逐步绕过检测设备指纹的点