发布于 

Objection 环境介绍,自动化分析和插件使用

Objection 简介

Objection 是由安全研究团队 SensePost 开发的一款基于 Frida 的运行时探索工具包(Runtime Exploration Toolkit)。它将 Frida 的底层能力封装为一系列开箱即用的高级命令,让安全研究人员无需编写 JavaScript 脚本,即可快速对 Android 和 iOS 应用进行动态分析和安全评估。

如果说 Frida 是一把瑞士军刀,那 Objection 就是在这把军刀上预装好的多功能刀头——你不需要从零开始锻造工具,直接使用就能完成大部分常见的逆向分析任务。

核心优势

  • 零脚本门槛:所有操作通过交互式命令完成,上手极快
  • 功能覆盖全面:类与方法 Hook、内存操作、密钥存储管理、文件系统访问等
  • 插件化架构:支持自定义插件扩展,社区生态丰富
  • 跨平台支持:同时覆盖 Android 和 iOS 两大移动平台

Objection 安装和配置

环境要求

在安装 Objection 之前,确保你的环境已满足以下条件:

  • Python 3.7+:Objection 本身是一个 Python 包
  • Frida Tools:Objection 依赖 frida 和 frida-tools
  • Root 设备或模拟器:运行时需要将 Frida Server 注入目标进程
  • USB 调试已开启:用于 ADB 连接和 Objection 的设备通信

安装步骤

# 1. 安装 Frida 工具链
pip install frida-tools

# 2. 安装 Objection
pip install objection

# 3. 验证安装
objection version

设备连接

Objection 支持三种连接方式,覆盖不同的使用场景:

# USB 连接(最常用)
objection -g com.example.app explore

# 远程连接(通过网络连接 Frida Server)
objection -h 192.168.1.100 -p 27042 -g com.example.app explore

# 附加到已运行的进程
objection -g com.example.app explore --startup-command "android hooking list classes"

成功连接后,你会看到 Objection 的交互式 REPL 界面,提示符变为 (agent)(objection),此时即可开始执行各类分析命令。

核心功能概览

Objection 的功能可以归纳为以下几个核心模块:

模块 功能描述
android hooking Java 层类/方法搜索、枚举、Hook 与返回值修改
android keystore 密钥库枚举、导出与管理
android clipboard 剪贴板监控与操作
android intent Intent 启动与 Activity 跳转
memory 内存搜索、转储与模块管理
file 应用沙箱文件浏览与管理
sqlite SQLite 数据库直接操作
jobs 后台任务管理与列表

常用命令详解

Java 类浏览

在逆向分析中,第一步通常是了解应用加载了哪些类。Objection 提供了便捷的类浏览命令:

# 列出所有已加载的类(输出较多,建议结合 grep 过滤)
android hooking list classes

# 过滤查看特定包名下的类
android hooking list classes | grep login

# 查看某个类的所有方法
android hooking list class_methods com.example.app.LoginActivity

list classes 会枚举当前进程中所有通过 ClassLoader 加载的 Java/Kotlin 类。对于大型应用,输出的类列表可能非常庞大,因此建议始终配合 grep 进行关键词过滤,聚焦到你关心的模块。

类与方法搜索

当你不确定目标类名或方法名的完整路径时,搜索功能非常实用:

# 搜索类名中包含 "crypto" 的类
android hooking search classes crypto

# 搜索方法名中包含 "encrypt" 的方法
android hooking search methods encrypt

# 在特定类中搜索方法
android hooking search methods com.example.app.utils.CryptoUtils

搜索功能底层通过遍历所有已加载类并执行字符串匹配实现。它会在 DEX 和系统类中同时搜索,因此返回结果可能包含 Android 框架层的类,需要根据包名区分。

Hook 方法并修改返回值

这是 Objection 最强大的功能之一——无需编写脚本即可 Hook 任意 Java 方法并强制修改其返回值:

# Hook 指定方法,强制返回 true(常用于绕过校验)
android hooking set return_value com.example.app.SecurityCheck isRooted true

# Hook 方法强制返回 false
android hooking set return_value com.example.app.utils.CryptoUtils verifySignature false

# Hook 方法返回特定字符串
android hooking set return_value com.example.app.Config getApiUrl "http://127.0.0.1:8080"

原理说明set return_value 的底层实现是 Frida 的 Java.use() API。Objection 会自动判断目标方法的返回值类型(boolean、int、String 等),选择合适的类型进行替换。这种方式特别适合以下场景:

  • 绕过 Root 检测
  • 绕过 SSL 证书校验
  • 修改加密密钥或 API 地址
  • 跳过登录验证

