使用androguard对APK进行静态分析
androguard commands:
analyze Open a IPython Shell and start reverse engineering.
apkid Return the packageName/versionCode/versionName per APK as...
arsc Decode resources.arsc either directly from a given file or...
axml Parse the AndroidManifest.xml.
cg Create a call graph and export it into a graph format.
decompile Decompile an APK and create Control Flow Graphs.
disassemble Disassemble Dalvik Code with size SIZE starting from an...
gui Androguard GUI
sign Return the fingerprint(s) of all certificates inside an APK.
使用 androguard analyze
命令可以分析 APK 文件。将启动一个 IPython shell,并加载多个依赖模块。
文档中给出使用说明:
$ androguard analyze
Androguard version 3.1.1 started
In [1]: a, d, dx = AnalyzeAPK("examples/android/abcore/app-prod-debug.apk")
# Depending on the size of the APK, this might take a while...
该命令中包含三个对象,分别为 a, d 以及 dx。其中,
a:表示 APK 对象,在其中可以找到有关 APK 的信息,例如包名、权限、AndroidManifest.xml、resources。
AndroidManifest.xml:每一个 Android 项目的根目录下都包含一个 Manifest 文件 AndroidManifest.xml,它是 XML 格式的 Android 程序声明文件。其中包含 Android 系统运行程序前所必须掌握的重要信息,例如应用程序名称、图标、包名称、模块组成、授权和 SDK 最低版本等。
d:表示 DalvikVMFormat 对象数组,DalvikVMFormat 对应 apk 文件中的 dex 文件,从 dex 文件中我们可以获取类、方法和字符串。
dex 是 Android 平台上( Dalvik 虚拟机)的可执行文件,相当于 Windows 平台中的 exe 文件,每个 Apk 安装包中都有 dex 文件,里面包含了该 app 的所有源码,通过反编译工具可以获取到相应的 java 源码。
dx:表示 Analysis 对象,其包含链接了关于 classes.dex 信息的特殊的类,甚至可以一次处理许多 dex 文件。
androlyze 的作用是提供一个交互环境,方便分析人员静态分析 Android 应用程序。这里我下载了一个腾讯会议的 APK 进行实验。当成功使用 androlyze APK
的命令加载 APK 程序后,可以使用 tab
键补全的方式获取 APK 的信息。
首先要对上述三个对象进行初始化
ubuntu@ubuntu:~$ androlyze
Androguard version 3.4.0a1 started
In [1]: a = APK("/home/ubuntu/Desktop/meeting.apk")
# APK 对象
In [2]: d = DalvikVMFormat(a.get_dex())
# dex 对象
In [3]: dx = Analysis(d)
# analysis 对象
获取 APK 权限
In [4]: a.get_permissions()
Out[4]:
['com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE',
'android.permission.REQUEST_INSTALL_PACKAGES',
'android.permission.MODIFY_AUDIO_SETTINGS',
'android.permission.CALL_PHONE',
'com.meizu.c2dm.permission.RECEIVE',
'com.tencent.wemeet.app.push.permission.MESSAGE',
'android.permission.RESTART_PACKAGES',
'android.permission.CHANGE_NETWORK_STATE',
'android.permission.ACCESS_NETWORK_STATE',
'com.tencent.wemeet.app.permission.C2D_MESSAGE',
'android.permission.READ_PHONE_STATE',
'android.permission.RECORD_AUDIO',
'com.tencent.wemeet.app.permission.XGPUSH_RECEIVE',
'com.coloros.mcs.permission.RECIEVE_MCS_MESSAGE',
'com.meizu.flyme.push.permission.RECEIVE',
'android.permission.WAKE_LOCK',
'android.permission.GET_TASKS',
'android.permission.VIBRATE',
'com.heytap.mcs.permission.RECIEVE_MCS_MESSAGE',
'android.permission.FOREGROUND_SERVICE',
'com.tencent.wemeet.app.permission.MIPUSH_RECEIVE',
'android.permission.READ_LOGS',
'android.permission.WRITE_EXTERNAL_STORAGE',
'android.permission.CAMERA',
'android.permission.RECEIVE_USER_PRESENT',
'android.permission.SYSTEM_ALERT_WINDOW',
'android.permission.ACCESS_WIFI_STATE',
'android.permission.READ_EXTERNAL_STORAGE',
'android.permission.BLUETOOTH',
'android.permission.INTERNET']
获取 AndroidManifest.xml 中定义的所有 activites
In [5]: a.get_activities()
Out[5]:
# 此处省略输出
获取包名、app名、图标地址
In [6]: a.get_package()
Out[6]: 'com.tencent.wemeet.app'
In [7]: a.get_app_name()
Out[7]: '腾讯会议'
In [8]: a.get_app_icon()
Out[8]: 'r/f/ic_logo.png'
获取版本信息,以及最小,最大,目标和有效的 SDK 版本
In [9]: a.get_androidversion_code()
Out[9]: '2020053113'
In [10]: a.get_androidversion_name()
Out[10]: '1.5.6.405'
In [11]: a.get_min_sdk_version()
Out[11]: '19'
In [12]: a.get_max_sdk_version()
In [13]: a.get_effective_target_sdk_version()
Out[13]: 28
In [14]: a.get_target_sdk_version()
Out[14]: '28'
获取 AndroidManifest.xml 的解码 XML
In [15]: a.get_android_manifest_axml().get_xml()
Out[15]: # 此处省略输出
androguard.core.analysis.analysis.Analysis
对象中包含所有关于一个或多个 dex 文件的类、方法、字段和字符串信息,并且可以获取这些信息的调用图和 XREF,即可以通过该功能了解应用的具体 API 调用、创建图来理清不同类之间的依赖关系。
从 Analysis 获取所有的类信息
In [24]: dx.get_classes()
Out[24]: dict_values([<analysis.ClassAnalysis Lcom/example/helloworld/BuildConfig;>, <analysis.ClassAnalysis Lcom/example/helloworld/R$attr;>, <analysis.ClassAnalysis Lcom/example/helloworld/R