APK静态分析工具androguard的部署使用和原理分析

今天突然主要到Google code上
【菜科解读】
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/muParserin elsim/elsign/libelsign/Makefile, add the appropriate include directory for muParser.h and python. Example:
CFLAGS += -I/usr/include/muParser -I/usr/include/python2.74. 进入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.6666666667androlyze.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")其他的几个命令就不再一一说明了,尝试几次就都会了。
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分析中更得心应手。
APK,静态,分析,工具,androguard,的,部署,使导致试管失败的原因试管婴儿反复移植失败原因分析
导致试管失败的原因是什么 原因有两点,第一是胚胎的质量,第二是胚胎的生存发育环境。
一起来温习一下我们之前讲过的关于宫寒的部分:窦卵泡就好像是种子,它必须要有足够的养分才能发育成为成熟的卵子。
所以在做试管的过程当中,有很多人一开始的卵泡数量很多,可是在促排的过程中却逐渐减少,这就是养分不足导致的问题。
比如在促排的过程中不小心感冒了,那么这时你身体里的养分就必须要分出一部分去跟白血球作战,因此卵泡就会成熟的非常慢,时间会拉长;又或者促排的过程中你非常的焦虑,导致睡眠不佳,紧张的吃不下饭,这样卵泡的成长也很慢。
那么到了试管取卵的阶段,能取出的卵子数量就变少了,而且品质也相对不够好。
那么这些品质不够好的卵子,经过受精后自然也很难成为优质的胚胎,就像先天品质不好的秧苗,也很难长成粒粒饱满的稻子一样,这也是为什么到了第五六天的优质囊胚就很少了的原因。
所以,很多人常常会发现自己有第二三天的品质不错的胚胎,但是这些胚胎却后继无力,无法发育成优质的囊胚,其实这很大原因是因为你的养分不足,这个最常发生在过瘦或过胖的病人身上,其实也就是代谢不良的人。
要知道当你的养分不足时,身体会把养分供给大脑肝脏心脏等重要器官,而不会供给你的生殖器官。
同理,在你的身体状态不好的时候,精子的生成也是不好的,这自然也会影响胚胎的质量以及正常比率。
我们常常看到有些先生,黑夜当白天过,烟不离手,做试管的时候胚胎异常比率很高。
所以在做试管之前夫妻双方都要先把自身的身体素质提高,保持适当的运动,健康的饮食和好的睡眠,这样才提高你的试管成功率。
那我们能不能在做试管之前就自我评估身体状态的好坏呢?当然可以,只要注意以下几点:1、你的排卵时间是正常或相对提早,而不是延迟;2、排卵后五到八天的孕酮比较高;3、经过锻炼后体重相对增长,但看起来却显瘦而不是变胖,因为我们长得是肌肉,这代表我们身体的养分比较足够;4、维持好的心态专注在如何吃好,睡好和运动上,而不是专注在思考和担忧或者焦虑上,因为思考过多,养分会被大脑用掉太多,这样会使你的内脏的养分包括肠胃的吸收,以及卵子的质量都会被影响。
情绪也非常的重要,尤其很多人试管反复失败之后,心理会产生重大的创伤,变得非常焦虑和没有安全感,这些不良情绪会让你的卵子品质下降,所以有很多人试管越做卵子越差,这可能也是不可忽视的原因之一。
WEP抓包WEP加密的破解原理的深入分析
呵呵,有兴趣的人可以看下去,没兴趣的人跳过吧。
前几天发过一个帖子,粗略讲了下WEP加密的破解原理。
可能很多人看的云里雾里。
最近几天因为忙着要准备考研,在复习线性代数和离散数学,学计算机的人都知道,这两门课是计算机的专业基础课,而很多密码学的知识都是建立的数学的基础上的,比如非常著名的非对称加密算法RSA就是建立在大素数分解难题上的。
这个不是我们今天要讨论的主题,呵呵,我主要讲的WEP加密的原理和为什么我们抓包就能破解,尽量讲的通俗易懂点。
WEP是链路层的安全机制(关于7层模型,有疑问的,大家自己去百度google)。
他的加密过程是这样的。
(1) 客户端计算原始数据包中明文数据(我们记做P)的32位CRC循环冗余校验码,实际上是计算整数检查向量(我们记做ICV),(又一堆专业术语,大家不理解没关系),这两个,也就是P和ICV构成我们要传输的数据(P+ICV),这才是需要加密的真正的明文。
(2) 我们用40位的密钥和24位的初始向量(IV)构成种子密钥(假设我们采用64位加密)。
输入到采用RC4算法的伪随机数发生器,生成与我们要传输的明文(P+ICV)等长的随机数,我喜欢把这个称作为真正的密钥(Real Key)。
我们输入的种子不同,生成的随机数也是不同的。
这个类似于现在很多软件都靠MD5散列来检验有没有被人篡改过。
又扯远了。
回到正题。
(3) 将我们得到的随机数和传输明文数据(P+ICV)按位进行异或操作(所谓异或操作,就是比较相同位上的数字,如果相同值为0,不同则为1),得到密文(我们记做C),然后将前面的24位初始向量和密文(C)组合在一起,得到要传输的密文(IV+C)。
解密的过程只是个简单的取反。
就是AP收到数据后,将得到的(IV+C),分解,提取IV,然后将自己所持有的密钥Key组合在一起,输入到采用RC4算法的伪随机数发生器,得到解密的随机数,实际上和加密的随机数是一样的。
然后将解密的随机数和密文(C)做异或操作,就得到了明文(P+ICV); 这么说也许大家看不懂,我觉得例子吧。
假设我们要传输的明文(P+ICV)= 0001101101 与之等长的随机数列(Real Key)= 0111011010 将这两个进行异或操作 得到密文C=0110110111解密过程就是将密文C和随机数列(Real Key)进行异或操作。
得到的就是明文(P+ICV); 接下来就是最最关键的,就是为什么我们能够破解WEP。
其实,产生Real Key的RC4算法本身就是有问题的,具体我就不讲了,涉及很复杂的数学知识,有兴趣的自己查资料。
我这里要讲的就是我们现在所使用的,就是抓包很多包来破解。
我们来讨论下24位的初始向量,因为这个在密文(IV+C)中是明文传输的,我们可以很方便的得到。
2的24次方是16777216。
我们现在使用的网络一般是54Mb/s,我们假设传输分组的大小为2000字节,实际比这小,我们计算下 54(Mb/s) / (2000B/包 * 8bits/B) = 3375 包/秒,也就说大概经过16777216 /3375=4971秒,也就是差不多1.3个小时,初始向量就要被全部用光了,就会出现重复。
呵呵,如果我们真的等一个多小时才抓到两个IV相同的包,那估计很多人会抓狂了,实际情况远比这个要好。
我上面讲的是IV初始为0,然后随着数据包的个数的增加,逐渐按模2的24次方递增,到24位全部用完时,IV又返回为0这么一种情况。
然后实际过程中,IV 是在[0,224-1]上随机取的值。
好吧,接下去就是概率的问题了(又是一门专业基础课概率论与数理统计),经过我的计算,在传输4823个数据包后,将会有50%的概率IV会相同,当发送12430个数据包时99%的概率会发生IV相同。
也就是4秒钟左右,就会发生IV相同的情况。
假设我们抓到两个IV相同的包(IV+C1)和(IV+C2),因为IV相同,40位的密钥也相同,所以他们产生的Real Key也相同。
那么我们可以将密文C1和密文C2进行异或操作,这个值和他们的明文异或操作时相同的。
这一点大家可以按照我上面的例子自己算下。
这样,如果我们抓到足够的包,也就是随着IV相同的密文数的增多,完全就可以分析出密钥和明文。
关于WEP协议,它犯了密码学中的大忌,就是避免使用线性运算。
这里CRC冗余算法和RC4都是线性运算。
至于为什么这么说,下次再说吧。
呵呵 WEP,抓包,加密,的,破解,原理,深入分析,知其然,