寸阳分阴须爱惜,休负春色与时光。这篇文章主要讲述android脱壳之DexExtractor原理分析相关的知识,希望能为你提供帮助。
导语:
上一篇我们分析android脱壳使用对dvmDexFileOpenPartial下断点的原理,使用这种方法脱壳的有2个缺点:
1.
需要动态调试
2.
对抗反调试方案
为了提高工作效率, 我们不希望把宝贵的时间浪费去和加固的安全工程师去做对抗。作为一个高效率的逆向分析师, 笔者是忍不了的,所以我今天给大家带来一种的新的脱壳方法——DexExtractor脱壳法。
资源地址:
DexExtractor源码:https://github.com/bunnyblue/DexExtractor
DexExtractor脱壳原理
1. 一个DEX文件需要被解析成Dalivk虚拟机能操作对象DvmDex, 解析过过程中就必须调用 DexFile* dexFileParse(const u1* data, size_t length, int flags)。
2.
dexFileParse 函数原型如下:
DexFile* dexFileParse(const u1* data, size_t length, int flags)
data
:文件就是DEX文件经过优化后再内存中数据的首地址。
length:文件就是DEX文件经过优化后再内存中数据的长度。
3.
DexExtracctor就是重写
dexFileParse函数,在原函数实现基础上,将内存中DEX文件中数据经过Base64加密,写到移动设备的SD卡
4.
使用Base64加密是为了对有些加固代码,对read.write 函数进行hook。
原理分析:
根据上篇日志《android 脱壳 之 dvmDexFileOpenPartial断点脱壳原理分析》我们知道一个Dex文件加载必须经过dvmDexFileOpenPartial函数,这个函数内调用
dexFileParse 进行解析Dex文件成DexFile
文章图片
我们看看Android 源码中dexFileParse的实现
文章图片
再看看DexExtractor的 dexFileParse 的实现,你发现这里面比android 源码多了两行代码,而且这两行的编码格式不符合一个优秀的程序员的特质,竟然没有代码对齐,这是作者有意为之, 引起代码读者的注意。
文章图片
DexHacker 是DexExtraor作者自定义一个类。你会发现会调用DexHacker类的weiteDex2Encode, 分析到这你这里关键字Encode, 为什么需要加密, 所以我们继续分析函数writeDex2Encoded。
文章图片
可以看出使用base64对Dex文件加密, 加密的Dex存储在SD卡中, 文件名和应用程序有关。注意:这里我们看到加密的dex文件保存到SD卡, 我们知道这个操作需要Android应用程序有需要给这个应用添加一个写sd卡的权限:【android脱壳之DexExtractor原理分析】< uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>
这里我们会有一个疑问: 为什么要对DEX文件进行加密,这样还要解密,这样不是更加的麻烦吗? 1. 这个主要是为了对抗加固策略,现在一些加固平台,比如梆梆加固,会对dex的内存dump脱壳进行检测,具体的就是hook修改当前进程的read、write读写相关的函数,一旦检测到read,write读写相关的函数的操作中有对dex文件的dump行为会有对抗的处理,防止dex的内存dump。DexExtractor脱壳工具的作者考虑为了过掉这种内存dump的对抗,需要先将原始的dex文件数据进行base64加密, 加密后,就没有DEX文件格式的特征啦。 2. 这个解密工具也在github目录下Decode.jar,用法:java -jar Decode.jar dexdir;这里需要注意的是,dexdir是我们pull出dex之后的目录,记住是目录,不是对应的dex文件哦! DexExtractor脱壳法的脱壳步骤 由于笔者看过一个大牛使用DexExtrator 脱壳实例: http://www.wjdiankong.cn/apk%E8%84%B1%E5%A3%B3%E5%9C%A3%E6%88%98%E4%B9%8B-%E5%A6%82%E4%BD%95%E8%84%B1%E6%8E%89%E6%A2%86%E6%A2%86%E5%8A%A0%E5%9B%BA%E7%9A%84%E4%BF%9D%E6%8A%A4%E5%A3%B3/ 写得很好,很详细, 就简单提炼出,脱壳步骤吧。 1、给Android 设备 安装 DexExtractor功能, 我们分析DexExtractor的原理, 我们需要重写函数dexFileParser
- 在Android源码(AOSP)中,添加DexExtractor功能, 然后编译生成system.img,但是这个system.img 只使用余google手机和模拟器(你如果不想编译,这里给出了一个修改之后的system.img下载地址:https://pan.baidu.com/s/1jG3WQMU,这个文件是Android4.4系统的)
- 你如果没有google手机,也不想使用模拟器, 你可以替换手机系统的libdvm.so,DexExtractor的github 有提供(ARM, X86两个版本)
- 你使用你的手机支持 CM/LineageOS/TheMuppets 系统, 你可以下载他们源码,然后使用DexExtractor源码重写函数dexFileParse,然后编译,刷机。 (笔者支持这么干, 不过笔者还没弄过, 这么干,主动权全在我们手里)
文章图片
微信:蕉下客
文章图片
QQ日志:https://user.qzone.qq.com/1246264702/infocenter?ptsig=51g7D1S2*GrH7HrDGlJ0f7VeaovnHkAHKUIRX1gzsOU_ 博客地址:http://www.cnblogs.com/jiaoxiake/ 邮箱: changle517318@sohu.om ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 如果你觉得博客对你有用,且你手头又有富裕,可以打赏一下!!!! 知识共享时代,做一个优秀内容提供者。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
推荐阅读
- 十九. 想高速开发app,须要找外包吗()
- 如何使用Rancher设置Kubernetes集群(操作分步指南)
- Apache Storm与Spark比较(它们有哪些区别())
- 如何使用Kubernetes部署执行滚动更新(分步指南)
- 如何创建Spark DataFrame(分步操作详细指南)
- Kubernetes集群管理( 如何使用Rancher BMC集成())
- Terraform与Kubernetes有什么区别(哪个更好?)
- 如何更新Kali Linux(详细操作分步指南)
- Android_程序未处理异常的捕获与处理