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 基类并实现 register 和 handle 方法:
# 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
分析要点
通过以上流程,我们可以在几分钟内获取以下安全评估信息:
- Root 检测机制:是否实现了 Root 检测,检测逻辑是否完善
- 加密实现:使用的是系统 KeyStore 还是自定义加密,密钥是否存在硬编码
- 数据存储:敏感数据是否加密存储,是否存在明文存储的凭证
- 网络安全:是否实现了 SSL Pinning,使用的加密库版本是否安全
- 文件权限:应用私有目录中的文件是否包含敏感信息泄露
Objection 的局限性与自定义 Frida 脚本的对比
Objection 的局限性
尽管 Objection 功能强大,但它并非万能工具,存在以下局限:
- 仅支持 Java/Kotlin 层:大部分命令作用于 Java 层,对 Native 层(SO 库中的函数)的支持有限,复杂 SO 层分析仍需编写 Frida 脚本
- Hook 粒度受限:
set return_value只能修改返回值,无法在方法执行前后插入自定义逻辑(如打印参数、修改参数后再调用原方法) - 无条件逻辑:无法根据运行时条件动态决定是否拦截,每次 Hook 都是全量拦截
- 批量操作不便:需要 Hook 多个方法时,需要逐条执行命令,不如脚本灵活
- 复杂参数构造困难:当需要构造复杂对象作为参数调用方法时,Objection 的能力有限
与自定义 Frida 脚本的对比
| 对比维度 | Objection | 自定义 Frida 脚本 |
|---|---|---|
| 上手难度 | 低,零脚本 | 高,需要 JS 编程能力 |
| 分析速度 | 快,即开即用 | 慢,需要编写调试 |
| 灵活度 | 中,预定义命令 | 高,完全自定义 |
| Java 层分析 | 优秀 | 优秀 |
| Native 层分析 | 基础 | 强大 |
| 条件逻辑 | 不支持 | 完全支持 |
| 参数构造 | 简单类型 | 支持任意复杂对象 |
| 批量操作 | 需逐条命令 | 脚本循环即可 |
| 可复用性 | 命令历史 | 脚本文件分发 |
最佳实践建议
在实际逆向工作中,推荐的使用策略是:
- 先用 Objection 快速摸底:连接目标应用,搜索类、查看方法、浏览内存,快速建立对应用结构的认知
- 定位关键点后再用 Frida 脚本深入:找到关键的检测函数、加密函数后,编写自定义 Frida 脚本进行精确 Hook
- 两者结合使用:用 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 逆向分析中最实用的技术路线之一。