Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >软件测试|解析 apk 基本信息和方法调用

软件测试|解析 apk 基本信息和方法调用

原创
作者头像
霍格沃兹测试开发Muller老师
发布于 2023-01-09 10:17:35
发布于 2023-01-09 10:17:35
7550
举报

Android 开发中, 我们很少使用 Android 逆向去分析 apk 文件的, 但是作为一个测试人员,我们要对这个 apk 文件进行一系列的分析,审核,测试。这篇文章讲解如何解析一个 apk 文件,主要从下面几方面介绍:

● 解析前准备环境介绍

● 解析出 apk 的一些基本信息

● 解析出方法调用图

01

解析前环境介绍

使用语言:python

使用的python库:androguard

本章使用的apk文件:自己编写一个apk,apk文件最好不要混淆

我们先对 APK 文件进行一些简单的介绍

我们解压一个 apk 文件,解压后的目录如上图所示

● META-INF目录

信息描述,签名等用途。

● res 目录

工程的资源文件,以主工程为主,其他文件(jar包)会合并到该目录下;但values文件将不会出现在此目录下,因为已经将其编译到resource.arsc文件中;raw文件会保持原有内容不会被编译。

● resources.arsc

编译后的二进制资源文件, 在网上查了说,很多做汉化补丁就是修改这个资源包进行汉化的。

● classes.dex

虚拟机执行的文件

● AndroidManifest.xml

清仓文件

代码语言:txt
AI代码解释
复制
def unzip_file(zip_src, dst_dir):
    print(dst_dir)
    r = zipfile.is_zipfile(zip_src)
    if r:
        fz = zipfile.ZipFile(zip_src, 'r')
        for file in fz.namelist():
        fz.extract(file, dst_dir)
        searchDirFile(dst_dir)
    else:
        print('This is not zip')

02

解析APK的一些基本信息

代码语言:txt
AI代码解释
复制
from androguard.misc import AnalyzeAPK
apk, dex, dx = AnalyzeAPK(filePath)

这三个对象对应的类别是:下面会分别介绍

代码语言:txt
AI代码解释
复制
androguard.core.bytecodes.apk.APK
代码语言:txt
AI代码解释
复制
androguard.core.bytecodes.dvm.DalvikVMFormat
代码语言:txt
AI代码解释
复制
androguard.core.analysis.analysis.Analysis

这个 apk 文件对象,其实就是读取 AndroidManifest.xml 文件, 了解过Android 的程序员应该知道,这个文件中就是清仓文件, 我们申请一些权限,注册 Activity, Service, Broadcast,ContentProvader 都在清仓文件中申请。

特别注意

我们一般在编写代码的时候,有一些注册文件可能只注册了,但是没有实际的实现,我们在编译项目的时候,这些文件注册虽然会报错,但是不影响编译,运行的时候也不会报错,所以apk只是单纯的读取AndroidManifest.xml 文件,并不会验证读取文件的有效性。解决方法我们下面在具体介绍。

代码语言:txt
AI代码解释
复制
permissions = apk.get_permissions() # APK 获取权限信息
activities = apk.get_activities()   # APK 全部的 activity
service = apk.get_services()        # APK 全部的 service
receiver = apk.get_receivers()      # APK 全部的 广播
provider = apk.get_providers()      # APK 全部的 providers
packagename = apk.get_package()     # 获取当前 APK 的名字
appname = apk.get_app_name()        # 获取当前 appName

03

解析出方法调用图

有兴趣可以参考

代码语言:txt
AI代码解释
复制
https://www.jianshu.com/p/c753184ac90c 

我们可以使用 dex 对象, 获取文件中所有类的,所有方法,所有的成员变量和字符串。注意, 这边获取的 dex 对象是一个 list

看起来很完美了,也可以解决我们上面提到的问题。但是和我们最终目标还有有点远,就是获取的方法调用图。我们最后一个 dx 即将登场。

代码语言:txt
AI代码解释
复制
classAnalysis = dx.classes['Lcom/example/songzekun/myapplication/MainActivity;']
    for meth in classAnalysis.get_methods():
        for _, call, _ in meth.get_xref_from():
            print("from -> {} -- {}".format(call.class_name, call.name))
        for _, call, _ in meth.get_xref_to():
            print("to -> {} -- {}".format(call.class_name, call.name))

