
Android App Pentesting
- 29 installs
- 1.6k repo stars
- Updated July 19, 2026
- wgpsec/aboutsecurity
Helps with testing & qa tasks during AI-assisted development.
About
android-app-pentesting is a Claude Code skill for testing & qa. It helps solo builders move faster with AI-assisted coding.
- android-app-pentesting
- Testing & QA
- AI-coding skill
Android App Pentesting by the numbers
- 29 all-time installs (skills.sh)
- +4 installs in the week ending Jul 27, 2026 (Skillselion tracking)
- Ranked #1,355 of 2,153 Testing & QA skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/wgpsec/aboutsecurity --skill android-app-pentestingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 29 |
|---|---|
| repo stars | ★ 1.6k |
| Last updated | July 19, 2026 |
| Repository | wgpsec/aboutsecurity ↗ |
What it does
Helps with testing & qa tasks during AI-assisted development.
Files
Android 应用渗透测试方法论
阶段流: 环境准备 → APK静态分析 → 动态分析(Frida) → 组件安全测试 → 数据存储安全 → 网络通信安全 → 保护机制绕过
深入参考
- APK 静态分析详细命令与 Manifest 审计要点 → references/android-static-analysis.md
- Frida Hook 脚本与 SSL Pinning 绕过实战 → references/android-frida-dynamic.md
- React Native / Flutter / native so / RMS / Appium 运行时分析 → references/android-frameworks-and-runtime.md
---
Phase 0: 环境准备
设备/模拟器选择
测试设备选择?
├─ 真机(推荐 Pixel 系列)
│ ├─ Magisk 刷入 → systemless root
│ ├─ 启用 Zygisk + DenyList → Root 隐藏
│ └─ 保留原始 boot.img → OTA 恢复
├─ Android Studio 模拟器
│ ├─ x86 镜像 + ARM 翻译层(速度优先)
│ └─ Google APIs 镜像(需 Play Store 测试时)
└─ Genymotion(免费个人版 + VirtualBox)
└─ Bridge 网络模式 → 方便从其他 VM 连接核心工具链
| 工具 | 用途 | 安装 |
|---|---|---|
| adb | 设备通信/安装/调试 | Android SDK Platform Tools |
| jadx / jadx-gui | APK 反编译为 Java | brew install jadx |
| apktool | 反编译为 Smali / 资源提取 | brew install apktool |
| Frida + frida-tools | 动态 Hook / 运行时分析 | pip install frida-tools |
| objection | Frida 自动化封装 | pip install objection |
| Drozer | 组件安全测试 | GitHub Release |
| Burp Suite | 流量拦截 | PortSwigger |
| MobSF | 自动化静态+动态分析 | Docker 部署 |
| APKiD | 识别编译器/加壳/混淆 | pip install apkid |
APK 获取
# 从设备提取
adb shell pm list packages | grep target
adb shell pm path com.target.app
adb pull /data/app/com.target.app-.../base.apk
# 多 Split APK 合并
mkdir splits
adb shell pm path com.target.app | cut -d ':' -f 2 | xargs -n1 -I{} adb pull {} splits/
java -jar APKEditor.jar m -i splits/ -o merged.apk
java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
# 在线下载
# APKPure / APKMirror / APKCombo / apkd (GitHub)
# justapk: pip install justapk
justapk download com.target.app
justapk convert app.xapk -o output/---
Phase 1: APK 静态分析
反编译与代码审计
反编译路径选择?
├─ 需要 Java 源码审计 → jadx -d output/ target.apk
├─ 需要修改并重打包 → apktool d target.apk -o decoded/
├─ React Native 应用 → 解压 assets/index.android.bundle
├─ Xamarin 应用 → 解压 assemblies/ → dnSpy / ILSpy
└─ 加壳应用 → APKiD 识别壳类型 → 对应脱壳方案# jadx 反编译
jadx -d jadx_output/ target.apk
# 搜索敏感信息
grep -rn "password\|api_key\|secret\|token\|firebase" jadx_output/
# apktool 反编译(Smali 级别)
apktool d target.apk -o apktool_output/
# APKiD 识别保护方案
apkid target.apkManifest.xml 审计要点
# 提取 Manifest
aapt dump xmltree target.apk AndroidManifest.xml关键检查项:
| 属性 | 风险 | 影响 |
|---|---|---|
android:debuggable="true" | 高 | 可附加调试器/读取应用数据 |
android:allowBackup="true" | 中 | adb backup 可提取应用数据 |
android:exported="true" | 高 | 组件可被外部调用 |
android:usesCleartextTraffic="true" | 中 | 允许明文 HTTP |
targetSdkVersion < 24 | 低 | 默认信任用户安装的 CA;>=24 时默认仅信任系统 CA,需检查 Network Security Config |
字符串与密钥搜索
# APK 中的 URL
apkurlgrep -a target.apk
# 泄露的密钥/凭据
apkleaks -f target.apk
# Firebase 数据库检测
grep -rn "firebaseio.com" jadx_output/
# 尝试访问: curl https://xxx.firebaseio.com/.json自动化静态分析
# MobSF 静态分析
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
# 上传 APK → 自动生成报告
# mariana-trench (Facebook)
# 基于 source-sink 规则的漏洞扫描
mariana-trench --apk-path target.apk --output results/---
Phase 2: 动态分析 (Frida)
Frida 基础操作
# 查看运行中的应用
frida-ps -Uai
# 附加到进程
frida -U -f com.target.app
# 使用脚本注入
frida -U -f com.target.app -l hook.js常用 Hook 场景
动态分析目标?
├─ SSL Pinning 绕过 → Phase 6 详述
├─ Root 检测绕过 → Phase 7 详述
├─ 加密算法监控 → Hook javax.crypto.Cipher
├─ 敏感 API 监控 → Hook 文件/网络/短信/位置 API
├─ 生物认证绕过 → Hook BiometricPrompt
└─ 内存中搜索敏感数据 → Fridump内存 Dump 与搜索
# Fridump 内存提取
python3 fridump3.py -u com.target.app
# 搜索敏感数据
strings dump/* | grep -E "password|token|Bearer"
# 搜索助记词
strings dump/* | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$"Keystore 审计
# Hook Keystore 操作
frida -U -f com.target.app -l tracer-cipher.js
# 脚本来源: github.com/WithSecureLabs/android-keystore-audit---
Phase 3: 组件安全测试
组件暴露面枚举
# Drozer 枚举
dz> run app.package.attacksurface com.target.app
# 输出: X activities exported, Y services exported, ...Activity 安全
Exported Activity 测试?
├─ 直接启动 → adb shell am start -n com.target.app/.SensitiveActivity
├─ 是否绕过认证直接访问敏感页面?
│ ├─ 是 → 认证绕过漏洞
│ └─ 否 → 检查 Intent 参数注入
├─ Activity 是否返回敏感数据? → setResult() 泄露
└─ Tapjacking 测试 → filterTouchesWhenObscured / onFilterTouchEventForSecurity / overlay 遮挡触摸处理Content Provider 安全
# 枚举 Provider
dz> run app.provider.info -a com.target.app
# SQL 注入测试
dz> run app.provider.query content://com.target.app.provider/users --projection "* FROM sqlite_master--"
# 路径穿越测试
dz> run app.provider.read content://com.target.app.provider/../../../../etc/hosts
# 文件 Provider 检查
dz> run scanner.provider.traversal -a com.target.appService / Broadcast Receiver
# Service 枚举与交互
dz> run app.service.info -a com.target.app
dz> run app.service.start --action com.target.app.ACTION --component com.target.app/.MyService
# Broadcast 测试
dz> run app.broadcast.info -a com.target.app
dz> run app.broadcast.send --action com.target.app.CUSTOM_ACTION --extra string data "test"Deep Link / URL Scheme
# 枚举 scheme
grep -rn "android:scheme" apktool_output/AndroidManifest.xml
# 触发 deep link
adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value"
# 检查点:
# 1. 参数是否接受路径穿越 → ../../unwanted-endpoint
# 2. 是否传递敏感数据(密码/token)通过 URL 参数
# 3. 是否存在 Open Redirect---
Phase 4: 数据存储安全
检查清单
数据存储位置?
├─ SharedPreferences → /data/data/pkg/shared_prefs/*.xml
│ └─ 是否存储明文密码/token?
├─ SQLite 数据库 → /data/data/pkg/databases/*.db
│ └─ 是否加密? 密钥是否硬编码?
├─ 内部存储 → /data/data/pkg/files/
│ └─ MODE_WORLD_READABLE/WRITABLE?
├─ 外部存储 → /sdcard/ (全局可读写)
│ └─ 是否存储敏感数据?
├─ Keystore → Android Keystore System
│ └─ 密钥是否绑定设备? 是否需要认证?
└─ 后台截图 → /data/system_ce/0/snapshots/
└─ FLAG_SECURE 是否设置?# 检查 SharedPreferences
adb shell run-as com.target.app cat /data/data/com.target.app/shared_prefs/*.xml
# 检查数据库
adb shell run-as com.target.app ls /data/data/com.target.app/databases/
# 拉取并用 sqlite3 检查
adb pull /data/data/com.target.app/databases/app.db
sqlite3 app.db ".tables"
sqlite3 app.db ".schema users"
sqlite3 app.db "SELECT * FROM users;"
# 检查文件权限
adb shell run-as com.target.app ls -la /data/data/com.target.app/files/---
Phase 5: 网络通信安全
流量抓取配置
流量抓取方案?
├─ 应用 targetSdkVersion < 24 → 默认信任用户安装的 CA,可直接设置 WiFi 代理到 Burp
├─ 应用 targetSdkVersion >= 24 → 默认不信任用户 CA,需检查/修改 Network Security Config
│ ├─ 修改 network_security_config.xml 信任 user certificates
│ └─ 重打包签名安装,或把 Burp CA 装入系统证书区(需 root)
├─ Flutter 应用 → 可能使用独立 TLS/CA 逻辑,需额外处理
│ └─ 参考 flutter SSL pinning bypass
└─ 非 HTTP 流量 → tcpdump / iptables 转发# 安装 Burp CA 到系统(需 root)
# 导出 Burp CA → DER 格式 → 转 PEM
openssl x509 -inform DER -in cacert.der -out cacert.pem
# 计算 hash
HASH=$(openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1)
cp cacert.pem /system/etc/security/cacerts/${HASH}.0
chmod 644 /system/etc/security/cacerts/${HASH}.0
# 修改 network_security_config.xml(targetSdkVersion >= 24 时常见)
# 在 res/xml/network_security_config.xml 中添加:
# <trust-anchors><certificates src="user" /></trust-anchors>SSL Pinning 检测与绕过
SSL Pinning 类型?
├─ OkHttp CertificatePinner → Frida Hook
├─ 自定义 TrustManager → Frida Hook
├─ Network Security Config → 修改 XML 重打包
├─ WebView SSL 处理 → Hook WebViewClient
└─ 未知实现 → SSLPinDetect 静态扫描定位# 静态检测 Pinning 实现
python sslpindetect.py -f target.apk -a apktool.jar
# apk-mitm 自动绕过(无需 root)
npx apk-mitm target.apk
# objection 绕过
objection --gadget com.target.app explore --startup-command "android sslpinning disable"
# Frida 绕过(通用脚本)
frida -U -f com.target.app -l ssl-pinning-bypass.js---
Phase 6: 保护机制绕过
Root 检测绕过
Root 检测机制?
├─ 文件检查 (/su, /system/xbin/su, Cydia 等)
│ └─ Magisk DenyList 隐藏
├─ SafetyNet / Play Integrity
│ └─ 硬件级别 attestation 难以绕过
│ └─ 基本 attestation → Play Integrity Fix (Zygisk 模块)
├─ RootBeer / 自定义检测库
│ └─ Frida Hook 返回值
└─ 系统属性检查 (ro.debuggable, ro.secure)
└─ MagiskHide Props Config# objection 绕过 root 检测
objection --gadget com.target.app explore --startup-command "android root disable"
# Frida Hook 通用 root 检测绕过
frida -U -f com.target.app -l anti-root.js模拟器检测绕过
# 检测点: Build.FINGERPRINT, Build.MODEL, CPU_ABI, /dev/qemu_pipe
# Frida Hook Build 类属性反调试/反 Frida 绕过
反 Frida 检测方式?
├─ 检查 frida-server 端口 (27042)
│ └─ 更改监听端口: frida-server -l 0.0.0.0:1234
├─ 检查 /proc/self/maps 中的 frida 库
│ └─ 使用 linjector 注入(无 ptrace)
├─ 检查 D-Bus 协议特征
│ └─ 使用自编译 Frida gadget
└─ 自杀式 kill(getpid()) 反分析
└─ Hook Process.killProcess / exit截图/录屏保护绕过
# 关闭 FLAG_SECURE,便于截图、录屏和动态分析记录
objection --gadget com.target.app explore -s "android ui FLAG_SECURE false"生物认证绕过
# Frida 绕过指纹
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f com.target.app---
Phase 7: 客户端注入漏洞
WebView 安全
WebView 配置检查?
├─ JavaScript 启用 → setJavaScriptEnabled(true) → XSS 风险
├─ File 协议访问 → setAllowFileAccess(true) → LFI 风险
├─ addJavascriptInterface → RCE(API < 17)
└─ WebViewClient 证书处理 → 忽略 SSL 错误?SQL 注入
- Content Provider 的 query/insert/update/delete 方法
- 自定义数据库操作是否参数化
Intent 注入
- 代理 Activity/Service 接收 Intent 后直接调用
startActivity() - WebView URL 通过
Intent.parseUri()解析 → 恶意 Intent 构造
---
自动化分析工具速查
| 工具 | 类型 | 用法 |
|---|---|---|
| MobSF | 静态+动态 | Docker 部署,Web UI |
| Qark | 静态 | qark --apk target.apk |
| AndroBugs | 静态 | python androbugs.py -f target.apk |
| SUPER | 静态 | super-analyzer target.apk |
| Androwarn | 静态(行为) | python androwarn.py -i target.apk -r html |
| mariana-trench | 静态(数据流) | mariana-trench --apk-path target.apk |
| ReverseAPK | 静态 | reverse-apk target.apk |
---
恶意软件分析要点
当分析可疑 APK 而非渗透测试时,额外关注:
- 原生 so 库加载链:
System.loadLibrary→ 解密第二层 ELF →InMemoryDexClassLoader无文件 DEX InMemoryDexClassLoader使用 → 内存级 DEX 加载(Frida Hook dump)AccessibilityService滥用 → 覆盖层攻击 / ACTION_SET_TEXT 劫持- FCM 作为 C2 通道 → 检查 Firebase 消息触发条件
- 前台 Service + MediaPlayer 持久化 → 进程保活
---
参考资源
Android 跨框架与运行时分析
当 APK 不是传统原生 Android 应用时,先识别框架类型,再选择对应的静态和动态分析路径。React Native、Flutter、Xamarin 这类框架会把关键业务逻辑放在 bundle、native library 或托管程序集里,只看 Java 反编译结果会漏掉主要攻击面。
---
1. 框架识别
| 框架/形态 | 识别特征 | 下一步 |
|---|---|---|
| React Native | assets/index.android.bundle、libreactnativejni.so | 反汇编 Hermes bytecode 或直接搜索 JS bundle |
| Flutter | libflutter.so、libapp.so、flutter_assets/ | 分析 Dart AOT 产物,必要时用 reFlutter 重打包代理 |
| Xamarin | assemblies/*.dll、Mono 相关库 | 用 dnSpy / ILSpy 分析 .NET 逻辑 |
| 原生 so | lib/<abi>/lib*.so 或 assets/ 中加载 ELF | 用 Ghidra / IDA / Cutter 分析 JNI 与 native 校验 |
| 加壳/动态加载 | APKiD 命中 packer、DexClassLoader、InMemoryDexClassLoader | 运行时 dump 解密后的 DEX 或 so |
---
2. React Native / Hermes
React Native 应用的 API、路由、密钥和业务逻辑常在 index.android.bundle 中。若启用了 Hermes,bundle 是 Hermes bytecode,普通字符串搜索覆盖有限。
# 解包后查找 React Native bundle
apktool d target.apk -o decoded/
find decoded/ -name 'index.android.bundle' -o -name '*.hbc'
# Hermes bytecode 反汇编
pip install hbctool
hbctool disasm decoded/assets/index.android.bundle hermes_disasm/重点检查:
- API base URL、WebSocket、GraphQL endpoint。
- feature flag、debug endpoint、测试环境域名。
- 本地存储 key、加密 key、token 处理逻辑。
- Deep link / navigation 路由是否可直接进入敏感页面。
---
3. Flutter
Flutter Android 应用的 Dart 业务逻辑通常编译进 libapp.so,Java 层只保留壳和插件桥接。分析时先确认目标是网络拦截、业务逻辑逆向,还是证书校验绕过。
# 识别 Flutter 资源和 native 库
find decoded/ -name 'libflutter.so' -o -name 'libapp.so'
find decoded/ -path '*flutter_assets*' -type f
# Dart AOT 辅助分析
blutter jadx/resources/lib/arm64-v8a/ ./blutter_outputFlutter 流量拦截通常不能只依赖 Android 系统 CA。需要优先判断证书校验是否在 Dart/native 层实现:
# reFlutter 重打包以便代理拦截
pip3 install reflutter
reflutter target.apk
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk如果目标设备已 root 且使用 Magisk,可评估 zygisk-reflutter 这类运行时方案,避免频繁重打包。
---
4. Native so 与 JNI
Native library 默认位于 /lib/<abi>/lib<name>.so,也可能从 assets/ 解密后加载。不同 ABI 目录代表不同 CPU 架构:
| ABI | 常见路径 |
|---|---|
| 32-bit ARM | lib/armeabi-v7a/*.so |
| ARM64 | lib/arm64-v8a/*.so |
| x86 | lib/x86/*.so |
| x86_64 | lib/x86_64/*.so |
优先从 Java/Kotlin 层定位 native 调用入口:
grep -rn "System.loadLibrary\|native " jadx_output/
find decoded/lib -name '*.so'重点检查:
- 证书 pinning、root/debug/frida 检测是否在 native 层。
- 加密、签名、请求完整性校验是否依赖 JNI。
- Native 函数参数是否来自 Intent、WebView、Provider 或网络响应。
---
5. 运行时辅助工具
RMS
Runtime Mobile Security 适合在 Frida 已连通时做交互式运行时观察和 Hook,价值在于快速浏览类、方法、参数和常见绕过脚本。
npm install -g rms-runtime-mobile-security
# 确保 frida-server 已在设备上运行
rms
# 浏览器打开 http://127.0.0.1:5491/Appium
Appium 更适合自动化走业务流程,辅助触发难以手工稳定复现的页面、Deep Link、支付流程或多步骤状态机。
npm install -g appium
appium driver install uiautomator2
appium driver doctor uiautomator2
appium server最小 capability:
{
"platformName": "Android",
"appium:automationName": "UiAutomator2"
}---
6. 安全边界
- 不要把客户 APK 上传到不受控的在线沙箱、在线 MobSF 或第三方 APK 下载/解析站点。
- 从非官方渠道下载 APK 时,要把样本当作不可信文件处理,优先在隔离环境中分析。
- 重打包、签名和运行时 Hook 会改变应用状态;报告中要说明验证环境和是否影响原始完整性校验。
Android Frida 动态分析与 SSL Pinning 绕过
Frida 环境配置
frida-server 部署
# 查看设备架构
adb shell getprop ro.product.cpu.abi
# arm64-v8a → frida-server-xx.x.x-android-arm64
# 下载对应版本
# https://github.com/frida/frida/releases
# 推送到设备
adb push frida-server-xx.x.x-android-arm64 /data/local/tmp/frida-server
adb shell chmod 755 /data/local/tmp/frida-server
adb shell /data/local/tmp/frida-server &
# 验证连接
frida-ps -U反 Frida 检测绕过
Frida 被检测?
├─ 端口检测 (27042)
│ └─ frida-server -l 0.0.0.0:31337
│ └─ frida -H 127.0.0.1:31337 ...
├─ /proc/self/maps 扫描
│ └─ linjector: github.com/erfur/linjector-rs
│ └─ 无 ptrace 注入,减少检测面
├─ D-Bus 协议指纹
│ └─ 自编译 Frida(修改协议特征)
├─ frida-agent 内存特征
│ └─ 使用 Frida Gadget 替代 frida-server
│ └─ 嵌入到 APK 的 lib/ 目录
└─ ptrace 检测
└─ linjector 绕过(代码注入无 ptrace)SSL Pinning 绕过方案
方案 1: apk-mitm(无需 root,最简单)
npx apk-mitm target.apk
# 自动: 反编译 → 移除 pinning 代码 → 修改 network_security_config → 重签名
# 输出: target-patched.apk
adb install target-patched.apk局限: 需要卸载原应用重装,数据丢失;完整性校验会失败。
方案 2: objection(需 root 或 Frida gadget)
objection --gadget com.target.app explore --startup-command "android sslpinning disable"方案 3: Frida 通用脚本
// ssl_pinning_bypass.js
// Hook 多种 SSL Pinning 实现
Java.perform(function() {
// OkHttp3 CertificatePinner
try {
var CertificatePinner = Java.use('okhttp3.CertificatePinner');
CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function(hostname, peerCertificates) {
console.log('[+] OkHttp3 CertificatePinner.check() bypassed for: ' + hostname);
return;
};
} catch(e) {}
// TrustManagerImpl
try {
var TrustManagerImpl = Java.use('com.android.org.conscrypt.TrustManagerImpl');
TrustManagerImpl.verifyChain.implementation = function(untrustedChain, trustAnchorChain, host, clientAuth, ocspData, tlsSctData) {
console.log('[+] TrustManagerImpl.verifyChain() bypassed for: ' + host);
return untrustedChain;
};
} catch(e) {}
// 自定义 X509TrustManager
try {
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
var TrustManager = Java.registerClass({
name: 'com.bypass.TrustManager',
implements: [X509TrustManager],
methods: {
checkClientTrusted: function(chain, authType) {},
checkServerTrusted: function(chain, authType) {},
getAcceptedIssuers: function() { return []; }
}
});
} catch(e) {}
});frida -U -f com.target.app -l ssl_pinning_bypass.js --no-pause方案 4: iptables 转发(最后手段)
当其他方法失效时,通过 iptables 强制转发流量:
# 在 root 设备上
adb shell
iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination BURP_IP:8080SSL Pinning 静态检测(SSLPinDetect)
在动态绕过前先了解 Pinning 实现方式:
# 安装
git clone https://github.com/aancw/SSLPinDetect
pip install -r requirements.txt
# 扫描
python sslpindetect.py -f target.apk -a apktool.jar -v
# 检测目标:
# - OkHttp CertificatePinner
# - 自定义 X509TrustManager.checkServerTrusted
# - SSLContext.init + 自定义 TrustManager/KeyManager
# - Network Security Config XML pins组件动态测试(Drozer)
安装与连接
# 设备端安装 Drozer Agent APK
adb install drozer-agent.apk
# PC 端连接
adb forward tcp:31415 tcp:31415
drozer console connectActivity 测试
# 枚举导出 Activity
dz> run app.activity.info -a com.target.app
# 启动指定 Activity(绕过认证检查)
dz> run app.activity.start --component com.target.app com.target.app.admin.AdminActivity
# 带 Intent Extra 启动
dz> run app.activity.start --component com.target.app com.target.app.WebViewActivity \
--extra string url "javascript:alert(document.cookie)"Content Provider 测试
# 枚举 Provider
dz> run app.provider.info -a com.target.app
# 查询数据
dz> run app.provider.query content://com.target.app.provider/users
# SQL 注入
dz> run app.provider.query content://com.target.app.provider/users \
--projection "* FROM sqlite_master WHERE type='table'--"
# 路径穿越
dz> run scanner.provider.traversal -a com.target.app
dz> run app.provider.read content://com.target.app.provider/../../../../data/data/com.target.app/shared_prefs/secret.xmlService 与 Broadcast 测试
# Service 枚举
dz> run app.service.info -a com.target.app
# 发送 Intent 到 Service
dz> run app.service.send com.target.app com.target.app.MyService \
--msg 1 0 0 --extra string cmd "id" --bundle-as-obj
# Broadcast 枚举
dz> run app.broadcast.info -a com.target.app
# 发送 Broadcast
dz> run app.broadcast.send --action com.target.app.PROCESS_CMD \
--extra string command "cat /etc/passwd"MobSF 动态分析
# 启动 MobSF
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
# 动态分析需要:
# 1. 先启动 Genymotion 模拟器
# 2. 再启动 MobSF
# 3. MobSF 自动连接模拟器
# 自动执行:
# - Frida Hook(SSL Pinning/Root Detection/Debug Detection 绕过)
# - 抓取 HTTPS 流量
# - 枚举导出组件并截图
# - 监控 API 调用
# 修复代理残留:
adb shell settings put global http_proxy :0内存中敏感数据搜索
InMemoryDexClassLoader Hook
恶意软件或加壳应用常使用内存级 DEX 加载。Hook dump:
// dump_memdex.js
Java.perform(function() {
var InMemoryDexClassLoader = Java.use('dalvik.system.InMemoryDexClassLoader');
InMemoryDexClassLoader.$init.overload('java.nio.ByteBuffer', 'java.lang.ClassLoader').implementation = function(buf, parent) {
console.log('[*] InMemoryDexClassLoader intercepted');
var arr = Java.array('byte', buf.array());
var fos = Java.use('java.io.FileOutputStream').$new('/sdcard/memdex_' + Date.now() + '.dex');
fos.write(arr);
fos.close();
console.log('[+] DEX dumped to /sdcard/');
return this.$init(buf, parent);
};
});frida -U -f com.target.app -l dump_memdex.jsAndroid APK 静态分析详细参考
Manifest.xml 深度审计
组件导出分析
组件导出规则需要结合 android:exported 和目标 SDK 判断。targetSdkVersion <= 30 时,带 <intent-filter> 且未显式声明的 Activity/Service/Receiver 通常按导出处理;targetSdkVersion >= 31 时,这类组件必须显式声明 android:exported,否则应用无法安装。需逐一检查:
<!-- 旧 targetSdkVersion 下危险: 带 intent-filter 且未显式 exported 的 Activity 可能导出 -->
<activity android:name=".LoginActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="myapp" android:host="auth"/>
</intent-filter>
</activity>
<!-- 危险: 显式导出的 Service -->
<service android:name=".SyncService" android:exported="true"/>
<!-- 危险: 显式导出的 Provider -->
<provider
android:name=".DataProvider"
android:authorities="com.target.provider"
android:exported="true"
android:grantUriPermissions="true"/>调试与备份配置
# 检查 debuggable
aapt dump xmltree target.apk AndroidManifest.xml | grep -i debuggable
# debuggable="true" → 可用 adb shell run-as 访问沙箱
# 可附加 JDWP 调试器
# 检查 allowBackup
aapt dump xmltree target.apk AndroidManifest.xml | grep -i allowbackup
# allowBackup="true" → adb backup -f backup.ab com.target.app
# 可提取 SharedPreferences、数据库、文件Network Security Config 解析
# 查找配置引用
grep "networkSecurityConfig" apktool_output/AndroidManifest.xml
# 查看配置文件
cat apktool_output/res/xml/network_security_config.xml关键配置项:
<!-- 允许明文 HTTP(不安全)-->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">api.target.com</domain>
</domain-config>
<!-- 信任用户安装的 CA(方便测试但不安全)-->
<base-config>
<trust-anchors>
<certificates src="system"/>
<certificates src="user"/>
</trust-anchors>
</base-config>
<!-- Certificate Pinning -->
<domain-config>
<domain includeSubdomains="true">api.target.com</domain>
<pin-set>
<pin digest="SHA-256">base64EncodedHash=</pin>
</pin-set>
</domain-config>字符串与密钥提取
手动搜索模式
# 硬编码密码/密钥
grep -rnE "(password|passwd|pwd)\s*=\s*\"[^\"]+\"" jadx_output/
grep -rnE "(api_key|apikey|API_KEY)\s*=\s*\"[^\"]+\"" jadx_output/
grep -rnE "(secret|SECRET)\s*=\s*\"[^\"]+\"" jadx_output/
# Firebase URL(可能可未授权访问)
grep -rn "firebaseio.com" jadx_output/
# 测试: curl https://xxx.firebaseio.com/.json
# 返回数据 = 未授权访问漏洞
# AWS 凭据
grep -rnE "AKIA[0-9A-Z]{16}" jadx_output/
# Google Maps API Key
grep -rnE "AIza[0-9A-Za-z_-]{35}" jadx_output/
# JWT Token
grep -rnE "eyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*" jadx_output/自动化工具
# apkleaks: 自动提取 APK 中的敏感信息
apkleaks -f target.apk -o leaks.txt
# apkurlgrep: 提取所有 URL
apkurlgrep -a target.apk
# APKiD: 识别编译器/加壳/混淆方案
apkid target.apk
# 输出示例:
# [+] target.apk
# |-> compiler : dx
# |-> obfuscator : ProGuard
# |-> packer : Qihoo360Smali 代码修改与重打包
当需要绕过客户端检查(如 root 检测、证书校验)但 Frida 不可用时:
# 1. 反编译为 Smali
apktool d target.apk -o decoded/
# 2. 定位目标方法(例如 root 检测)
grep -rn "isRooted\|checkRoot\|detectRoot" decoded/smali/
# 3. 修改 Smali 代码
# 将 return true 改为 return false:
# 找到: const/4 v0, 0x1 (return true)
# 改为: const/4 v0, 0x0 (return false)
# 4. 重打包
apktool b decoded/ -o modified.apk
# 5. 签名
keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -keysize 2048 -validity 10000
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore test.keystore modified.apk test
# 6. 对齐
zipalign -v 4 modified.apk aligned.apk
# 7. 安装
adb install aligned.apk混淆与反混淆
ProGuard / R8 反混淆
ProGuard 重命名类/方法/字段为 a、b、c 等短名。分析策略:
- 通过字符串引用回溯原始功能
- 结合 Manifest 中的明确类名(Activity/Service 不会被混淆)
- mapping.txt 文件(如果可获取)可还原原始名称
DexGuard 脱壳
DexGuard 比 ProGuard 更强,加入了:
- 资源加密(通过 FilterInputStream 解密)
- DEX 动态加载(ZipInputStream → loadDex)
- 字符串加密
脱壳步骤: 1. 运行应用让 DexGuard 自行解密 2. 从 /data/data/pkg/ 中提取解密后的 DEX 3. 或 Hook loadDex 方法截获解密后的 DEX
Superpacked APK (Meta)
Meta 使用自定义压缩算法将应用压缩:
- 运行应用后从文件系统收集解压后的文件
- 工具: github.com/AncientRoman/desuperpacker
Task Hijacking 检测
当 Activity 的 launchMode 设为 singleTask 且未定义 taskAffinity 时,恶意应用可劫持任务栈:
# 检查 launchMode
grep -n "launchMode\|taskAffinity" apktool_output/AndroidManifest.xml
# singleTask + 默认 taskAffinity = 可被劫持
# 恶意应用可在真实应用启动前劫持其任务栈Tapjacking 检测
Tapjacking 通过恶意覆盖层欺骗用户点击:
# 检查是否设置了防护
grep -rn "FLAG_SECURE\|filterTouchesWhenObscured" jadx_output/
# filterTouchesWhenObscured = true → 有防护
# 未设置 → 可能被 Tapjacking