密钥库操作

Android 应用通常将敏感密钥存储在 KeyStore 中,Objection 可以直接枚举和导出这些密钥:

# 列出应用 KeyStore 中的所有别名
android keystore list

# 导出指定别名的密钥
android keystore dump --alias my_secret_key

# 导出所有密钥到文件
android keystore dump --all

该功能通过 Hook java.security.KeyStore 相关 API 实现,能够在不接触应用源码的情况下获取密钥信息,对于分析应用加密逻辑至关重要。

内存操作

内存模块提供了进程内存的直接访问能力,是底层分析的重要工具:

# 列出当前加载的所有模块(.so 文件)
memory list modules

# 从指定基址转储内存数据
memory dump from_base 0x12345678 1024 --output dump.bin

# 搜索内存中的特定字符串
memory search "password"

# 搜索内存中的特定字节模式
memory search --string-offsets-only "API_KEY"

list modules 列出的模块信息包括基址、大小和路径,是进行 SO 层 Hook 的前置步骤。dump from_base 可以从指定地址开始转储指定长度的内存数据,导出为文件后可用 IDA Pro 或 Ghidra 进行静态分析。

iOS 相关命令

Objection 同样支持 iOS 平台,常用命令包括:

# iOS 应用信息查询
ios info binary

# 列出 iOS 类
ios hooking list classes

# iOS 密钥链访问
ios keychain dump

# iOS 粘贴板监控
ios clipboard monitor

虽然本文聚焦 Android,但 Objection 的 iOS 分析能力同样强大,命令结构高度一致,掌握 Android 端的使用方法后可以平滑迁移。

插件系统介绍

插件架构

Objection 采用基于目录的插件加载机制。所有插件以 Python 文件的形式存放在指定目录中,启动时自动注册。

自定义插件编写

每个 Objection 插件需要继承 Plugin 基类并实现 registerhandle 方法:

# my_plugin.py
import objection.utils.helpers as helpers

class MyPlugin(object):
    def __init__(self):
        self.plugin_name = 'my-plugin'
        self.commands = {
            'my-command': {
                'help': '我的自定义命令',
                'args': [('name', '参数名称')]
            }
        }

    def register(self, api):
        self.api = api

    def handle(self, args):
        # 在这里实现你的分析逻辑
        cmd = args[0]
        if cmd == 'my-command':
            result = self.api.send_command('android hooking list classes')
            print(f"[MyPlugin] 获取到 {len(result)} 个类")

将插件文件放入 ~/.objection/plugins/ 目录或通过 --plugin-path 指定路径,启动 Objection 后即可使用自定义命令。

内置插件:wallbreaker

wallbreaker 是 Objection 内置的最强大的内存分析插件,能够直接在运行时实例化任意 Java 对象并搜索内存中的类实例:

# 搜索内存中所有的 String 对象(展示值和数量)
plugin wallbreaker classdump java.lang.String

# 搜索特定包名下的所有类实例
plugin wallbreaker classsearch com.example.app

# 指定搜索深度限制返回数量
plugin wallbreaker classdump java.lang.String --max-depth 3

wallbreaker 的核心价值在于:某些类虽然被加载了,但在常规的类列表中难以发现其内部状态。通过 wallbreaker,你可以直接查看运行时对象的字段值,了解应用的实时状态。

内置插件:sqlite

sqlite 插件提供了对应用私有数据库的直接操作能力:

# 列出所有数据库文件
plugin sqlite connect /data/data/com.example.app/databases/

# 查询数据库中的所有表
plugin sqlite query "SELECT name FROM sqlite_master WHERE type='table'"

# 执行自定义 SQL 查询
plugin sqlite query "SELECT * FROM users LIMIT 10"

# 导出查询结果
plugin sqlite export users.csv "SELECT * FROM users"

该插件通过 Hook SQLite 相关 API 实现,绕过了 Android 的文件权限限制,能够直接读取和操作应用沙箱内的数据库文件。

实际案例:快速分析 APP 安全配置

下面通过一个完整的案例,演示如何使用 Objection 对一个目标 APP 进行快速安全评估。

场景描述

假设我们需要分析一个名为 com.example.targetapp 的应用,评估其安全机制,包括 Root 检测、SSL Pinning、数据加密方式等。

操作流程

# 1. 启动 Objection 并注入目标应用
objection -g com.example.targetapp explore