from 是方法的调用来源, to 是当前方法中执行了那些方法, 我们可以根据这样的关系, 来构建整个应用的类,方法之间的调用图。

当然你还需要对一些 api 的方法进行一些过滤。下面代码是我对一些基本信息的过滤,过滤结束后,就是我们真正实现的方法。

代码语言:txt
AI代码解释
复制
# 我们排除一下
def screenClass(packagename, activities, service, receiver, provider):
    packagename = packagename.replace('.', '/')
    classAnalysis = dx.get_internal_classes()
    className = []
    activityName = []
    serviceName = []
    receiverName = []
    providerName = []
    for item in classAnalysis:
        if packagename in item.name:
           className.append(item.name)
    for item in activities:
        item = changeClass(item)
        if item in className:
            activityName.append(item)
    for server in service:
        item = changeClass(item)
        if server in className:
            serviceName.append(server)
    for rece in receiver:
        item = changeClass(item)
        if rece in className:
            receiverName.append(rece)
    for pro in provider:
        item = changeClass(item)
        if pro in className:
            providerName.append(pro)
    return className, activityName, serviceName, receiverName, providerName

04

总结

到这里,我也介绍完毕,总体说来,就是apk的静态扫描技术,我个人就以这些技术做一些应用场景,欢迎大家留言讨论。

APK 代码结构展示

精准测试用例推荐

APK上架自动检测

