DexHunter的原理分析和使用说明(一)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53710357
Android通用脱壳工具DexHunter是2015年下半年,大牛 zyqqyz最先在看雪论坛放出来的,见《Android
dex文件通用自动脱壳器》这篇文章的说明。作者 zyqqyz在放出DexHunter通用脱壳工具代码的同时还专门在乌云网站上写了一篇文章《 从Android运行时出发,打造我们的脱壳神器》,更详细的对DexHunter通用脱壳工具的原理进行了详细的说明。当时看了几遍作者zyqqyz写的文章和silide.ppt但是还是比较蒙,不知道是咋回事,连这个工具的代码是怎么使用都没搞清楚。后面花了一段时间,将DexHunter脱壳工具的代码认真的分析一遍,比较清楚的明白了作者的脱壳的思路然后又将作者写的关于DexHunter的文章都看了几遍。现在知道怎么使用DexHunter脱壳工具的代码了,感觉作者大牛 zyqqyz对Android的dex文件的格式解析和存储以及Android运行时的类加载的详细过程非常的熟悉,在作者分享的有关DexHunter脱壳工具的文章后面,作者也将最近这一段时间里,国内一些常见加固的思路整理了一遍,特此写一篇学习的笔记,暂时只分析dvm情况下的脱壳思路。
一、作者zyqqyz总结的国内加固厂商的加固思路
DexHunter脱壳工具的处理思路和对抗思路很多也是基于加固厂商的加固思路来思考的,具体在DexHunter的代码里有体现。
1.360基本上是把原始的dex加密存在了一个so中,加载之前解密。
2.阿里把一些class_data_item和code_item拆出去了,打开dex时会修复之间的关系,同时一些annotation_off是无效的的来防止静态解析。
3.百度是把一些class_data_item拆走了,与阿里很像,同时它还会抹去dex文件的头部;它也会选择个别方法重新包装,达到调用前还原,调用后抹去的效果。我们可以通过对DoInvoke
(ART)和dvmMterp_invokeMethod (DVM)监控来获取到相关代码。
4.梆梆和爱加密与360的做法很像,梆梆把一堆read,write,mmap等libc函数hook了,防止读取相关dex的区域,爱加密的字符串会变,但是只是文件名变目录不变。
5.腾讯针对于被保护的类或方法造了一个假的class_data_item,不包含被保护的内容。真正的class_data_item会在运行的时候释放并连接上去,但是code_item却始终存在于dex文件里,它用无效数据填充annotation_off和debug_info_off来实现干扰反编译。
二、在dvm情况下,DexHunter脱壳工具的实现思路。
在dvm情况下,DexHunter脱壳工具主要的实现思路是修改Android源码文件/dalvik/vm/native/dalvik_system_DexFile.cpp里的Dalvik_dalvik_system_DexFile_defineClassNative函数的实现,具体操作是在Android系统代码调用函数dvmDefineClass进行类加载之前,主动地一次性加载并初始化Dex文件所有的类。
DexHunter脱壳工具在进行odex文件的内存dump的时候,分3部分进行内存dump:
[part
1]-----内存中从odex文件头到class_defs之前的文件数据内容(part1文件)
[part 2]-----class_defs段的文件数据内容(classdef文件和extra文件)
[part 3]-----class_defs后边到整个odex文件结束的部分的文件数据内容(data文件)
在进行odex文件的内存dump时,先dump [part
1]部分的文件数据内容到part1文件中,再dump [part 3]部分的文件数据内容到data文件中,最后先主动一次性加载并初始化dex文件的所有类,然后dump [part 2]部分文件的数据内容。但是呢,现在像前面提到的阿里、百度等的加固会在 [part 2]部分文件数据内容这里做了对抗处理,导致类的classDataOff或者类成员方法的codeOff指向的真实原始文件数据内容不在odex文件所在的内存范围内,被放在了另一份内存区域里。因此在进行dump [part 2]部分文件的数据内容时,需要进行相关的classDataOff或codeOff的相对文件偏移的修复和判断以及这部分真实原始文件数据内容的保存。DexHunter脱壳工具在dump [part 2]部分文件的数据内容时是有相关的判断,并会将这部分不在odex文件内存区域的数据保存到extra文件中,被修改过的class_defs段就保存在classdef文件。拿到odex文件的这几部分文件数据内容以后,按照odex文件的格式排布进行文件的重组,还原到whole.dex文件中。
加固处理后,超过odex文件所在内存区域的DexClassData或者DexCode这部分文件数据内容的文件相对偏移classDataOff或codeOff被设置在odex文件的末尾,并且存储在extra文件中的顺序为先存类成员方法的类字节码指令method->insns的数据再存DexClassData相关的类成员的结构信息:
DexHunter脱壳工具涉及到的知识点:
1>. dex文件的分布其实就是分区段存储不同的内容,在头部里有指向各个区段起始的偏移值。我们需要关注的就是class_defs和data这两个段了。
2>.
class_defs包含了所有的类,用class_def_item来描述,每个class_def_item指向一个class_data_item,每个class_data_item 包含了一个class的数据DexClassData,每个方法用encoded_method结构来描述,它又指向了一个code_item的DexCode,这个里面就保存着一个方法的所有指令。下图是对class_def_item展开的一个示意图:
3>.
修改的关键点,在DVM中是Dalvik_dalvik_system_DexFile_defineClassNative,主要的修改就发生在这里。简单地说就是主动地一次性加载并初始化所有的类。
DexHunter这样做隐含的几个前提条件:
- 当类被加载时,dex中对应的部分必须有效;
- 类初始化的时候,dex中的内容包括生成的Class对象是可以被修改的;
- 只有在执行一个方法时,才要求code_item是有效的。
4>. 作者 zyqqyz按脱壳思路整理的步骤:
5>.
下边就要进行一些判断--看需不需要修复:
6>.
作者 zyqq演讲的ppt的思考思路整理:
整理了这么多,大多数的知识和截图都是作者大牛 zyqqyz整理的,我只是搬运过来,代码是基本看懂了,但是真是写不明白,后面我会给出自己注释的DexHunter的代码以及DexHunter的使用的说明。本来打算一篇博文记录完毕的,看来不行,上面很多的截图是作者zyqqyz在HITCON
2015演讲ppt的内容,谢谢作者大牛。懒得打开看pdf文件了,直接把自己认为对我有帮助的直接截图在博客上,方便查阅了。
参考网址:
看雪论坛地址:http://bbs.pediy.com/showthread.php?t=203776
github网站地址:https://github.com/zyq8709/DexHunter
HITCON的地址:http://hitcon.org/2015/ENT/Activities-Enterprise-Agenda.html#zyq
其它地址:http://www.liuhaihua.cn/archives/153836.html
其它地址:http://blog.csdn.net/qq1084283172/article/details/53584495
其它地址:http://blog.csdn.net/qq1084283172/article/details/53668109
其它地址:https://my.oschina.net/cve2015/blog/734360
其它地址:http://blog.csdn.net/justfwd/article/details/50915725
其它地址:http://blog.csdn.net/roland_sun/article/details/38640297
其他地址:http://www.freebuf.com/sectool/76884.html
DexHunter的原理分析和使用说明(一)的更多相关文章
- DexHunter的原理分析和使用说明(二)
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53715325 前面的博文<Android通用脱壳工具DexHunter的原理 ...
- drizzleDumper的原理分析和使用说明
https://blog.csdn.net/qq1084283172/article/details/53561622 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...
- DexExtractor的原理分析和使用说明
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/53557894 周末有空就写下博客了,今天来扯一扯Android平台的脱壳工具Dex ...
- DexHunter在Dalvik虚拟机模式下的脱壳原理分析
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78494671 在前面的博客<DexHunter的原理分析和使用说明(一)&g ...
- DexHunter在ART虚拟机模式下的脱壳原理分析
本文博客地址: http://blog.csdn.net/qq1084283172/article/details/78494620 DexHunter脱壳工具在Dalvik虚拟机模式下的脱壳原理分析 ...
- Handler系列之原理分析
上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...
- Java NIO使用及原理分析(1-4)(转)
转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...
- 原子类java.util.concurrent.atomic.*原理分析
原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...
- Android中Input型输入设备驱动原理分析(一)
转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...
随机推荐
- C++类的友元机制说明
下面给出C++类的友元机制说明(对类private.protected成员访问),需要注意的是,友元机制尽量不用或者少用,虽然它会提供某种程度的效率,但会带来数据安全性的问题. 类的友元 友元是C++ ...
- nignx的location正则匹配
原文链接:http://nginx.org/en/docs/http/ngx_http_core_module.html Syntax: location [ = | ~ | ~* | ^~ ] ur ...
- Java基础 随笔整理
Java基础随笔整理 为了方便阅读,特整理了相关的学习笔记 Java感想 操千曲而后晓声 Java入门 Java其他 Java虚拟机详解 语言入门百题 Java开发工具 · Eclipse Java语 ...
- 14. vue源码入口+项目结构分析
一. vue源码 我们安装好vue以后, 如何了解vue的的代码结构, 从哪里下手呢? 1.1. vue源码入口 vue的入口是package.json 来分别看看是什么含义 dependences: ...
- 关于个Base64,MD5,16进制的转换
1,待签名数据以UTF-8的格式转字节流,对字节流进行MD5算法得到的签名字节流,再转换为16进制字符串,即生成了数字签名. byte[] targetData = md5.ComputeHash(S ...
- golang——net/rpc包学习
1.rpc包 rpc包提供了通过网络或其他I/O连接对一个对象的导出方法的访问. 只有满足如下标准的方法才能用于远程访问,其余方法会被忽略: (1)方法是导出的(2)方法有两个参数,都是导出类型或内建 ...
- 推荐一个能让谷歌浏览器变暗色的插件(darkreader)
下载 https://codechina.csdn.net/mirrors/darkreader/darkreader?utm_source=csdn_github_accelerator 安装教程 ...
- Python基础学习【day2】
运算符 运算符有哪些? 加 + 减 - 乘 * 除 / 幂 ** 取余 % ...
- 6、MyBatis教程之日志实现
7.日志实现 思考:我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率? 如果一个 数据库相关的操作出现了问题,我们可以根据输出的SQL语句快速排查问题. 对于以 ...
- [差分][二分][贪心]luogu P3634 [APIO2012]守卫
题面 https://www.luogu.com.cn/problem/P3634 给m个限制,可以是一段区间中必须有或者必须无忍者 最多有k个忍者,问有多少个位点一定有忍者 分析 首先用差分标记一下 ...