🛫 系列文章导航
- 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950
- 【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446
- 【Frida】【Android】03_RPC https://blog.csdn.net/kinghzking/article/details/137050967
- 【Frida】【Android】04_Objection安装和使用 https://blog.csdn.net/kinghzking/article/details/137071768
- 【Frida】【Android】05_Objection实战 https://blog.csdn.net/kinghzking/article/details/137071826
▒ 目录 ▒
- 🛫 系列文章导航
- 🛫 导读
- 需求
- 开发环境
- 1️⃣ Objection介绍
- 2️⃣ 安装
- 环境要求
- 安装
- 报错
- 3️⃣ 使用
- objection --help
- 进入REPL界面
- help命令
- exit命令
- frida命令
- ui命令
- intent命令
- 内存漫游相关命令:hooking list / search
- Hook命令:class_method
- Hook命令:class
- jobs命令
- 主动调用命令:heap
- memory命令
- root命令
- 关闭 ssl 效验命令
- 🛬 文章小结
- 📖 参考资料
🛫 导读
需求
开发环境
版本号 | 描述 | |
---|---|---|
文章日期 | 2024-03-27 | |
操作系统 | Win11 - 22H2 | 22621.2715 |
node -v | v20.10.0 | |
npm -v | 10.2.3 | |
夜神模拟器 | 7.0.5.8 | |
Android | 9 | |
python | 3.9.9 | |
frida | 16.2.1 | |
frida-tools | 12.3.0 | |
objection | 1.11.0 | |
1️⃣ Objection介绍
Objection介绍如果说在Frida提供的各种API基础之上可以实现无数的具体功能,那么Objection就可以认为是一个将各种常用功能整合进工具中供我们直接在命令行中使用的利器,Objection甚至可以
不写一行代码就能进行App的逆向分析
。功能列表如下:
- 支持 iOS 和 Android。
- 检查容器文件系统并与之交互。
- 绕过 SSL 固定。
- 转储钥匙扣。
- 执行与内存相关的任务,例如转储和修补。
- 浏览和操作堆上的对象。
- ……
据官方Wiki所描述的,Objection主要有三大组成部分。
第一部分是指Objection
重打包
的相关组件。Objection可以将Frida运行时所需要的frida-gadget.so重打包进App中,从而完成Frida的无root调试。第二部分是指Objection本身。Objection是一个Python的
pypi包
,可以和包含frida-gadget.so这个so文件的App进行交互,运行Frida的Hook脚本,并分析Hook的结果。第三部分是指Objection从TypeScript项目编译而成的一个
agent.js文件
。该文件在App运行过程中插了Frida运行库,使得Objection支持的所有功能成为可能。
2️⃣ 安装
环境要求
- Python的版本大于
3.4
。- Python包管理软件pip的版本大于
9.0
。
- 使用
pip --version
查看版本- 使用
pip install pip --upgrade
升级pip- (可选的)virtualenv,版本大于15。
安装
使用pip命令安装Objection。官网的建议是直接执行以下命令:
pip3 install -U objection
。
objection
最新的release版本是1.11.0
,已经2021年4月的版本了。不过依然兼容最新的frida,使用该版本可以使用最新的frida。
报错
您可能面临的最常见错误可能如下所示,这意味着您正在尝试使用 Python 2 而不是 Python 3 进行安装。请安装 Python 3.4以上版本解决该问题。
Collecting objection
Could not find a version that satisfies the requirement objection (from versions: )
No matching distribution found for objection
3️⃣ 使用
objection --help
我们先看下objection的帮助界面:
从图可知:
- Objection默认通过USB连接设备,这里不必和Frida的命令行一样通过-U参数指定USB模式连接
- 通过
-g
参数指定注入的进程,- 通过
explore
命令进入REPL模式(交互模式)。在进入REPL模式后便可以使用Objection进行Hook的常用命令。- 通过
-N参数来指定网络
中的设备并通过-h参数和-p参数来指定对应设备的IP和端口以进行连接,从而完成对网络设备的注入与Hook。- 通过patchapk命令将frida-gadget.so打包进App。
进入REPL界面
根据上面的说明,我们以Android系统的基本应用“设置”为例来介绍Objection的REPL模式常用命令。
- 首先,我们启动夜神模拟器,并运行相应版本的frida-server。
- 然后,我们通过
frida-ps -Uai
找到“设置”应用的App及其包名,具体操作如下:
- 最后,在找到设置的包名
com.android.settings
后,通过objection注入“设置”应用,注入成功后便进入了Objection的REPL界面,具体操作命令以及结果如下:
objection -g com.android.settings explore
help命令
不知道当前命令的效果是什么时,在当前命令前加help(比如help env)再回车之后就会出现当前命令的解释信息:
exit命令
退出objection
frida命令
查看Frida相关信息。
小编的环境中,一开始执行的时候,报了下面的错误:
找到该文件,将这行注释了就可以了:
ui命令
//截图
android ui screenshot [image.png]
//设置FLAG_SECURE权限
android ui FLAG_SECURE false
intent命令
# 强制启动activity
android intent launch_activity com.example.androiddemo.Activity.FridaActivity1
# 强制启动service
android intent launch_service
内存漫游相关命令:hooking list / search
Objection可以快速便捷地打印出
内存中的各种类
的相关信息,这对App快速定位有着无可比拟的优势,下面介绍几个常用命令。
- 列出内存中的所有类
android hooking list classes
- 在内存中所有已加载的类中搜索包含特定关键词的
类
android hooking search classes
- 从内存中搜索所有包含关键词key的
方法
。
android hooking search methods <key>
从上文中可以发现,内存中已加载的类高达上万个。它们的方法是类的个数的数倍,整个过程会相当耗时。
- 类方法
搜索到我们感兴趣的类后,可以使用以下命令查看关心的类的所有方法
android hooking list class_methods
- 列出进程所有的四大组件列表
android hooking list activities
android hooking list services
android hooking list receivers
android hooking list providers
(命令有问题,待解决)
Hook命令:class_method
命令格式:
android hooking watch class_method <methodName>
这里选择Java中File类的构造函数进行Hook,结果如下:
android hooking watch class_method java.io.File.$init --dump-args --dump-backtrace --dump-return
在上述命令中,我们加上了–dump-args、–dump-backtrace、–dump-return三个参数,分别用于打印函数的参数、调用栈以及返回值。
这三个参数对逆向分析的帮助是非常大的:
- 有些函数的明文和密文非常有可能放在参数和返回值中。
- 打印调用栈可以让分析者快速进行调用链的溯源。
另外需要注意的是:
- 此时虽然只确定了Hook构造函数,但是默认会Hook对应方法的
所有重载
。- 在输出的最后一行显示Registering job 605559,这表示这个Hook被作为一个“作业”添加到Objection的作业系统中了,此时运行
job list
命令可以查看到这个“作业”的相关信息,如下图所示。可以发现这里的JobID对应的是605559,同时Hooks对应的6正是Hook的函数的数量。
当我们在“设置”应用中的任意位置进行点击时,会触发File的构造函数,将打印出堆栈、参数、返回值信息。
Hook命令:class
命令语法:
android hooking watch class <classname>
示例:android hooking watch class java.io.File
jobs命令
作业系统很好用,用于查看和管理当前所执行Hook的任务,建议一定要掌握,可以同时运行多项Hook作业。
- 增
像上面一样的hook命令,就可以增加job- 删
jobs kill <Job ID>
- 查看
job list
主动调用命令:heap
关于主动调用,可以参考《【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446》,在objection中,对应的是
android heap
相关命令
- 查找实例
语法:android heap search instances <classname>
示例:android heap search instances java.io.File
如图,可以搜索到很多File的实例,并且打印出对应的Hashcode和toString()的结果。其中Hashcode
作为Java对象的唯一标识,可以用于实例方法的调用。
- 调用实例方法(无参数)
语法:android heap execute <Hashcode> <methodname>
示例:android heap execute -54300376 getPath
下面演示一下执行File的getPath方法:
- 调用实例方法(带参数)
语法:android heap evaluate <Hashcode>
示例:android heap evaluate -54300376
执行上面的示例后,objection将进入一个迷你编辑器环境后,输入想要执行的脚本内容,确认编辑完成,然后按Esc键退出编辑器,最后按回车键,即会开始执行这行脚本并输出结果。
这里的脚本内容和在编辑器中直接编写的脚本内容是一样的(使用File类的canWrite()函数和setWritable()函数进行测试)
执行结果如下图所示:
memory命令
# 查看内存中加载的库
memory list modules
# 查看库的导出函数
memory list exports libssl.so
# 将结果保存到json文件中
memory list exports libart.so --json /root/libart.json
# 搜索内存
memory search --string --offsets-only
# 修改内存内容
memory write "<address>" "<pattern eg: 41 41 41 41>" (--string)
# dump所有内存
memory dump all <local destination>
# dump指定内存
memory dump from_base <base_address> <size_to_dump> <local_destination>
root命令
# 尝试关闭app的root检测
android root disable
# 尝试模拟root环境
android root simulate
关闭 ssl 效验命令
android sslpinning disable
🛬 文章小结
- objectin的命令是区分大小写的。
- 内存漫游相关命令,通过各种操作,让app加载更多的类,可以漫游出更多的内容!!!
📖 参考资料
- objection官网: https://github.com/sensepost/objection
- 《安卓Frida逆向与抓包实战》
- 【Frida】 00_简单介绍和使用 https://blog.csdn.net/kinghzking/article/details/123225580
- 本节源码地址 https://gitcode.com/android8/AndroidFridaBeginnersBook
ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。