根据 APK 文件直接提取代码特征,应用特征,对当前的APK 做分类(比如一些木马病毒的的APK), 对APK进行风险评估, 也可以作APK错误扫描,崩溃预测,敏感权限申请等等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
插件化框架android-pluginmgr全解析
阅读须知:阅读本文的童鞋最好是有过插件化框架使用经历或者对插件化框架有过了解的。前方高能,大牛绕道。
俞其荣
2022/07/28
1.3K0
插件化框架android-pluginmgr全解析
如何读取APK的Activity(Python实现)
adb是我们日常工作每天都会接触的,也是最简单有效。通过adb命令我们可以查看当前手机内应用的包名和Activity信息。常用的命令例如:
用户5521279
2020/05/08
2.9K0
Android逆向分析(2) APK的打包与安装背后的故事
前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之
xiangzhihong
2018/02/01
3.2K0
Android逆向分析(2) APK的打包与安装背后的故事
编译apk遇到的问题记录
其中,文件名.tar.gz是你要解压的.tar.gz文件的名称。解压命令选项的含义如下:
天天Lotay
2023/10/15
3040
【Android 安全】Android 应用 APK 加固总结 ( 加固原理 | 应用加固完整的实现方案 | 源码资源 )
需要交叉编译 OpenSSL 得到 libcrypto.a 静态库 , 在应用中使用该静态库进行解码操作 ;
韩曙亮
2023/03/29
9.1K1
【Android 安全】Android 应用 APK 加固总结 ( 加固原理 | 应用加固完整的实现方案 | 源码资源 )
Activity插件化解决方案
2.最简单的插件化方案就是在宿主的androidmanifest.xml中申明插件中的四大组件
用户3112896
2019/09/26
6190
APK安装流程详解9——PackageParser解析APK(上)
为了让咱们更好的理解谷歌的安卓团队对PackageParser的定位,我们来看下PackageParser的注释
隔壁老李头
2018/08/30
6.2K0
APK安装流程详解9——PackageParser解析APK(上)
.net core 从(本地)服务器获取APK文件并解析APK信息
注:此段代码解析APK时,若APK包含中文会极其的卡顿,建议上传前先用Npinyin重命名再次上传,至于原因已提交GitHub,暂未得到回复,所以先自己重命名再上传吧
GoodTime
2023/10/31
6130
Android插件化技术之旅 2-广播插件的实现与安装apk原理
微信公众号:Android研究院 关注可了解更多的Android知识,专注于移动领域,不止代码还有人生的哲学。 问题或建议,请公众号留言; 如果你觉得文章对你有帮助,欢迎赞赏[1] 前言插件中动态广播
用户3045442
2019/01/09
6990
Qigsaw源码之Gradle插件解析
Android App Bundle 是Android新推出的一种官方发布格式.aab,可让您以更高效的方式开发和发布应用。借助 Android App Bundle,您可以更轻松地以更小的应用提供优质的使用体验,从而提升安装成功率并减少卸载量。转换过程轻松便捷。您无需重构代码即可开始获享较小应用的优势。改用这种格式后,您可以体验模块化应用开发和可自定义功能交付,并从中受益(PS:必须依赖于GooglePlay)。
静默加载
2021/01/25
9650
Qigsaw源码之Gradle插件解析
APK安装流程详解8——PackageManagerService的启动流程(下)
那我们就来看下scanPackageLI(PackageParser.Package, int, int, long, UserHandle)方法
隔壁老李头
2018/08/30
2.7K0
APK安装流程详解10——PackageParser解析APK(下)
其中第一个parseBaseApk(File, AssetManager, int)方法,已经讲解过了,请参考APK安装流程详解9——PackageParser解析APK(上)中 五、PackageParse#parseMonolithicPackage(File, int)方法解析
隔壁老李头
2018/08/30
5.1K0
APK安装流程详解10——PackageParser解析APK(下)
android PakageManagerService启动流程分析
PakageManagerService的启动流程图 1.PakageManagerService概述 PakageManagerService是android系统中一个核心的服务,它负责系统中Package的管理,应该程序的安装、卸载等。后面PakageManagerService简称PMS。 2.SystemServer启动PackageManagerService 我之前的ATA文章有说到,SystemServer进程是Zygote孵化出的第一个进程,该进程主要的工作是启动a
xiangzhihong
2018/02/05
2.6K0
android PakageManagerService启动流程分析
Dynamic-Load-Apk源码解析
趁着今天是周末,无所事事,来讲讲 Dynamic-Load-Apk 框架。Dynamic-Load-Apk 是任主席主导开发的一款插件化框架,其中心思想主要就是两个字——代理。和我之前分析的 android-pluginmgr 插件化框架不同的是,Dynamic-Load-Apk 框架完全基于在应用层上实现,并不依靠 ActivityThread 、Instrumentation 等。另外,Dynamic-Load-Apk 框架在插件化发展历程中诞生较早,对后来不断涌现的插件化框架具有深刻的指导意义。
俞其荣
2022/07/28
4800
Dynamic-Load-Apk源码解析
QT4A重打包实现原理
重打包是一种将非产品代码静态插入到安装包中,从而实现注入测试代码的能力。这种技术可以用于非root手机上无法利用ptrace动态注入被测进程的场景。
drunkdream
2020/01/02
1.1K0
Android插件化基础1-----加载SD上APK
大致的意思是: ClassLoader 是一个负责加载classes的对象,ClassLoader类是一个抽象类,需要给出类的二进制名称,ClassLoader尝试定位或者产生一个class数据,一个典型的策略是把二进制名字转换成文件名然后到文件系统中找到该文件 以下是ClassLoader常用到的几个方法及其重载方法:
隔壁老李头
2018/08/30
1.2K0
Android插件化基础1-----加载SD上APK
从构建工具看 Android APK 编译打包流程
在Android Studio中,我们几乎每天都在用run,generate APK等功能。
码上积木
2021/04/16
4.4K0
Android逆向笔记 —— DEX 文件格式解析
系列第一篇文章就分析过 Class 文件格式,我们都知道 .java 源文件经过编译器编译会生成 JVM 可识别的 .class 文件。在 Android 中,不管是 Dalvik 还是 Art,和 JVM 的区别还是很大的。Android 系统并不直接使用 Class 文件,而是将所有的 Class 文件聚合打包成 DEX 文件,DEX 文件相比单个单个的 Class 文件更加紧凑,可以直接在 Android Runtime 下执行。
路遥TM
2021/08/31
1.6K0
Android 插件化原理解析——插件加载机制
上文 Activity生命周期管理 中我们地完成了『启动没有在AndroidManifest.xml中显式声明的Activity』的任务;通过Hook AMS和拦截ActivityThread中H类对于组件调度我们成功地绕过了AndroidMAnifest.xml的限制。
weishu
2018/09/05
1.8K0
Android 插件化原理解析——插件加载机制
APK安装流程详解6——PackageManagerService启动前奏
由于在后面讲解PackageManager流程启动的时候会 涉及到Setting类,我们就先预热下 Settings.java源码地址
隔壁老李头
2018/08/30
2.3K0
APK安装流程详解6——PackageManagerService启动前奏
推荐阅读
相关推荐
插件化框架android-pluginmgr全解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档