原创文章,转载请注明出处,谢谢。

Android应用程序分析主要有静态分析和动态分析两种,常见的静态分析工具是Apktool、dex2jar以及jdgui。今天突然主要到Google code上有个叫做androguard的工具,提供了一系列的Apk以及dex、odex、arsc等文件的分析处理功能。很值得学习和分析。

androguard项目主页:http://code.google.com/p/androguard/

androguard是基于python的,将Apk文件中的dex文件,类,方法等都映射为python的对象,项目主页介绍了androgurad的特性,简单来说,androguard提供了apk文件的反向工程,恶意软件检测和威胁评估,还有程序行为可视化。功能相当丰富,是分析apk的好帮手。

androguard的部署配置

androguard是基于python的,所以无论windows,linux还是mac os,只要能运行python的都可以运行androguard。

我的软件环境是Ubuntu12.04 64位、java 1.6、 python 2.7.

androguard的安装可以参考Wiki,我基本按照这个步骤进行,有些地方是需要注意的。

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.

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":""
}
]

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-:~/DevTools/androguard-1.9# ./androrisk.py -d ../ApkForTest/
../ApkForTest/8f7bf37face686ac456c21dc1dad132f077ce626.apk
RedFlags
DEX {'NATIVE': , 'DYNAMIC': , 'CRYPTO': , 'REFLECTION': }
APK {'DEX': , 'EXECUTABLE': , 'ZIP': , 'SHELL_SCRIPT': , 'APK': , 'SHARED LIBRARIES': }
PERM {'PRIVACY': , 'NORMAL': , 'MONEY': , 'INTERNET': , 'SMS': , 'DANGEROUS': , 'SIGNATUREORSYSTEM': , 'CALL': , 'SIGNATURE': , 'GPS': }
FuzzyRisk
VALUE 50.0
../ApkForTest/5aff5198c2fe5798bd7f1519dab0cd4ee737d5d2.apk
RedFlags
DEX {'NATIVE': , 'DYNAMIC': , 'CRYPTO': , 'REFLECTION': }
APK {'DEX': , 'EXECUTABLE': , 'ZIP': , 'SHELL_SCRIPT': , 'APK': , 'SHARED LIBRARIES': }
PERM {'PRIVACY': , 'NORMAL': , 'MONEY': , 'INTERNET': , 'SMS': , 'DANGEROUS': , 'SIGNATUREORSYSTEM': , 'CALL': , 'SIGNATURE': , 'GPS': }
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分析中更得心应手。

Android平台APK分析工具包androguard的部署使用和原理分析的更多相关文章

  1. cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程)

    链接地址:http://www.cocoachina.com/bbs/read.php?tid=333937 cocos2d-x3.9利用cocos引擎一键打包Android平台APK(C++小白教程 ...

  2. Cocos2d-x 3.2 学习笔记(四)学习打包Android平台APK!

    从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! (涉及到3.1.1版本的,请自动对应3.2版本,3.x版本的环境搭建都是一样的) ...

  3. Cocos2d-x 3.2 打包Android平台APK

    (转自:http://www.cnblogs.com/Richard-Core/p/3855130.html) 从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭 ...

  4. 详细解释如何通过Android自带的方式来实现图片的裁剪——原理分析+解决方案

    我们很多时候需要进行图片的裁剪,其实这个功能在android系统中已经有一套解决方案了,虽然界面和效果并不是很优秀但功能毫无疑问是完美实现了.至于,不用自带的方案怎么做自定义,这个就是后话了.本篇主要 ...

  5. Android 4.4 KitKat NotificationManagerService使用具体解释与原理分析(一)__使用具体解释

    概况 Android在4.3的版本号中(即API 18)增加了NotificationListenerService,依据SDK的描写叙述(AndroidDeveloper)能够知道,当系统收到新的通 ...

  6. Handler 原理分析和使用之HandlerThread

    前面已经提到过Handler的原理以及Handler的三种用法.这里做一个非常简单的一个总结: Handler 是跨线程的Message处理.负责把Message推送到MessageQueue和处理. ...

  7. 消息队列NetMQ 原理分析1-Context和ZObject

    前言 介绍 NetMQ是ZeroMQ的C#移植版本,它是对标准socket接口的扩展.它提供了一种异步消息队列,多消息模式,消息过滤(订阅),对多种传输协议的无缝访问. 当前有2个版本正在维护,版本3 ...

  8. 消息队列NetMQ 原理分析2-IO线程和完成端口

    消息队列NetMQ 原理分析2-IO线程和完成端口 前言 介绍 目的 IO线程 初始化IO线程 Proactor 启动Procator线程轮询 处理socket 获取超时时间 从完成端口获取处理完的状 ...

  9. 消息队列NetMQ 原理分析3-命令产生/处理和回收线程

    消息队列NetMQ 原理分析3-命令产生/处理和回收线程 前言 介绍 目的 命令 命令结构 命令产生 命令处理 创建Socket(SocketBase) 创建连接 创建绑定 回收线程 释放Socket ...

随机推荐

  1. 1.padding和margin,几种参数

    这篇会很短. 那么如上图所示,margin指的是外边距,padding指的是内边距,border自有其像素宽度,element在1335乘以392的地方. margin和padding一样总共有四个, ...

  2. HTML之学习笔记(六)添加链接

    html添加链接所用的标签为<a>标签 语法: 定义:从当前页面,跳转到指定页面或文件的一个标签            <a href="URL">热点文字 ...

  3. no data type for node

    java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.IdentNode  \-[IDE ...

  4. poj3308

    二分图的最小点权覆盖,选定点集,与该点集有关的边覆盖所有顶点,且该点集的点权值和最小. 有类似于匈牙利算法一样的带权匹配算法,但是这里就不介绍了.个人比较推荐,用最大流算法更好理解,写起来更容易. 题 ...

  5. zoj3229

    题目大意: 一个XX用n天要给m个女神拍写真.这n天里每个女神i分别至少要拍Gi张照片,XX在第j天会给指定Cj个女神最多拍Dj张照片,每个女神第j天拍照数在lj到hj张照片.问XX是否安排完成他的任 ...

  6. python自学笔记(一)简单了解python

    脚本解释型语言的内部机制 python先将脚本编译成字节码文件(pyc,pyo) python虚拟机解释并运行字节码文件 编译型语言的内部机制 先将源代码编译成机器码(机器能读懂的代码),生成可执行文 ...

  7. java selenium webdriver实战 应用小结

    部分api 1.访问网站 driver.get("http://www.baidu.com"); 或者 driver.navigate().to("http://www. ...

  8. 三种客户端访问wcf服务端的方法 C#

    原文 http://blog.csdn.net/zlj002/article/details/7914556 string jsonstr = String.Empty; string url = & ...

  9. elk 数据存储

    让我们在集群中唯一一个空节点上创建一个叫做blogs的索引,默认情况下,一个索引被分配5个主分片, 但是为了演示的目的, 我们只分配3个主分片和一个复制分片(每个主分片都有一个复制分片): PUT / ...

  10. [转] 使用SQL脚本查看表空间使用率和使用dba_tablespace_usage_metrics视图的差别

    传统的SQL脚本查看表空间使用率,使用的关键视DBA_DATA_FILE和DBA_FREE_SPACE. Oracle 11g引入了DBA_TABLESPACE_USAGE_METRICS视图.其实, ...