欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

TaintDroid深入剖析之启动篇

来源:本站整理 作者:佚名 时间:2016-07-04 TAG: 我要投稿

0x00 背景知识
0.1 Android平台软件动态分析现状
众所周知,在计算机领域中所有的软件分析方法都可以归为静态分析和动态分析两大类,在Android平台也不例外。而随着软件加固、混淆技术的不断改进,静态分析越来越难以满足安全人员的分析要求,因此天生对软件加固、混淆免疫的动态分析技术应运而生。虽然动态分析技术本身有很多局限性,诸如:代码覆盖率低,执行效率低下等等,但是瑕不掩瑜,个人认为熟悉各种动态分析技术的核心原理也应当是安全从业人员的必备要求。
下图1-1展示了部分工业界和学术界在android平台动态分析技术上的成果,有兴趣的同学根据需求进一步了解:

图0-1 当前工业界和学术界在android平台动态分析技术部分成果
ps: 这张图是去年总结的,所以未能将一些最新的系统、工具纳入,欢迎各位大牛补充。
在上述众多优秀的动态分析系统、工具中,个人觉得基于污点跟踪技术的TaintDroid一定是其中最重量级的成果之一,截止今天,该论文的引用次数已经达到了惊人的1788次。虽然很多人都用过TaintDroid,甚至大牛们进行过二次开发,但是目前市面上并没有对TaintDroid进行深入剖析文章。因此本系列文章将会详细分析TaintDroid的具体实现,从源码层深了解TaindDroid的优缺点,希冀能跟大家一起开发出检测效果更好、运行效率更高的污点跟踪系统。
0.2 阅读论文
首先读者需要详细阅读TaintDroid的那篇论文为方便英文不好的同学,我们已经将其翻译成了中文,由于论文翻译太费时,其中难免有不对的地方,建议大家对照着原文看^_^),该论文详细讲解了TaintDroid的核心技术以及其设计模型等等,充分理解这篇论文对我们后续深入了解TaintDroid的具体实现很有帮助。
0.3 下载源码
本文主要以Android4.1版本的TaintDroid为分析对象(其最新为android4.3版本,主要是添加对selinux的适配,核心内容并没有改变),为了便于读者进行对照分析或测试,建议读者按照官网http://appanalysis.org/download_4.1.html 的提示下载源码。当然,如果读者仅仅是想阅读污点跟踪相关的代码,可以去github中按照自己的需要下载对应部分源码即可。如实现变量级、Native级污点跟踪的代码基本都在dalvik目录下,所以可以在:https://github.com/TaintDroid/android_platform_dalvik下载dalvik相关源码。
0.4 系统栈帧概念
由于TaintDroid的变量级和方法级污点跟踪是建立在其对DVM栈和Native栈的修改之上的,所以我们必须熟悉系统栈帧的概念,如图1-2所示:

图0-2 系统栈帧分布
单个函数调用操作所使用的栈部分被称为栈帧(stack frame)结构,其一般结构如上图所示。栈帧结构的两端由两个指针来指定。寄存器ebp通常用做帧指针(frame pointer),而esp则用作栈指针(stack pointer)。在函数执行过程中,栈指针esp会随着数据的入栈和出栈而移动,因此函数中对大部分数据的访问都基于帧指针ebp进行。
0.5 内容安排
如下图所述:

鉴于TaintDroid有四种粒度的污点跟踪机制,且这四种污点跟踪机制实现逻辑相对独立,所以本系列文章将会分章讲解各个粒度污点跟踪机制的实现原理、方法,然后再从某些具体的情境出发,详细分析TaintDroid是如何综合利用这4种跟踪机制,以及为了无缝融合这些机制其所作的一些辅助性修改。
0x01 TaintDroid变量级污点跟踪分析之上篇
严格来说,应该叫做“DVM中interpreted方法的变量级污点跟踪分析”。从论文中我们得知:DVM 有 5 种类型的变量需要进行污点存储:方法的本地变量,方法的参数,类的静态域,类的实例域,数组。鉴于方法的本地变量和方法的参数是存储在方法的执行栈帧中;而类的静态域、实例域却以指针的方式进行存储;至于数组又有自己独特的数据结构ArrayObject。所以为了分析逻辑更加清晰,我们将TaintDroid变量级污点跟踪分析分为上下两篇:上篇主要讲解方法本地变量与方法参数的污点跟踪,下篇主要介绍类的静态域、实例域以及数组的污点跟踪。
TaintDroid为了实现此种机制以及后面章节将介绍的Native方法级污点跟踪机制,它对栈进行了一次大手术!至于这个手术的复杂度和难度系数具体如何,请听我们娓娓道来。
众所周知,在4.4之前的整个Android系统共存在两种类型的方法:
Interpreted method: 在DVM虚拟机中解释执行的方法;需要注意的是,DVM中存在两种解释器:标准的可移植解释器dvmInterpretStd以及对某个特定平台优化后的解释器dvmMterpStd,前者由C代码实现,后者由汇编实现。
Native method: 直接执行的C/C++/汇编代码,又可细分为Internal VM Method(如System.arraycopy)和JNI method。
这两类方法有各自的栈帧结构(Interpreted Stack和Native Stack),但是可以互相调用,即存在了以下4种情况:
interpreted → interpreted
同一个类方法之间直接通过GOTO_invoke系列宏进行跳转。不同类的话根据具体情况而定。一直在interpreted stack中执行。
interpreted → native
如果目标函数是jni调用那么就判断method的NATIVE标志位,通过native调用桥dvmCallJniMethod进行跳转。常见情况就是JNI调用。
如果目标函数是Internal VM Method,那么就可以通过interpted代码直接调用,只是需要传递一个指向32位寄存器参数的指针以及一个指向返回值的指针即可。常见形式如下:
InternalVMfunc(const u4* args, JValue* rResult){……}
由interpreted stack转到native stack。
native → native
这里主要说明由Internal VM Method或反射调用跳转到JNI Method的情况。在这种情况下最终会调用dvmPushJNIFrame为目标函数分配一个JNI帧。

[1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载