Androguard 中提供的每个工具都是一个独立的py文件,我以上一节中的crackme0502.apk 与破解后的 crackme0502_cracked.apk 为例,来讲解它们的使用方法。
androapkinfo.py
androapkinfo.py用来查看apk文件的信息。该工具会输入apk文件的包、资源、权限、组件、方法等信息,输出的内容比较详细,建议使用时将输出信息重定向到文件后再进行查看。使用方法:
./androapkinfo.py -i ./crackme0502.apk
命令执行后输出信息如下。
./androapkinfo.py -i ./crackme0502.apk
crackme0502.apk :
FILES:
res/layout/activity_main.xml Android's binary XML -51d837ba
res/menu/activity_main.xml Android's binary XML 2471e50a
AndroidManifest.xml Android's binary XML b5b7132
resources.arsc data 2a26ed7f
res/drawable-hdpi/ic_action_search.png PNG image, 48 x 48, 8-bit colormap,
non-interlaced 64275be8
……
MAIN ACTIVITY: com.droider.crackme0502.MainActivity
ACTIVITIES: ['com.droider.crackme0502.MainActivity']
SERVICES: []
RECEIVERS: []
PROVIDERS: []
Native code: False
Dynamic code: False
Reflection code: True
……
Lcom/droider/crackme0502/MainActivity; <init> ['ANDROID', 'APP']
Lcom/droider/crackme0502/MainActivity; getAnnotations ['ANDROID', 'WIDGET']
Lcom/droider/crackme0502/MainActivity; onCreate ['ANDROID', 'WIDGET', 'APP']
Lcom/droider/crackme0502/MainActivity; onCreateOptionsMenu ['ANDROID',
'VIEW']
Lcom/droider/crackme0502/MyApp; <init> ['ANDROID', 'APP']
Lcom/droider/crackme0502/MyApp; onCreate ['ANDROID', 'OS', 'APP']
androaxml.py
androaxml.py用来解密apk包中的AndroidManifest.xml文件。使用方法:
./androaxml.py -i ./crackme0502.apk
输出结果如下。
./androaxml.py -i ./crackme0502.apk
<?xml version="1.0" ?>
<manifest android:versionCode="1" android:versionName="1.0"
package="com.droider.crackme0502"
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15">
</uses-sdk>
<application android:debuggable="true" android:icon="@7F020001"
android:label="@7F050000" android:name=".MyApp" android:theme=
"@7F060000">
<activity android:label="@7F050003" android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN">
</action>
<category android:name="android.intent.category.LAUNCHER">
</category>
</intent-filter>
</activity>
</application>
</manifest>
androcsign.py
androcsign.py用于添加apk文件的签名信息到一个数据库文件中。Androguard工具目录下的signatures/dbandroguard文件为收集的恶意软件信息数据库。在开始使用androcsign.py前需要为apk文件编写一个sign文件,这个文件采用json格式保存。下面是笔者编写的crackme0502.apk的sign文件crackme0502.sign 的内容:
[
{
"SAMPLE":"apks/crackme0502.apk"
},
{
"BASE":"AndroidOS",
"NAME":"DroidDream",
"SIGNATURE":[
{
"TYPE":"METHSIM",
"CN":"Lcom/droider/crackme0502/MainActivity$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目录,将crackme0502.apk复制进去,然后将 crackme- 0502.sign文件复制到Androguard的signatures目录下,在终端提示符下执行下面的命令:
./androcsign.py -i signatures/crackme0502.sign -o signatures/dbandroguard
命令执行后crackme0502.apk的信息就存入dbandroguard数据库了,输出信息如图5-11 所示。
androdd.py
androdd.py 用来生成apk文件中每个类的方法的调用流程图。使用方法:
./androdd.py -i ./crackme0502.apk -o ./out -d -f PNG
这里需要使用-o选项强制指定一个输入目录,-d指定生成dot图形文件,-f用来指定输出的图片格式,可以是PNG 或JPG 。不过在笔者的 Ubuntu 10.04上,该工具并没有很好的工作。
androdiff.py
androdiff.py用来比较两个apk文件的差异。使用方法如下:
./androdiff.py -i ./crackme0502.apk ./crackme0502_cracked.apk
命令执行后输出结果如下。
./androdiff.py -i ./crackme0502.apk ./crackme0502_cracked.apk
……
[ ('Lcom/droider/crackme0502/MainActivity$2;', 'onClick',
'(Landroid/view/View;)V') ]
<-> [ ('Lcom/droider/crackme0502/MainActivity$2;', 'onClick',
'(Landroid/view/View;)V') ]
onClick-BB@0x0 onClick-BB@0x0
Added Elements(1)
0x32 12 if-nez v2, +15
Deleted Elements(1)
0x32 12 if-eqz v2, +15
Elements:
IDENTICAL: 3
SIMILAR: 1
NEW: 0
DELETED: 0
SKIPPED: 0
NEW METHODS
DELETED METHODS
通过结果可以发现,androdiff分析出了两个apk之间的差异,MainActivity$2类的 onClick()方法中有一行代码不同。
androdump.py
androdump.py 用来dump一个Linux进程的信息。使用方法如下。
./androdump.py –i pid
pid 为一个Linux 进程的ID,该工具使用的时候较少,这里就不做介绍了。
androgexf.py
androgexf.py用来生成APK的GEXF格式的图形文件。该文件可以使用Gephi查看。使用方法:
./androgexf.py -i ./crackme0502.apk -o ./crackme0502.gexf
命令执行完后会在crackme0502.apk目录下生成crackme0502.gexf,gexf 是图形数据文
件,可以使用 Gephi打开,关于 Gephi的详细使用方法将在下一小节介绍。crackme0502.gexf打开后效果如图5-12所示(Windows 版本的Gephi)。
androlyze.py
androlyze.py提供了一个交互环境方便分析人员静态分析Android程序,该工具的功能非常强大,而且涉及的内容较多,详细的用法将在5.7.4小节介绍。
andromercury.py
andromercury.py是Mercury工具的框架。 功能上是对Mercury的包装,Mercury需要的Python 版本为2.7,此处不展示该工具,Mercury工具的详细使用方法会在本书的第11 章进行介绍。
androrisk.py
androrisk.py用于评估apk文件中潜在的风险。使用方法如下。
./androrisk.py -m -i ./crackme0502.apk
-m选项表明需要分析apk中的每一个方法,命令执行后效果如图5-13所示。
从输出结果来看,crackme0502.apk中没有发现风险,唯独有一项REFLECTION的值为1,表示程序中有使用到Java反射技术。
androsign.py
androsign.py用于检测apk的信息是否存在于特定的数据库中,它的作用与androcsign.py恰好相反。使用方法:
./androsign.py –i apks/crackme0502.apk -b signatures/dbandroguard -c signatures/dbconfig
androsim.py
androsim.py用于计算两个apk文件的相似度,它是唯一一个有Windows移植版的工具,Windows平台上该工具为androsim.exe,使用方法为:
./androsim.py -i ./crackme0502.apk ./crackme0502_cracked.apk
命令执行后输出结果如下。
Elements:
IDENTICAL: 717
SIMILAR: 1
NEW: 0
DELETED: 0
SKIPPED: 0
--> methods: 99.983498% of similarities
可以看到两个程序的相似度为99.983498%。
androxgmml.py
androxgmml.py用来生成apk/jar/class/dex文件的控制流程及功能调用图,输出格式为xgmml 。使用方法如下。
./androxgmml.py -i ./crackme0502.apk -o crackme0502.xgmml
不过很可惜的是,目前不管是在Ubuntu 10.04,还是Ubuntu 12.04上使用该功能,都会运行错误,并输出以下错误提示:
AttributeError: DVMBasicBlock instance has no attribute 'get_ins'
后者笔者发现这是Androguard的一个bug,截止到笔者编写完本章,该bug都还没出解决方案。
apkviewer.py
apkviewer.py用来为apk文件中每一个类生成一个独立的graphml图形文件,使用方法如下。
./apkviewer.py -i ./crackme0502.apk -o output
命令执行完后,可以使用 Gephi打开生成后的graphml文件,不过图形中的每个节点是指令级别的,在查看时效果没有方法级别的gexf文件直观。