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输入子系统呢,反 ...
随机推荐
- apicloud编译所需的ios证书的获取方法
在我们通过apicloud或hbuilderX这些工具打包ios应用的时候,需要一个ios证书. 那么我们如何生成这个ios证书呢?网上介绍的方法都是需要使用mac电脑,然后用mac电脑的钥匙串访问的 ...
- 剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题 Offer 10- II 题目描述: 动态规划方程: 循环求余: 复杂度分析: package com.walegarrett.offer; impo ...
- a标签不能继承父级的颜色
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 面试必备——Java多线程与并发(二)
1.synchroized相关(锁的是对象,不是代码) (1)线程安全问题的主要原因 存在共享数据(也称临界资源) 存在多线程共同操作这些共享数据 解决:同一时刻有且只有一个线程在操作共享数据,其他线 ...
- C# 基础 - 委托、事件
1. 委托 sequenceDiagram 方法->>委托: 返回值和入参一样 委托->>方法: 调用委托就是调用绑定的方法 delegate int NumTest(int ...
- Python:垃圾回收
有很多不同的方法来实现垃圾回收,例如跟踪,引用计数,转义分析,时间戳和心跳信号等.不同的语言依赖于不同的垃圾回收实现,例如,有些将其与编译器和运行时系统集成在一起.而其他语言则可能需要事后设置,甚至可 ...
- 攻防世界 reverse Guess-the-Number
Guess-the-Number su-ctf-quals-2014 使用jd-gui 反编译jar import java.math.BigInteger; public class guess ...
- 用程序员的思维了解Filecoin
程序员接触一个新技术惯用步骤: 先搜索引擎搜索一波,找个最简单的解释.如果有了个大概的概念,就前往2.否则循环1->1->1...直到有个大概的概念为止. 上官网跑一遍. 各种论坛社区溜达 ...
- sqli-labs系列——第六关
less6 这个本质上跟第五关相同都是使用报错注入,这一关使用的是双引号闭合 还是使用updatexml()这个函数 ?id=1" union select updatexml(1,conc ...
- Git基础知识之内部状态管理系统
本文主要来介绍一下 Git 的内部状态管理系统.它利用基于节点和指针的数据结构来跟踪及管理编辑操作的时间线. 对本地项目而言,任一时刻,Git 处于三种状态中的一种:工作区状态.暂存区状态和提交区状态 ...