使用androguard中的androlyze.py进行android逆向工程分析

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所示。

使用androguard中的androlyze.py进行android逆向工程分析_第1张图片
 

接下来是分析结果对象的获取,执行以下命令。

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 文件的反编译器。

使用androguard中的androlyze.py进行android逆向工程分析_第2张图片
 

在获得这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所示。

使用androguard中的androlyze.py进行android逆向工程分析_第3张图片
 

在代码的最下面,有如下一段内容。
########## 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 在兼容性与稳定性方面有待加强。

你可能感兴趣的:(使用androguard中的androlyze.py进行android逆向工程分析)