第十二节 Android 权限机制
(第1章 安卓逆向概论)
学习目标
学完本节,希望你能够:搞清 Android 权限模型(普通、危险、特殊);掌握 6.0+ 运行时权限和动态申请流程;会查、改、绕过权限检查(仅学习);会用 Frida/Xposed Hook 权限验证;知道 SELinux 在权限里干啥。
一、Android 权限模型是啥?
Android 采用 基于权限的安全模型 ,应用在访问敏感数据(如相机、定位、电话)时,必须 声明并获得权限。
权限分类
| 权限类型 | 描述 | 示例 |
|---|---|---|
| 普通权限(Normal) | 低风险,安装时自动授予 | INTERNET, ACCESS_NETWORK_STATE |
| 危险权限(Dangerous) | 涉及隐私,用户需手动授权 | READ_CONTACTS, CAMERA, LOCATION |
| 特殊权限(Signature/Privileged) | 仅系统应用或特定签名的应用可使用 | MANAGE_EXTERNAL_STORAGE, SYSTEM_ALERT_WINDOW |
查看所有 Android 权限
bash
adb shell pm list permissions
二、Android 6.0+ 运行时权限是咋回事?
Android 6.0(API 23)引入运行时权限 ,危险权限需要 动态申请。
示例:申请 CAMERA 权限
java
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 100);
}
📌 监听权限结果
java
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 100 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.d("Permission", "Camera permission granted!");
}
}
三、权限管理命令咋用?
查看某应用的已授予权限
bash
adb shell dumpsys package com.example.app | grep permission
授予/撤销应用权限(需 root)
bash
adb shell pm grant com.example.app android.permission.CAMERA
adb shell pm revoke com.example.app android.permission.CAMERA
查询当前启用的 SELinux 模式
bash
adb shell getenforce
输出:
Enforcing # SELinux 启用
禁用 SELinux(Root 权限)
bash
adb shell setenforce 0
四、咋绕过权限验证?(仅学习)
1. Hook 权限检查
使用 Frida 绕过 checkSelfPermission
js
Java.perform(function() {
var ActivityCompat = Java.use("androidx.core.app.ActivityCompat");
ActivityCompat.checkSelfPermission.implementation = function(context, permission) {
console.log("Bypassing checkSelfPermission: " + permission);
return 0; // 直接返回 PERMISSION_GRANTED
};
});
Frida 命令执行
bash
frida -U -n com.example.app -e "..."
2. 修改 AndroidManifest 以绕过权限
逆向分析 APK 并修改权限
bash
apktool d app.apk -o decompiled/
vim decompiled/AndroidManifest.xml
修改:
xml
<uses-permission android:name="android.permission.CAMERA"/>
重新打包:
bash
apktool b decompiled -o modded.apk
jarsigner -verbose -keystore my.keystore modded.apk alias_name
adb install modded.apk
3. 绕过运行时权限
使用 Xposed 模块 Hook requestPermissions
java
findAndHookMethod("android.app.Activity", lpparam.classLoader, "requestPermissions",
String[].class, int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
Log.d("Xposed", "Bypassing requestPermissions");
param.setResult(null);
}
}
);
五、SELinux 在权限里干啥?
用一句话说清楚
SELinux 是 Android 的 强制访问控制(MAC) 机制:
- Enforcing 模式(默认):阻止未经授权的访问。
- Permissive 模式:仅记录日志,不拦截访问。
查询 SELinux 策略
bash
adb shell dmesg | grep avc
Hook SELinux 以绕过权限
c
int selinux_android_setcon(const char *context) {
return 0; // 绕过 SELinux 访问控制
}
动手练一练
- 查询设备上的所有权限
bash
adb shell pm list permissions
- 查看某应用的权限
bash
adb shell dumpsys package com.example.app | grep permission
- 逆向分析 APK 权限
bash
apktool d app.apk -o decompiled/
vim decompiled/AndroidManifest.xml
- Hook checkSelfPermission 绕过权限检查
js
Java.perform(function() {
var ActivityCompat = Java.use("androidx.core.app.ActivityCompat");
ActivityCompat.checkSelfPermission.implementation = function(context, permission) {
console.log("Bypassing checkSelfPermission: " + permission);
return 0;
};
});
本节小结
你只要记住这几条就行:权限分普通、危险、特殊,危险权限 6.0+ 要运行时申请;用 pm list permissions、dumpsys package 查权限,用 Frida/Xposed Hook checkSelfPermission 可绕过(仅限学习);SELinux 是强制访问控制,getenforce 可看状态。
本节思考与练习
- 概念:普通权限和危险权限有啥区别?运行时权限是啥时候引入的?
- 动手:用
adb shell pm list permissions和dumpsys package看某应用的权限。 - 动手:用 Frida Hook
checkSelfPermission,让某应用「以为」有相机权限(仅学习环境)。
下一节预告 :下一节讲 Android APP 目录结构 (第十三节),把 /data/data/包名 下 cache、databases、shared_prefs、lib 等是干啥的讲清楚。