Androguard 工具包中的androlyze.py 与其它的py文件不同,它不是单一功能的脚本,而是一个强大的静态分析工具,它提供的一个独立的Shell环境来辅助分析人员执行分析 工作。
在终端提示符下执行“./androlyze.py -s ”会进入 androlyze 的Shell交互环境,分析人员可以在其中执行不同的命令,来满足不同情况下的分析需求。androlyze.py 通过访问对象的字段与方法的方式来提供反馈结果,分析过程中可能会用到3 个对象:apk 文件对象、dex文件对象、分析结果对象。这 3 个对象是通过 androlyze.py的Shell环境(以下简称 Shell环境)来获取的。首先是 apk 文件对象,以 5.2小节的 crackme0502.apk为例,在 Shell环境下执行以下命令:
a = APK("./crackme0502.apk")
APK()方法返回一个apk 文件对象,并赋值给 a 。androlyze.py的使用有一个技巧,就是在输入对象名后加上一个点“.”,然后按钮Tab键,终端提示符下显示该类所有的方法与字段,输入部分方法或字段名按Tab 键,终端提示符会补全提示。如图5-20 所示。
接着是dex 文件对象的获取,执行以下命令。
d = DalvikVMFormat(a.get_dex())
DalvikVMFormat()执行后会返回一个dex文件对象,它的可用方法如图5-21所示。
接下来是分析结果对象的获取,执行以下命令。
dx = VMAnalysis(d)
VMAnalysis() 执行返回后将分析结果对象赋给dx,dx可用的方法较少,如图5-22所示。
使用3条命令获取3个对象的方法比较麻烦,Shell环境下可以执行以下命令一次获取这3个对象。
a, d, dx = AnalyzeAPK("./crackme0502.apk", decompiler="dad")
AnalyzeAPK()一次性完成上面介绍的3个方法调用,其中decompiler指定反编译器的名称,Androguard 自带并且默认使用dad作为dex 文件的反编译器。
在获得这3个对象后,我们看看如何使用它们来分析Android程序。首先我们查看apk文件的信息,可以执行a.show() ,该命令执行后会输出apk压缩包中所有的文件信息。我们也可以执行a.files 命令获得相近的输出结果。还可以执行:
a.get_permissions() :输出apk 用到的全部权限。
a.get_providers() :输出程序中所有的Content Provider 。
a.get_receivers() :输出程序中所有的Broadcast Receiver 。
a.get_services():输出程序中所有的Service 。
……
其它的命令读者可以自己手动尝试运行一遍。接着是dex 文件对象。该对象保存了dex文件中所有的类、方法、字段的信息,这些信息都是以对象的方式进行提供的,而且都以d.CLASS_开头。例如“d.CLASS_Laaa_bbb_ccc”,表示 dex 文件中的 aaa.bbb.ccc 类。方法的名称是在类名称后添加以METHOD_开头的方法字符串,例如“d.CLASS_Laaa_bbb_ccc. METHOD_ddd _ Ljava_lang_StringV”,表示 aaa.bbb.ccc 类的“void ddd(String) ”方法。字段的名称是在类名称后添加以FIELD_开头的字段声明字符串,例如“d.CLASS_Laaa_bbb_ccc. FIELD_this_0 ”,表示aaa.bbb.ccc 类的this$0 字段。
按照上面的命名规则,我们查看MainActivity$2的OnClick()方法,执行以下命令。
d.CLASS_Lcom_droider_crackme0502_MainActivity_2.METHOD_onClick.pretty_show()
pretty_show() 用来显示onClick ()方法的代码,如图5-23所示。
在代码的最下面,有如下一段内容。
########## XREF
T: Lcom/droider/crackme0502/MainActivity; access$1
(Lcom/droider/crackme0502/MainActivity;)Landroid/widget/EditText; c
T: Lcom/droider/crackme0502/MainActivity$SNChecker; <init>
(Lcom/droider/crackme0502/MainActivity; Ljava/lang/String;)V 24
T: Lcom/droider/crackme0502/MainActivity$SNChecker; isRegistered ()Z 2a
####################
上面的代码为方法的交叉引用区,开头的字母 T 表示后面指定的方法被本方法引用,除此之外,它还可以是字母F,表示本方法被其它的方法所引用。
除了使用pretty_show() 显示反汇编代码外,还可以使用source()直接显示Java 源码,不过笔者本机并未测试成功。
最后是dx 对象,它可以实现字符串、字段、方法、包名的搜索,使用方法如下。
dx.tainted_variables.get_string(< 要搜索的字符串>)
show_Path(d, dx.tainted_packages.search_packages(<包名>))
这两个方法是Androguard 作者在wiki 页上公布的,笔者本机并未测试成功。
androlyze.py 的其它的功能笔者就不介绍了,读者可以自己动手多试。同时,从本节对Androguard 的使用介绍中可以看出,目前Androguard 在兼容性与稳定性方面有待加强。