原创文章,转载请注明出处,谢谢。java
Android应用程序分析主要有静态分析和动态分析两种,常见的静态分析工具是Apktool、dex2jar以及jdgui。今天忽然主要到Google code上有个叫作androguard的工具,提供了一系列的Apk以及dex、odex、arsc等文件的分析处理功能。很值得学习和分析。python
androguard项目主页:http://code.google.com/p/androguard/linux
androguard是基于python的,将Apk文件中的dex文件,类,方法等都映射为python的对象,项目主页介绍了androgurad的特性,简单来讲,androguard提供了apk文件的反向工程,恶意软件检测和威胁评估,还有程序行为可视化。功能至关丰富,是分析apk的好帮手。android
androguard的部署配置数据库
androguard是基于python的,因此不管windows,linux仍是mac os,只要能运行python的均可以运行androguard。json
个人软件环境是Ubuntu12.04 64位、java 1.六、 python 2.7.windows
androguard的安装能够参考Wiki,我基本按照这个步骤进行,有些地方是须要注意的。app
1. 得到androguard。 我是从Downdload里直接下载的zip包,并无采用hg工具clone,也没有使用pre-installed Virtual Machine。将zip包放到工做目录下,解压缩。函数
2. 安装所需的python模块。 为了可以使用全部的功能,须要安装不少的python模块,例如androdd.py须要pydot来生成图片,androrisk.py须要pyfuzzy,akpiewer.py须要networkx。这些模块有的能够直接apt-get install安装,有些找不到,能够直接百度搜索,而后下载zip包解压缩后执行python setup.py install来安装。具体须要的模块请参考Wiki,安装不全的也能够在运行时根据错误提示再进行安装。工具
3. in elsim/elsign/formula/Makefile: add the appropriate include directory where to find muParser.h. For example:
CFLAGS += -I/usr/include/muParser
in elsim/elsign/libelsign/Makefile, add the appropriate include directory for muParser.h and python. Example:
CFLAGS += -I/usr/include/muParser -I/usr/include/python2.7
4. 进入androguard目录,执行make。
至此,androguard的安装工做完成,androguard目录下的全部py文件都是一个工具,用-h查看帮助,例如:
androguard的使用
上图中全部绿色的py文件都是可用的工具,下面我介绍说明经常使用到的几个。
androcsign.py:
androcsign.py用于添加apk文件的签名信息到一个数据库文件中。Androguard工具目录下的signatures/dbandroguard文件为收集的恶意软件信息数据库。在开始使用androcsign.py前须要为apk文件编写一个sign文件,这个文件采用json格式保存。前文提到次工具能够检测恶意程序,是由于有恶意程序的签名库,是signatures目录下的dbandroguard文件,此目录中的.sign文件为提供了json签名文件的范例,我看这个文件只能是手动去写了。
json范例:
[ { "SAMPLE":"apks/5aff5198c2fe5798bd7f1519dab0cd4ee737d5d2.apk" }, { "BASE":"AndroidOS", "NAME":"Plankton", "SIGNATURE":[ { "TYPE":"METHSIM", "CN":"Lcn/plankton/device/android/service/AndroidMDKService$SNChecker;", "MN":"isRegistered", "D":"()Z" } ], "BF":"0" } ]
SAMPLE指定须要添加信息的apk文件。BASE指定文件运行的系统,目前固定为AndroidOS。NAME是该签名的名字。SIGNATURE为具体的签名规则,其中TYPE用来指定签名的类型,METHSIM表示的是方法的签名,此外还有CLASSSIM表示为类签名;CN用来指定方法所在的类;MN指定了方法名;D指定了方法的签名信息。BF用来指定签名的检测规则,能够同时知足1条或多条,例如,使用SIGNATURE定义了3条签名规则,当软件的代码同时知足规则1或规则2且知足规则3时说明样本符合检测条件,那么BF可定义为“"BF" : "(0 or 1) and 2"”。
在Androguard目录下新建一个apks目录,将apk复制进去,而后将plankton.test.sign文件复制到Androguard的signatures目录下,在终端提示符下执行下面的命令:
./androcsign.py -i signatures/plank.test.sign -o signatures/dbandroguard
便可将签名信息添加进数据库。
-l选项能够将数据库中的信息展现出来
androgexf.py
androdd.py用来生成apk文件中每一个类的方法的调用流程图。能够选择生成.dot格式的,另外还能够在PNG和JPG中的一种,其中DOT是一种图形描述语言,使用次方法要注意的一点是Wiki上提示的选择图形格式时“-f PNG”使用的大写字母,实际运行时发现会报错。以下图:
可见选择png仍是jpg会和write拼成一个函数,而这个函数是小写的,因此必须用下写的参数才行。
这个功能能够在-o指定的目录下生成控制流图,从目录结构能够看出对每一个类的每一个方法会建立一张图,图样以下所示:
androgexf.py
androgexf.py用来生成APK的GEXF格式的图形文件。该文件可使用Gephi查看。Gephi软件能够改变图形的布局,显示和隐藏Label,调节图形线条粗细和字体大小,也能够选择只查看数据,更多功能留给读者自行发现。
androxgmml.py
androxgmml.py用来生成apk/jar/class/dex文件的控制流程及功能调用图,输出格式为xgmml。此格式的图可使用Cytoscape软件打开查看。
androapkinfo.py
androapkinfo.py用来查看apk文件的信息。该工具会输入apk文件的包、资源、权限、组件、方法等信息,输出的内容比较详细。
androdiff.py
androdiff.py用来比较两个apk文件的差别。-i选项后接两个文件做为参数。
前几天参加的第十二届软件与应用学术会议上,北大的一篇检测Repackage应用的文章分为两个步骤,首先检测应用和官方应用是否类似,而后看签名是否相同,他们检测类似性是用两个应用的变量和每一个变量出现次数的矩阵来比较的,我想这个diff工具也能够提供一些参考,还有androsim.py,这个就是计算两个APK的类似度。
androrisk.py
检测应用程序的风险,使用比较简单,输出以下:
root@shuai-Inspiron-One-2320:~/DevTools/androguard-1.9# ./androrisk.py -d ../ApkForTest/ ../ApkForTest/8f7bf37face686ac456c21dc1dad132f077ce626.apk RedFlags DEX {'NATIVE': 1, 'DYNAMIC': 0, 'CRYPTO': 0, 'REFLECTION': 0} APK {'DEX': 0, 'EXECUTABLE': 0, 'ZIP': 0, 'SHELL_SCRIPT': 0, 'APK': 0, 'SHARED LIBRARIES': 0} PERM {'PRIVACY': 6, 'NORMAL': 2, 'MONEY': 0, 'INTERNET': 2, 'SMS': 0, 'DANGEROUS': 10, 'SIGNATUREORSYSTEM': 0, 'CALL': 0, 'SIGNATURE': 0, 'GPS': 0} FuzzyRisk VALUE 50.0 ../ApkForTest/5aff5198c2fe5798bd7f1519dab0cd4ee737d5d2.apk RedFlags DEX {'NATIVE': 0, 'DYNAMIC': 1, 'CRYPTO': 0, 'REFLECTION': 1} APK {'DEX': 0, 'EXECUTABLE': 0, 'ZIP': 0, 'SHELL_SCRIPT': 0, 'APK': 0, 'SHARED LIBRARIES': 0} PERM {'PRIVACY': 3, 'NORMAL': 1, 'MONEY': 0, 'INTERNET': 1, 'SMS': 0, 'DANGEROUS': 8, 'SIGNATUREORSYSTEM': 0, 'CALL': 0, 'SIGNATURE': 0, 'GPS': 0} FuzzyRisk VALUE 86.6666666667
androlyze.py
androlyze.py与其它的py文件不一样,它不是单一功能的脚本,而是一个强大的静态分析工具,它提供的一个独立的Shell环境来辅助分析人员执行分析工做。
在终端提示符下执行“./androlyze.py -s”会进入androlyze 的Shell交互环境,分析人员能够在其中执行不一样的命令,来知足不一样状况下的分析需求。androlyze.py经过访问对象的字段与方法的方式来提供反馈结果,分析过程当中可能会用到3个对象:apk文件对象、dex文件对象、分析结果对象。这3个对象是经过androlyze.py的Shell环境(如下简称Shell环境)来获取的。在Shell环境下执行如下命令:
也能够用一条命令:
a, d, dx = AnalyzeAPK("./crackme0502.apk", decompiler="dad")
其余的几个命令就再也不一一说明了,尝试几回就都会了。
另外要提一下androlyze的-x参数能够查看应用申请的权限都在哪里使用了,就像x参数的说明同样:show paths of permissions
androguard实现原理分析
静态分析的目标无非是以下几点,APK文件列表,Manifest文件,dex文件,二进制文件,资源文件,权限,四大组件,敏感API,尤为是LoadLibrary,dexClassLoader,Reflection等。
androguard第一步是对APK,dex以及class等类型的文件反向工程。实际上我没有找到究竟是哪里调用的,还在挖掘中..
整个androguard项目结构中看,第一曾目录下的全部py文件都是能够直接使用的工具,这些工具所调用的基础功能实如今androguard目录下,主要在core下,其余目录主要是测试、示例和支持的功能。
考虑APK的结构,能够看做一种层级结构,APK中含有各类文件,dex文件中包含多个类,每一个类有包含多个方法,这样从上往下是一种树状结构,每一层均可以用一个类来表示。
其中androgen.py中的Androguard是顶层的对象,在analysis.py中进行大量的处理,最终能够方便的从一个APK对象找到其下的类,再找到全部的方法,经过方法也能够找到它所属的类,使得一个APK文件和一个相关联系的类系统对应起来。
有了APK文件全部能够读取到的信息,剩下的工做就相对容易一些。
要得到程序的权限,只须要调用接口将已经保存好的权限信息输出。想检测APK是否有调用本地方法,动态加载和反射的动做,只须要检查方法里是否有LoadLibrary,dexClassLoader,Reflection这些。
生成调用的图的部分还没彻底看懂,初步的浏览代码看到扫描反编译后方法里的语句,若是有调用其余方法,则被调用的方法就看做原方法的孩子,就会有一条边相连,其中androdd.py、androgexf.py和androxgmml.py生成的图也不尽相同,主要是结点选择和边选择的层次粒度不想通,例如androdd.py将方法做为一个单元,考虑其中语句的控制流,好比invoke和if之类的语句对程序流程形成的影响,而androgexf.py将APK看做一个总体,将方法之间的调用关系看做边,androxgmml.py没有太多关注,好像粒度细到每条dalvik指令,所以结点数也至关的多。
风险评估的功能从输出就能够看出些端倪,风险值的计算在risk.py文件中,评估的依据是权限、API和文件,为权限自己的dangerous, signatureOrSystem, signature和normal四种类型分配不一样的威胁值,同时将权限映射为资费,联网,短信,电话,隐私相关的几种类型,分配不一样的威胁值,对部分API以及二进制文件,共享库文件等作相似处理,最后整合计算出威胁值。我认为这种方法是静态检测中的经常使用方法,但实际效果上看有静态检测自己的局限性,会有比较大的偏差。
总结:
总得来讲,我以为androguard是一款不错的静态分析工具,几乎覆盖了全部静态分析的基础工做,能够方便的获取静态分析须要的信息,这受益于将APK文件转换为python的设计思想。另外将反向工程的部分信息可视化也对应用分析带来很大的帮助,恶意程序检测和风险分析也是锦上添花的一笔。此工具中,保存恶意方法的签名信息是一个很好的思路,不少时候一段恶意代码重打包添加进不一样的应用程序中,此时若是保存方法的签名信息并据此检测目标程序,会将全部包含了这段方法的代码检测出来,还能检测出将来出现的添加此段代码的恶意程序,若是用程序签名的话就必须保存全部被添加恶意代码的程序,并且对将来出现的程序没有抵抗力,这点给了我启发。
androguard还不够完善的地方是安装过程有些复杂,花费时间略长,这也和我不太熟悉python有关,另外程序有些地方还有bug。可是瑕不掩瑜,若是能熟练运用,能够在APK分析中更驾轻就熟。