关于 performing-dynamic-analysis-of-android-app
面向安全分析人员的 Android 应用动态分析技能,使用 Frida 和 Objection 在运行时检查应用行为,涵盖方法 Hook、数据观察及防护机制测试。
主要功能
- 01配置 Frida 并发现应用
- 02Hook 方法并检查参数
- 03监控网络与加密活动
- 04检查运行时数据和密钥
- 05测试 Root 检测行为
适用场景
- 01运行时验证静态分析结果
- 02检查混淆应用的行为
- 03观察 API 调用和解密数据
- 04评估 Root 与反调试检查
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill performing-dynamic-analysis-of-android-app安装后在 Claude Code 中输入/performing-dynamic-analysis-of-android-app确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py详细介绍
对 Android 应用执行动态分析
适用场景
在以下情况下使用此技能:
- 需要在真实 Android 设备上验证静态分析结果
- 目标应用使用了混淆(DexGuard、自定义加壳工具),导致无法有效进行静态分析
- 测试需要观察实际的 API 调用、解密后的数据或运行时生成的值
- 评估 Root 检测、防篡改检测或反调试实现
未经授权,不要在生产环境中使用此技能——动态插桩可能改变应用行为并触发安全警报。
前提条件
- 已 Root 的 Android 设备或模拟器(Genymotion、具有可写系统的 Android Studio AVD)
- 设备上已安装与设备架构匹配的 Frida 服务端(arm64、x86_64)
- Python 3.10+,并安装
frida-tools和objection包 - 已配置 ADB,且设备已连接
- 目标 APK 已安装在设备上
工作流
步骤 1:在 Android 设备上设置 Frida 服务端
# Check device architecture
adb shell getprop ro.product.cpu.abi
# Output: arm64-v8a
# Download matching Frida server from GitHub releases
# https://github.com/frida/frida/releases
# Push to device
adb push frida-server-16.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 &
# Verify Frida connection
frida-ps -U
步骤 2:枚举应用攻击面
# List all packages
frida-ps -U -a
# Attach Objection for high-level exploration
objection --gadget com.target.app explore
# List activities, services, receivers
android hooking list activities
android hooking list services
android hooking list receivers
# List loaded classes
android hooking list classes
android hooking search classes com.target.app
步骤 3:Hook 敏感方法
# Hook all methods of a class
android hooking watch class com.target.app.auth.LoginManager
# Hook specific method with argument dumping
android hooking watch class_method com.target.app.auth.LoginManager.authenticate --dump-args --dump-return
# Hook crypto operations
android hooking watch class javax.crypto.Cipher --dump-args
android hooking watch class java.security.MessageDigest --dump-args
# Hook network calls
android hooking watch class okhttp3.OkHttpClient --dump-args
android hooking watch class java.net.URL --dump-args
步骤 4:编写自定义 Frida 脚本以进行深入分析
// hook_crypto.js - Intercept encryption/decryption operations
Java.perform(function() {
var Cipher = Java.use("javax.crypto.Cipher");
Cipher.doFinal.overload("[B").implementation = function(input) {
var mode = this.getAlgorithm();
console.log("[Cipher] Algorithm: " + mode);
console.log("[Cipher] Input: " + bytesToHex(input));
var result = this.doFinal(input);
console.log("[Cipher] Output: " + bytesToHex(result));
return result;
};
function bytesToHex(bytes) {
var hex = [];
for (var i = 0; i < bytes.length; i++) {
hex.push(("0" + (bytes[i] & 0xFF).toString(16)).slice(-2));
}
return hex.join("");
}
});
# Execute custom Frida script
frida -U -f com.target.app -l hook_crypto.js --no-pause
步骤 5:绕过 Root 检测
// root_bypass.js - Common root detection bypass
Java.perform(function() {
// Bypass RootBeer library
var RootBeer = Java.use("com.scottyab.rootbeer.RootBeer");
RootBeer.isRooted.implementation = function() {
console.log("[RootBeer] isRooted() bypassed");
return false;
};
// Bypass generic file-based root checks
var File = Java.use("java.io.File");
var originalExists = File.exists;
File.exists.implementation = function() {
var path = this.getAbsolutePath();
var rootPaths = ["/system/app/Superuser.apk", "/system/xbin/su",
"/sbin/su", "/system/bin/su", "/data/local/bin/su"];
if (rootPaths.indexOf(path) >= 0) {
console.log("[Root] Blocked check for: " + path);
return false;
}
return originalExists.call(this);
};
// Bypass SafetyNet/Play Integrity
try {
var SafetyNet = Java.use("com.google.android.gms.safetynet.SafetyNetApi");
console.log("[SafetyNet] Class found - may need additional bypass");
} catch(e) {}
});
步骤 6:在运行时分析网络通信
// network_monitor.js - Monitor all HTTP requests
Java.perform(function() {
// Hook OkHttp3
try {
var OkHttpClient = Java.use("okhttp3.OkHttpClient");
var Interceptor = Java.use("okhttp3.Interceptor");
var Chain = Java.use("okhttp3.Interceptor$Chain");
console.log("[OkHttp] Monitoring network requests...");
var Request = Java.use("okhttp3.Request");
Request.url.implementation = function() {
var url = this.url();
console.log("[OkHttp] URL: " + url.toString());
return url;
};
} catch(e) {
console.log("[OkHttp] Not found, trying HttpURLConnection");
}
// Hook HttpURLConnection
var URL = Java.use("java.net.URL");
URL.openConnection.overload().implementation = function() {
console.log("[URL] Opening: " + this.toString());
return this.openConnection();
};
});
步骤 7:提取解密后的数据和机密信息
# Using Objection for quick extraction
objection --gadget com.target.app explore
# Dump Android Keystore entries
android keystore list
android keystore dump
# Search heap for sensitive objects
android heap search instances com.target.app.model.User
android heap evaluate <handle> "JSON.stringify(clazz)"
# Memory string search
memory search "password" --string
memory search "api_key" --string
核心概念
| 术语 | 定义 |
|---|---|
| 动态插桩 | 通过向运行中的进程注入代码,在运行时修改应用行为 |
| 方法 Hook | 替换或包装函数实现,以拦截参数和返回值 |
| Frida 服务端 | 在目标设备上运行、接收主机端插桩命令的守护进程 |
| Dalvik/ART 运行时 | Android 运行时环境;Frida 在 ART 层 Hook Java/Kotlin 方法 |
| 堆检查 | 检查应用内存堆中的实时对象,以提取运行时数据 |
工具与系统
- Frida:动态插桩工具包,可将 JavaScript 注入原生 Android 进程
- Objection:更高层级的 Frida 封装,提供预构建的 Android 和 iOS 安全测试命令
- frida-trace:自动化方法跟踪工具,可快速侦察应用行为
- Drozer:Android 安全评估框架,用于测试 IPC 和导出的组件
- Android Studio Profiler:用于运行时监控 CPU、内存和网络活动
常见问题
- Frida 版本不匹配:设备上的 Frida 服务端必须与主机上的 frida-tools 版本匹配。版本不匹配会导致连接失败。
- 反 Frida 检测:某些应用会通过检查 Frida 服务端进程、扫描内存中的 Frida 特征或监控
/proc/self/maps来检测 Frida。可使用 Frida Gadget 注入或自定义服务端构建版本。 - 混淆后的类名:应用使用 ProGuard/R8 后,类名和方法名会缩短(例如
a.b.c.d())。使用android hooking search classes查找实际运行时名称。 - 多 DEX 应用:拆分到多个 DEX 文件的大型应用,在启动时可能不会加载所有类。可 Hook 类加载器,或在应用完全初始化后使用
Java.enumerateLoadedClasses()。
评论
支持 Markdown