使用androguard对APK进行静态分析

本文介绍如何利用Androguard进行APK静态分析,包括分析AndroidManifest.xml、dex文件和权限等关键信息。Androguard提供了交互式环境,通过分析对象a、d和dx,可以获取APP的权限、活动、包名、图标、SDK版本等,并能展示类、方法、字段的调用图,帮助理解应用的API调用和类依赖关系。
摘要由CSDN通过智能技术生成

使用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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值