mcpField
P
performing-dynamic-analysis-of-android-app

performing-dynamic-analysis-of-android-app

github.com/mukul975安全35.2k77 次安装8 周前更新
代码仓库

关于 performing-dynamic-analysis-of-android-app

面向安全分析人员的 Android 应用动态分析技能,使用 Frida 和 Objection 在运行时检查应用行为,涵盖方法 Hook、数据观察及防护机制测试。

主要功能

  1. 01配置 Frida 并发现应用
  2. 02Hook 方法并检查参数
  3. 03监控网络与加密活动
  4. 04检查运行时数据和密钥
  5. 05测试 Root 检测行为

适用场景

  1. 01运行时验证静态分析结果
  2. 02检查混淆应用的行为
  3. 03观察 API 调用和解密数据
  4. 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 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.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