0x01 安装

下载地址:

https://github.com/sensepost/objection/releases

现在最新版的objection为1.11.0

image-20240710105651985

objection是通过Frida来提供服务的,所以安装objection之前要先安装frida


按照推荐版本来做:(这块Python版本使用3.7的,不然后面肯会报错

frida 12.8.0
frida-tools 5.3.0
objection 1.8.4
jnitrace 3.0.8

想要使用基于frida版本的objection,只需要安装好特定版本的frida和frida-tools,再去objection的releases里面找那个日期之前一点点的版本即可,比如以frida 12.8.0 版本为例:

1、首先安装特定版本的 frida

pip  install frida==12.8.0
pip install frida-tools==5.3.0

2、然后,安装objection

pip  install  objection==1.8.4

3、frida配置到手机

查看Android手机设备设置 getprop ro.product.cpu.abi

img

据cpu版本去下载相应frida-server,手机是x86_64的,找到相应的服务器server,如下

image.png

将frida-server下载下来,解压出来,为了简单,重命名为将frida-server下载下来,加压出来,为了简单,重命名为frida-server64,将放到手机,并进行端口转发,运行frida,将放到手机,并进行端口转发,运行frida

E:\frida
λ adb push frida-serverx86 /data/local/tmp
frida-serverx86: 1 file pushed. 6.7 MB/s (28209380 bytes in 3.992s)

E:\frida
λ adb shell
root@aosp:/ # cd /
root@aosp:/ # cd data/local/tmp/
root@aosp:/data/local/tmp # chmod 777 frida-serverx86
root@aosp:/data/local/tmp # ./frida-serverx86
WARNING: linker: ./frida-serverx86: unused DT entry: type 0x6ffffef5 arg 0x1c60

运行 frida-ps -U 查看是否正常运行

4、排错

这块安装好后,直接运行frida或者objection会报错,原因如下:

解决python urllib3 v2.0 only supports OpenSSL 1.1.1+, currently-CSDN博客

windows安装frida运行环境_failed to load the frida native extension-CSDN博客

5、安装成功

image.png

【注意】有的APP应用可能会对frida默认的端口做检测,这里可以选用一个不常用的端口,如7777

./frida-server  -l 0.0.0.0:7777

image.png

0x02 objection命令详解

objection -g com.zj.wuaipojie -d explore   //objection连接到要附加的APP进程
-g:后面跟包名
-d:输出调试信息

image.png

输入 “空格” 可以发现里面内置的一些命令,如frida、env等

image.png

image.png

import xxx.js //导入frida的脚本

image.png

memory模块

列出内存中加载的库

memory list modules  //列出内存中加载的库

如果要把结果以json格式输出到本地可以在指令后添加参数:
memory list modules --json /root/modules.json

image.png

列出某个库的导出函数

memory list exports  xxx   //列出某个库的导出函数

memory list exports "libbinder.so" //这块列出 libbinder.so 文件的导出函数

image.png

提取内存数据

提取内存数据
memory dump from_base 0x12fc9c78 9 /root/memory.txt
//从内存中提取其地址为 0x12fc9c78 长度为 9bit 的数据

img

搜索内存数据

搜索内存数据
想找到“aaaqqq”运行
memory search "61 61 61 71 71 71"
或者模糊搜索
memory search "61 61 61 71"、memory search "61 61 61 ?? ?? 71"。

img

也可以增加参数通过字符串搜索,运行memory search "aaaqqq" --string,此方式不支持模糊搜索

img

写入内存数据

通过内存地址可以写入数据,比如搜索TextView的文字“Helloword”并通过memory write 0x12fc9c78 ‘61 61 61’修改其中一处结果,再把进程切换一下后台&前台,就刷新成修改的数据了。

memory write 0x12fc9c78 '61 61 61'

img

Android模块(常用)

列出内存中加载的所有类

android hooking list classes

image.png

列出指定类的所有方法

假设要查看APP MainActivity 类的方法,运行android hooking list class_methods com.zyc.objectiondemo.MainActivity,可以看到只打印了属于该类的方法,继承来的并不会打印。

android hooking class com.zyc.objectiondemo.MainActivity

img

在内存中所有的类里搜索类

从已加载的类里查找和“zyc”关键字,运行android hooking search classes zyc。

android hooking search classes zyc

img

在所有类中搜索指定方法

假设要搜索带“onCreate”的方法,运行android hooking search methods onCreate。该指令会遍历内存中所有已加载类的所有方法执行搜索,数据量非常大,过程相当耗时,甚至容易卡死和崩溃,所以会在运行前手动输入“y”同意

android hooking search methods onCreate

img

列出所有Activity、Service、Receiver

查看APP的组件使用如下命令。

android hooking list activities
android hooking list services
android hooking list receivers

img

(1)启动activity

android intent launch_activity com.md.obj.ui.PlayerActivity

(2)启动services

android intent launch_service [services_class]  

内存堆上搜索实例

从用例代码可知,运行APP进入 MainActivity 后会创建3个Car对象,此时如果想查看内存中的Car实例

android heap search instances com.zyc.objectiondemo.Car

img

调用实例的方法

搜索到实例获取地址后可调用其方法。如果要调用实例1的 show() 方法,运行:

android heap execute 68389604 show

img

实时注入实例

拿到实例后可以直接在实例上书写js注入,运行

android heap evaluate 23973990 会进入js编辑器,可以实时编写、注入、调试,但没有代码提示。

img

导入hook代码

objection支持导入Hook js文件使用,比如 /root/Desktop/objectionHook.js 有下面Hook代码:

function main() {
Java.perform(function () {
console.log("Hook start...");
var Car = Java.use("com.zyc.objectiondemo.Car");
Car.show.overload("int").implementation = function (arg1) {
console.log("Hook show..." + arg1);
return this.show(arg1);
}
});
}

setImmediate(main())

运行import /root/Desktop/objectionHook.js就可以在objection中直接使用了。

img

hook一个类中的所有方法

运行android hooking watch class com.zyc.objectiondemo.Car可以Hook到Car类下所有方法(不包括构造方法)的调用。

android hooking watch class com.zyc.objectiondemo.Car

img

hook一个类中的单个方法

如果只需要Hook单个方法(包括其重载),比如上面没有Hook到的Car类构造函数,可以运行:

android hooking watch class_method com.zyc.objectiondemo.Car.$init。

img

如果不需要Hook方法的重载,可以在方法名后面加上参数类型:

android hooking watch class_method com.zyc.objectiondemo.Car.$init "int,java.lang.String"

img

指令末尾加上对应选项可以展示参数、返回值和调用栈,运行:

android hooking watch class_method com.zyc.objectiondemo.Car.show --dump-args --dump-return --dump-backtrace

img

关闭SSLPinning检测

android sslpinning disable

image.png

关闭app的root校验

android root disable        

尝试模拟root环境

android root simulate

系统任务jobs

objection可以同时运行多项任务,比如下图创建Hook任务时打印了任务id 629342,通过指令jobs list能查看当前运作的任务。

jobs list

img

可以通过id结束某项任务,运行jobs kill 629342。

jobs kill 629342

img

0x03 objection批量trace

要实现对APP中的所有类进行hook,需要怎么做呢???

1、先查找APP中的所有类

android hooking search classes com.zj.wuaipojie

image.png

2、将这8个类复制下来,放到txt中

image.png

3、给这些类前面批量添加字符串 “android hooking watch class”

image.png

4、使用命令对所有类进行hook

在刚开始附加进程的时候,使用参数 -c

objection -g com.zj.wuaipojie -d explore -c 1.txt

image.png

0x04 Wallbreaker插件

Wallbreaker是一个实时分析 Java 堆的有用工具,由frida提供支持。提供一些命令从内存中搜索对象或类,并精美地可视化目标的真实结构。

1、下载安装

mkdir -p ~/.objection/plugins/
git clone https://github.com/hluwa/Wallbreaker ~/.objection/plugins/Wallbreaker

2、加载

# 第一种方法:
objection -g com.example.androiddemo explore -P ~/.objection/plugins
# 第二种方法:
objection -g com.example.androiddemo explore
plugin load ~/.objection/plugins/Wallbreaker

3、命令使用

# 搜索类
plugin wallbreaker objectsearch LoginActivity
//返回:
com.example.androiddemo.Activity.LoginActivity
com.example.androiddemo.Activity.LoginActivity$1

# 根据类名搜索内存中已经被创建的实例,列出 handle 和 toString() 的结果 --fullname 打印完整的包名
plugin wallbreaker classdump com.example.androiddemo.Activity.LoginActivity --fullname

# 搜索对象
plugin wallbreaker objectsearch com.example.androiddemo.Activity.LoginActivity
//返回:
[0x2262]: com.example.androiddemo.Activity.LoginActivity@d8a5160

# 查看对象的一些属性和方法
plugin wallbreaker objectdump 0x2262 --fullname

img

0x05 FRIDA-DEXDump 脱壳插件

frida-dexdump :快速的从内存中搜索和转存DEX

1、安装

git clone https://github.com/hluwa/FRIDA-DEXDump ~/.objection/plugins/dexdump

2、启动

plugin dexdump dump

3、返回值

[DEXDump]: DexSize=0x1d1f50, DexMd5=7ed584af40ef0b1bc211688395e92c98,SavePath=/root/.objection/plugins/com.example.androidemo/0x7e38c0201c.de

0x06 watch_events 插件

git clone https://github.com/hluwa/objection-plugins ~/.objection/plugins  --recurse-submodules

objection -g com.app.name explore -P ~/.objection/plugins

这里安装成功后,也会自动加载 wallbreaker 、dexdump

开启后,点击屏幕按钮,比如这里我提交了登录按钮,打印出来它的类,实现了快速定位。

plugin watch_event onclick

com.example.androiddemo on (google: 8.1.0) [usb] # (agent) [WatchEvent] onClick:
com.example.androiddemo.Activity.LoginActivity$1

0x07 objection实战分析加密参数

1、目标

此次演示的APP是一个通过测试的APP,这里我们就不写一行代码,也不用反编译工具分析代码,全程用objection来分析。通关第一关登录。

2、分析

此次分析的目的找到当前登录页面的类。android hooking list activities

img

3、hook这个类

img

4、提交按钮,得到返回值:

img

5.将得到返回值

2f02e24ae2e1fe880399f27600afa88364e6062bf9bbe114b32fa8f23d03608a 输入密码框中提交代码,发现成功通过第一关。

adb shell input text '2f02e24ae2e1fe880399f27600afa88364e6062bf9bbe114b32fa8f23d03608a'