9、Objection运行时探索:Objection安装与使用、内存漫游、类与方法搜索、绕过Root检测
说到Objection,我得先坦白一件事。几年前我第一次接触它时,心里想的是:「这不就是个frida的套壳工具吗?」结果真用起来,才发现自己错了。Objection真正厉害的地方,是它把frida那些繁琐的脚本编写,变成了命令行里的一句指令。说白了,它让运行时探索变得像逛超市一样简单——你不需要每次都自己写购物清单,直接拿就行了。
9.1 Objection是什么?为什么需要它?
Objection是一个基于Frida的运行时移动探索工具。它的核心价值在于:无需编写任何代码,就能完成大部分逆向分析工作。
我个人的习惯是:遇到一个App,先上Objection做一轮快速扫描。如果发现关键点,再写frida脚本深入分析。这样效率最高。
核心能力一览:
- 内存漫游:查看当前内存中的对象、类、模块
- 类与方法搜索:快速定位目标类和方法
- 方法Hook:无需写代码即可Hook任意方法
- 绕过检测:Root检测、SSL Pinning等
- 插件系统:社区贡献了大量实用插件
9.2 安装与配置
安装其实很简单,但有几个坑我得提前说。
9.2.1 基础安装
# 使用pip安装
pip install objection
# 验证安装
objection version
嗯,这里要注意:Python版本建议3.8以上。我曾经在Python 3.6上踩过坑,某些插件会报错。
9.2.2 连接设备
Objection需要配合frida-server使用。流程是这样的:
- 手机端启动frida-server
- PC端用objection连接
# 启动frida-server(手机端)
adb shell
su
/data/local/tmp/frida-server -l 0.0.0.0:8888 &
# PC端连接
objection -g com.example.app explore
注意:frida-server版本必须和PC端的frida版本一致。我曾经因为版本不匹配,折腾了整整一个下午才发现问题。
9.3 内存漫游:看看App肚子里有什么
内存漫游是Objection最常用的功能之一。说白了,就是让你看看App运行时,内存里到底装了些什么东西。
9.3.1 查看已加载的模块
# 列出所有加载的模块
objection> memory list modules
# 搜索特定模块
objection> memory list modules | grep -i "so"
你想想看,一个App加载了哪些so文件,往往能透露出很多信息。比如看到libcms.so,八成是用了某种加固方案。
9.3.2 查看类信息
# 列出所有类(慎用,数据量巨大)
objection> android heap search instances com.example
# 搜索特定类
objection> android heap search instances com.example.security
小技巧:我一般会先搜索包名相关的类,缩小范围。比如com.example.security,大概率是安全相关的类。
9.4 类与方法搜索:精准定位目标
这是Objection最强大的功能之一。你不需要写任何Hook代码,就能找到目标方法。
9.4.1 搜索类
# 搜索包含"root"的类
objection> android hooking search classes root
# 搜索包含"check"的类
objection> android hooking search classes check
9.4.2 搜索方法
# 搜索特定类中的方法
objection> android hooking list class_methods com.example.security.RootDetector
# 搜索所有类中包含"root"的方法
objection> android hooking search methods root
我记得有一次分析一个金融App,就是通过search methods root找到了三个隐藏的Root检测点。如果用手工反编译,可能要花半天时间。
9.5 绕过Root检测:实战演练
好,到了最激动人心的部分。绕过Root检测,是很多逆向工程师的入门必修课。
9.5.1 常见的Root检测方式
| 检测方式 | 原理 | 绕过方法 |
|---|---|---|
| 文件检测 | 检查/system/bin/su等文件是否存在 |
Hook File.exists() |
| 进程检测 | 检查是否有su进程运行 |
Hook ProcessBuilder |
| 属性检测 | 检查ro.debuggable等系统属性 |
Hook SystemProperties.get() |
| 签名检测 | 检查App签名是否被篡改 | Hook PackageManager |
9.5.2 使用Objection一键绕过
Objection内置了绕过Root检测的插件,一条命令搞定:
# 启用Root检测绕过
objection> android root disable
# 或者使用更全面的绕过
objection> android hooking list classes
但说实话,内置插件只能对付简单的检测。遇到定制化的检测逻辑,还是得手动Hook。
9.5.3 手动Hook绕过示例
假设App的Root检测逻辑在com.example.security.RootDetector.isRooted()方法中:
# Hook该方法,强制返回false
objection> android hooking set return_value com.example.security.RootDetector.isRooted false
就这么简单。Objection会自动生成Hook代码并注入到App中。
实战经验:我曾经遇到一个App,它把Root检测结果加密后上传到服务器。单纯Hook方法返回值没用,因为服务器端也会校验。这时候需要同时Hook网络请求,把加密数据也改掉。嗯,逆向就是这样,永远有新的挑战。
9.6 知识体系总览
下面这张图,是我个人总结的Objection运行时探索知识体系。你可以把它当作一个快速索引:
9.7 避坑指南
最后,分享几个我踩过的坑:
- 版本匹配问题:我曾经因为frida-server版本和PC端frida版本不一致,导致Objection连接后一直报错。解决方案:用
pip list | grep frida查看版本,然后下载对应版本的frida-server。 - App崩溃问题:有些App有反调试机制,Objection一注入就崩溃。这时候可以试试
--no-resume参数,先暂停App,注入完成后再恢复。 - 内存搜索卡死:搜索所有类时,如果App类太多,Objection可能会卡死。建议先搜索包名相关的类,缩小范围。
- 绕过检测失效:内置的
android root disable只能对付常见的检测方式。遇到定制化检测,还是得手动分析。
我的建议:Objection是一个很好的起点,但不要过度依赖它。真正的高手,是能用Objection快速定位问题,然后用frida脚本深入分析。两者结合,才是王道。
公众号:蓝海资料掘金营,微信deep3321