文章总结: 本文系统探讨Android应用加固与脱壳技术,详细分析整体加壳、函数抽取型壳及指令级保护(VMP/dex2C)三种加固原理及其识别方法。核心发现指出art::DexFile类是内存脱壳的关键突破口,并提出通过修改系统源码hookDexFile对象实现通用脱壳的实践方案。文章最后给出具体代码修改位置和内存dump操作指导。 综合评分: 82 文章分类: 移动安全,逆向分析,安全工具,Android安全,二进制安全
Android加固和脱壳原理探索
哆啦安全
2021年10月24日 00:04
在小说阅读器读本章
去阅读
以下文章来源于编码安全 ,作者编码安全
编码安全 .
移动安全、鸿蒙安全、app逆向、js逆向、android漏洞、编码安全、安全攻防的分享。
Dex的理论基础
整体加壳,整体保护 : 就是将原始App里边的classes*.dex文件隐藏起来,使用jadx这种静态反编译工具只能看到壳dex,看不到App应用逻辑所在的dex,运行的时候壳dex负责将App的dex解密还原并加载到虚拟机中。加载的方式可以采用文件加载或者内存加载。
函数粒度的保护 : 也就是函数抽取型壳,保护粒度降到了方法级别,将App dex中某些方法抽空,使用jadx这种静态反编译工具查看方法体全是nop指令,由壳代码在合适的时机将方法体还原回去,显而易见方法体的还原必须在函数执行前进行。函数抽取型壳需要禁用掉dex2oat过程。
指令粒度的保护,保护效果最强 : 主要为VMP壳和dex2C,显著的特征是Java的方法native化了,VMP壳将保护级别缩小到了每条指令级别,通过自定义解释器来执行smail指令。而dex2C则将Java的方法等价转换为对应的native函数。
壳的类型识别
判断App是不是有进行加壳保护,通过使用jadx、androidkiller、jeb等工具打开App以后,查看App的四大组件类,如果组件类找不到实现,那么就是整体加壳了。
比如下面jadx看到qihoo相关的壳代码,App的代码被隐藏了。
判断App是不是函数抽取型壳就是看函数体是不是有意义的代码。
例如下面就是一个抽取型壳,可以看到函数体都是nop指令:
判断App是不是加了dex2C/VMP壳,就是要进行判断是不是有Java方法被native化了,至于到底是dex2C还是VMP则需要更一步的判断,比如native函数注册地址是否相同:
通用整体脱壳方法
加载Dex有很多种实现方式,每种壳的实现都不一定相同,如果想实现一个比较通用的整体脱壳方法,就必须寻找一个壳绕不开的方式来实现。这个关键的数据结构就是art虚拟机中定义的类art::DexFile,它的定义位于art/runtime/dex_file.h文件中。
这个类有两个成员变量,分别代表着dex文件加载到内存当中的起始地址以及大小,得到这两个信息以后通过内存dump的方式就可以轻轻松松的将dex文件dump下来。
这就表示一个事实: 在某个时机点内存当中一定会有解密后的完整dex存在。
art::DexFile是通过加载dex文件的,不管是使用BaseClassLoader加载还是自定义类加载器,最终都需要art::DexFile。我们可以通过系统/art/runtime/class_linker.cc文件中的函数得到这一原理,像ClassLinker::DefineClass,ClassLinker::LoadMethod,ClassLinker::LoadClassMembers这些重量级函数都需要以DexFile对象做为参数
通过BaseDexClassLoader进行加载类,它会进行执行art/runtime/native/dalvik_system_DexFile.cc文件的DexFile_defineClassNative函数。
这个函数的实现就是遍历Java层的DexFile的mCookie对象所表示的native层的art::DexFile,因为这个art::DexFile对象代表了dex文件在内存中的结构,所以可以通过类名在art::DexFile列表中查找到DexFile::ClassDef结构,才能继续调用ClassLinker::DefineClass()函数,最终才能得到一个虚拟机实现中的Class对象表示mirror::Class*,因此这个流程仍然离不开虚拟机中的art::DexFile类。
整体脱壳实践
既然我们知道虚拟机中的art::DexFile类是dex在内存中的表现,那么只要得到这个对象就可以dump出dex文件。
接下来就是寻找一个合适的点可以得到art::DexFile对象,得到对象以后通过hook的方式或者修改源码的方式都可以dump下来了。
通过修改系统源码具体实践方法。
找到libart.so文件中所有导出函数中带有art::DexFile参数或者返回值的函数,那么这就是一个可以脱壳的点
实现原理:通过修改系统源码,然后重新编译rom方式进行脱壳
具体实现就是在art/runtime/dex_file.cc的DexFile::DexFile中添加代码
添加dump的脱壳代码即可脱壳
历史文章链接
APP安全合规
APP安全浅析
APP隐私合规
APP安全检测
APP安全检测解决方案浅析
CTF逆向指南
App逆向|ART下整体壳的解决方案(一)
App逆向|ART下抽取壳的解决方案(二)
APP加固和脱壳方案总结
Objection动态分析App
Frida Hook的使用方法
内置frida hook到Android系统
Android10系统内置frida相关工具实战
内置frida-gadget so文件和frida-server可执行文件到系统(Android10)
欢迎关注微信公众号:哆啦安全,后续可以第一时间收到推送的更多干货文章,希望能对大家的工作、学习、技术研究有所帮助。**
点个在看你最好看
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:哆啦安全 《Android加固和脱壳原理探索》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论