本文博客地址: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是有效的。

DexHunter的工作流程(其中浅红色的部分就是内存dump产生的文件):


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的原理分析和使用说明(一)的更多相关文章

  1. DexHunter的原理分析和使用说明(二)

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/53715325 前面的博文<Android通用脱壳工具DexHunter的原理 ...

  2. drizzleDumper的原理分析和使用说明

    https://blog.csdn.net/qq1084283172/article/details/53561622 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...

  3. DexExtractor的原理分析和使用说明

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/53557894 周末有空就写下博客了,今天来扯一扯Android平台的脱壳工具Dex ...

  4. DexHunter在Dalvik虚拟机模式下的脱壳原理分析

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78494671 在前面的博客<DexHunter的原理分析和使用说明(一)&g ...

  5. DexHunter在ART虚拟机模式下的脱壳原理分析

    本文博客地址: http://blog.csdn.net/qq1084283172/article/details/78494620 DexHunter脱壳工具在Dalvik虚拟机模式下的脱壳原理分析 ...

  6. Handler系列之原理分析

    上一节我们讲解了Handler的基本使用方法,也是平时大家用到的最多的使用方式.那么本节让我们来学习一下Handler的工作原理吧!!! 我们知道Android中我们只能在ui线程(主线程)更新ui信 ...

  7. Java NIO使用及原理分析(1-4)(转)

    转载的原文章也找不到!从以下博客中找到http://blog.csdn.net/wuxianglong/article/details/6604817 转载自:李会军•宁静致远 最近由于工作关系要做一 ...

  8. 原子类java.util.concurrent.atomic.*原理分析

    原子类java.util.concurrent.atomic.*原理分析 在并发编程下,原子操作类的应用可以说是无处不在的.为解决线程安全的读写提供了很大的便利. 原子类保证原子的两个关键的点就是:可 ...

  9. Android中Input型输入设备驱动原理分析(一)

    转自:http://blog.csdn.net/eilianlau/article/details/6969361 话说Android中Event输入设备驱动原理分析还不如说Linux输入子系统呢,反 ...

随机推荐

  1. C# smtp邮件发送

    第一种方式发送邮件,不读取配置文件发送邮件,(本地测试可以,但是服务器上不行) /// <summary> /// 发送邮件 /// </summary> /// <pa ...

  2. IDEA中便捷内存数据库H2的最简使用方式

    在IDEA中有时候为了练习,需要使用到数据库,但如果自己工作或开发机子上本来没有安装数据库,也没有可用的远程数据库时,我们可以直接在IDEA环境上使用便捷式的内存数据库H2,关于H2更多知识就自己去找 ...

  3. Python爬虫学习三------requests+BeautifulSoup爬取简单网页

    第一次第一次用MarkDown来写博客,先试试效果吧! 昨天2018俄罗斯世界杯拉开了大幕,作为一个伪球迷,当然也得为世界杯做出一点贡献啦. 于是今天就编写了一个爬虫程序将腾讯新闻下世界杯专题的相关新 ...

  4. 使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTful API

    上一篇写的是使用静态基类方法的实现步骤:  http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (ExpandoObject)的好处就是可以动态组 ...

  5. Android学习之 AlertDialog

    •AlertDialog简介 AlertDialog 可以在当前界面弹出一个对话框: 这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力: 因此, AlertDialog 一般用于提示 ...

  6. Java单链表反转图文详解

    Java单链表反转图文详解 最近在回顾链表反转问题中,突然有一些新的发现和收获,特此整理一下,与大家分享 背景回顾 单链表的存储结构如图: 数据域存放数据元素,指针域存放后继结点地址 我们以一条 N1 ...

  7. vue 快速入门 系列 —— 初步认识 vue

    其他章节请看: vue 快速入门 系列 初步认识 vue vue 是什么 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架. 所谓渐进式,就是你可以一步一步.有阶段 ...

  8. 关于在forEach中使用await的问题

    先说需求,根据数组中的ID值,对每个ID发送请求,获取数据进行操作. 首先肯定考虑用forEach 或者 map对数组进行遍历,然后根据值进行操作,但是请求是个异步操作,forEach又是一个同步操作 ...

  9. [深搜]A. 【例题1】拔河比赛

    A . [ 例 题 1 ] 拔 河 比 赛 A. [例题1]拔河比赛 A.[例题1]拔河比赛 解析 模板题,选与不选 Code #include <bits/stdc++.h> #defi ...

  10. Spring Boot 快速迁移至 Quarkus

    Quarkus 是一个目前非常火的 Java 应用开发框架,定位是轻量级的微服务框架.,Quarkus 提供了优秀的容器化整合能力,相较于传统开发框架(Spring Boot)有着更快的启动速度.更小 ...