# 2. 搜索安全相关类
(android hooking search classes security) | grep -i "root\|ssl\|pin\|cert"

# 输出示例:
# com.example.targetapp.security.RootDetector
# com.example.targetapp.security.SSLPinningHelper
# com.example.targetapp.utils.CryptoUtils

# 3. 查看 Root 检测类的实现
android hooking list class_methods com.example.targetapp.security.RootDetector

# 输出示例:
# boolean isRooted()
# boolean checkSuBinary()
# boolean checkRootManagementApp()

# 4. 绕过 Root 检测
android hooking set return_value com.example.targetapp.security.RootDetector isRooted false
android hooking set return_value com.example.targetapp.security.RootDetector checkSuBinary false

# 5. 检查密钥存储
android keystore list

# 6. 查看应用使用的加密库
memory list modules | grep -i "crypto\|ssl\|boringssl"

# 7. 搜索内存中的敏感字符串
memory search "api_key"
memory search "secret"

# 8. 检查数据库内容
plugin sqlite connect /data/data/com.example.targetapp/databases/
plugin sqlite query "SELECT name FROM sqlite_master WHERE type='table'"
plugin sqlite query "SELECT * FROM config"

# 9. 列出应用私有文件
ls /data/data/com.example.targetapp/shared_prefs/
cat /data/data/com.example.targetapp/shared_prefs/config.xml

分析要点

通过以上流程,我们可以在几分钟内获取以下安全评估信息:

  1. Root 检测机制:是否实现了 Root 检测,检测逻辑是否完善
  2. 加密实现:使用的是系统 KeyStore 还是自定义加密,密钥是否存在硬编码
  3. 数据存储:敏感数据是否加密存储,是否存在明文存储的凭证
  4. 网络安全:是否实现了 SSL Pinning,使用的加密库版本是否安全
  5. 文件权限:应用私有目录中的文件是否包含敏感信息泄露

Objection 的局限性与自定义 Frida 脚本的对比

Objection 的局限性

尽管 Objection 功能强大,但它并非万能工具,存在以下局限:

  • 仅支持 Java/Kotlin 层:大部分命令作用于 Java 层,对 Native 层(SO 库中的函数)的支持有限,复杂 SO 层分析仍需编写 Frida 脚本
  • Hook 粒度受限set return_value 只能修改返回值,无法在方法执行前后插入自定义逻辑(如打印参数、修改参数后再调用原方法)
  • 无条件逻辑:无法根据运行时条件动态决定是否拦截,每次 Hook 都是全量拦截
  • 批量操作不便:需要 Hook 多个方法时,需要逐条执行命令,不如脚本灵活
  • 复杂参数构造困难:当需要构造复杂对象作为参数调用方法时,Objection 的能力有限

与自定义 Frida 脚本的对比

对比维度 Objection 自定义 Frida 脚本
上手难度 低,零脚本 高,需要 JS 编程能力
分析速度 快,即开即用 慢,需要编写调试
灵活度 中,预定义命令 高,完全自定义
Java 层分析 优秀 优秀
Native 层分析 基础 强大
条件逻辑 不支持 完全支持
参数构造 简单类型 支持任意复杂对象
批量操作 需逐条命令 脚本循环即可
可复用性 命令历史 脚本文件分发

最佳实践建议

在实际逆向工作中,推荐的使用策略是:

  1. 先用 Objection 快速摸底:连接目标应用,搜索类、查看方法、浏览内存,快速建立对应用结构的认知
  2. 定位关键点后再用 Frida 脚本深入:找到关键的检测函数、加密函数后,编写自定义 Frida 脚本进行精确 Hook
  3. 两者结合使用:用 Objection 的 android hooking 命令确认类名和方法签名,再在 Frida 脚本中使用这些信息进行精确 Hook
# 先用 Objection 搜索确认方法签名
android hooking list class_methods com.example.app.CryptoHelper

# 再编写 Frida 脚本进行精确 Hook
# hook_crypto.js
Java.perform(function() {
    var Crypto = Java.use('com.example.app.CryptoHelper');
    Crypto.encrypt.overload('java.lang.String', '[B').implementation = function(key, data) {
        console.log('[*] encrypt called');
        console.log('[*] key:', key);
        console.log('[*] data length:', data.length);
        var result = this.encrypt(key, data);
        console.log('[*] encrypted length:', result.length);
        return result;
    };
});

这种组合方式既利用了 Objection 的快速探索能力,又发挥了 Frida 脚本的灵活性,是目前 Android 逆向分析中最实用的技术路线之一。