安全攻防
evening
安卓安全基础之四大组件剖析
2026-11-13
1 阅读
约10分钟阅读
先知社区
字号:
1 前言 最近准备看看安卓app测试,学习时发现除了web渗透的知识外,app还有独立的攻击面。网上的资料大多从四大组件讲起,但知识点较为分散,且案例较为古老。因此我借助AI编写了测试app,并按照从开发知识到漏洞原理的顺序,对每个组件进行了分析,争取让没接触过安卓的新人也能快速入门。 本文的主要目标: 1、介绍安卓项目的目录结构,Drozer的安装配置,logcat等前置知识 2、介绍Intent,分析Activity、Service、BroadcastReciever、ContentProvider这4个关键组件的作用,基本用法,漏洞类型 3、了解Drozer的用法 相关代码位置: https://github.com/1diot9/MyAndroidSecStudy/tree/main/ComponentsVulns https://github.com/1diot9/MyAndroidSecStudy/tree/main/Demo 漏洞apk可以让AI帮忙编译出来。 IDE使用 AndroidStudio2026.2.1。这里以java+gradle项目为例。手机使用mumu模拟器安卓12。sdk版本设置: 2 项目结构简介 app模块结构如下: cpp放C++文件,后续编译为so链接库,通过JNI调用。一般写加密函数或游戏引擎,也可能写业务代码。 java写控件代码和业务逻辑。现在很多项目也可能用kotlin。 keepRules用来写规则,对代码进行混淆或优化。 res目录放资源文件,activity视图布局文件activity_main.xml和字符串存储文件values/strings.xml等都在里面。 AndroidManifest.xml注册四大组件,一般把这个xml叫做清单,下面标签就代表注册了一个activity,所有静态组件都必须在清单文件中声明: intent-filter标签中,action为android.intent.action.MAIN所对应的类就是主入口类,一般为MainActivity。加壳后往往会变成S.h.e.l.l等壳入口类,可以用于初步判断apk是否加壳。 activity组件中还有个属性叫android:exported,这个属性决定组件是否导出,这也是很多漏洞存在的基础,后面会经常提到。 3 Drozer配置 Drozer的作用是模拟手机上的恶意应用,能够去调用其他app导出的组件。 windows端zip链接: https://github.com/1diot9/MyAndroidSecStudy/blob/main/drozer/drozer.zip 这个drozer已经让AI修复了输出中文时乱码的问题。 安卓apk: https://github.com/1diot9/MyAndroidSecStudy/blob/main/apks/drozer2.3.4.apk drozer分客户端和服务端,手机上安装的是服务端,电脑上安装的是客户端,两者通过adb通信。 打开手机上的drozer并启动服务后,进行端口转发: adb forward tcp:31415 tcp:31415 然后在电脑端drozer目录下找到drozer.bat文件,执行: drozer.bat console connect 执行help成功就是安装好了: 具体用法在后面复现漏洞时讲。 4 调试方法 最简单的是打印日志到logcat。logcat是安卓自带的日志系统。 在代码中用Log.d就能打印DEBUG级别的日志,第一个参数是TAG,用于筛选日志,第二个参数是实际日志内容: Log.d("VulnerableExportService", result); 5 其他前置知识 5.1 app的几个版本 在build.gradle.kts中有多个version。 上面的version代表编译apk时,用的是SDK37,也就是安卓17。 下面的minSdk和targetSdk分别代表app本身支持的最老安卓版本和目标安卓版本,这里分别是安卓10和安卓17。 这里尤其需要注意targetSdk,因为部分安全机制生效区分targetSdk和系统安卓版本。就是有些安全机制只有targetSdk足够高才生效,但有些安全机制只要系统版本够高就生效。 常见安卓版本的SDK的对照表: Android 版本 API 级别 (SDK 版本) 版本代号 (Codename) Android 16 36 Baklava Android 15 35 Vanilla Ice Cream Android 14 34 Upside Down Cake Android 13 33 Tiramisu Android 12L 32 Snow Cone v2 Android 12 31 Snow Cone Android 11 30 Red Velvet Cake Android 10 29 Quince Tart Android 9 28 Pie Android 8.1 27 Oreo Android 8.0 26 Oreo Android 7.1 25 Nougat Android 7.0 24 Nougat Android 6.0 23 Marshmallow Android 5.0 21 Lollipop 5.2 清单文件 AndroidManifest.xml称作清单文件,所有组件都要注册到清单中才会生效。 下图注册了一个入口Activity: 5.3 Shared Preference 案例项目中很多结果是通过LabStore这个类保存的,这个类实际上用SharedPreferences保存数据,简单介绍一下。 安卓的 SharedPreferences 是一种轻量级的数据存储方式,专门用于保存少量的键值对(Key-Value) 数据,例如用户的偏好设置、登录状态或游戏高分等。 它本质上是指向应用内部一个 XML 文件的接口,由系统框架管理,安卓7起仅可设为私有(仅本应用可读), MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE会直接抛异常。获取实例主要有三种方式: 1. getSharedPreferences(String name, int mode):最常用。如果你需要多个不同名称的配置文件,或者需要从非 Activity 的 Context 中调用,就用这个。推荐文件名带上应用包名以确保唯一性(如 "com.example.myapp.PREF_FILE")。 2. getPreferences(int mode):如果某个 Activity 只需要一个专属的配置文件,可以直接在 Activity 中调用此方法,无需指定名称。 3. getDefaultSharedPreferences(Context):如果存储的是整个应用的全局设置,建议使用此方法获取默认文件。 本项目中采用了第一种方法获取实例。 写入数据通过Editor对象完成: 1. 调用 edit() 获取 SharedPreferences.Editor。 2. 使用 putStr
这篇文章对您有帮助吗?
订阅66必读
每日精选科技资讯,直达你的邮箱