Frida只是提供了各种API供我们调用,我们可以在此基础之上实现具体的功能。但是通常有一些脚本工具都是通用的。于是有大佬将各种常见、常用的功能整合进一个工具,供我们直接在命令行中使用,这个工具便是objection。
objection功能强大,命令众多,而且不用写一行代码,便可实现诸如内存搜索、类和模块搜索、方法hook打印参数返回值调用栈等常用功能,是一个非常方便的,逆向必备、内存漫游神器。
Objection演示
我们以安卓内置应用“设置”为例,来示范一下基本的用法。
将 frida-server 推到 root 过的 pixel 设备:
adb push fs1522 /data/local/tmp/
在手机上启动frida-server :
./fs1522 -l 0.0.0.0:2333
可能会遇到了下面的问题:
Unable to load SELinux policy from the kernel: Failed to open file “/sys/fs/selinux/policy”: Permission denied
原因是没有切到 root 用户下,su 一下就好了。运行成功截图:
点击“设置”图标,手机进入设置的界面,首先查看一下“设置”应用的包名。
┌──(root㉿kali)-[~]
└─# frida-ps -Ua | grep -i settings
12035 Settings com.android.settings
这里的 Settings 是应用名,应用包名是:com.android.settings
再使用objection注入“设置”应用。
objection -N -h 192.168.3.12 -p 2333 -g com.android.settings explore
这里的端口需要与开启 fs 设置的端口对应。
启动objection之后,会出现如下界面:
说一下我的工具版本,如果启动 objectin 时出现一些 python 错误,可以尝试用 pyenv 装个别的版本:
Python 3.8.8
pip3 install frida==15.2.2
pip3 install frida-tools==10.4.1
pip3 install objection==1.11.0
常用命令
空格键: 忘记命令直接输入空格键, 会有提示与补全
help: help [command] 会有详细介绍指定命令的作用与例子
env: 可以使用该env命令枚举与所讨论的应用程序相关的其他有趣目录
memory list modules: 查看当前进程中加载的库
memory list exports libssl.so:查看so中的导出函数
memory list exports libart.so --json /root/libart.json: 当结果太多,终端无法全部显示的时候,可以将结果导出到文件中,然后使用其他软件查看内容
堆搜素与执行
android heap search instances com.android.settings.DisplaySettings: 我们查看[AOSP源码关于设置里显示系统设置的部分](androidxref.com/9.0.0_r3/xr…
上图表示这个类还没有实例,是因为我们还没有打开这个界面,我们在手机上打开显示设置界面,再执行这个命令,得到如下界面:
android heap execute 216064383 getPreferenceScreenResId: 查看源码得知com.android.settings.DisplaySettings类有着getPreferenceScreenResId()方法,这样就可以直接调用该实例的getPreferenceScreenResId()方法,用excute命令:
可以看到我们传递的是类的 hashcode 来作为调用主体。
android heap evaluate 216064383: 该命令会进入一个迷你编辑器环境,输入console.log("evaluate result:" + clazz.getPreferenceScreenResId())这串脚本,按ESC退出编辑器,然后按回车,即会开始执行这串脚本,输出结果。在这个迷你环境里面可以调用带参数的方法:
启动Activity或者Service
android intent launch_activity com.android.settings.DisplaySettings: 想要进入显示设置,可以在任意界面直接运行以下代码进入显示设置界面。有些软件如果没有做校验的话,可以直接使用这个命令跳过注册登录,进入想要看的界面。
android hooking list activities: 查看当前可用的activities 。
启动 service: 就不展示了,一般不太用到,也可以先使用android hooking list services查看可供开启的服务,然后使用android intent launch_service com.android.settings.bluetooth.BluetoothPairingService命令来开启服务。
寻找类与方法
android hooking list classes: 列出内存中所有的类,比较耗时,有几千上万个类。
android hooking search classes display: 在内存中所有已加载的类中搜索包含特定关键词的类。
输出有提示,能搜索到类的前提是该类已经被加载过了。
android hooking search methods updateDisplay: 在内存中所有已加载的类的方法中搜索包含特定关键词的方法,也是一个耗时的命令。
有些类会报错,不过没关系,会继续搜索,看最终搜索结果:
android hooking list class_methods com.android.settings.DisplaySettings: 当搜索到了比较关心的类之后,就可以直接查看它有哪些方法,比如我们想要查看com.android.settings.DisplaySettings类有哪些方法:
展示的不是很好看,但是我们可以安装插件让它显示的好看点。
android hooking generate simple com.android.settings.DisplaySettings: 上文中在列出类的方法时,还直接把参数也提供了,也就是说我们可以直接动手写hook了,既然上述写hook的要素已经全部都有了,objection这个“自动化”工具,当然可以直接生成代码。
生成的代码大部分要素都有了,只是参数貌似没有填上,还是需要我们后续补充一些,无法做到完美。
Hook使用
上述介绍的操作均是基于在内存中直接枚举搜索,已经可以获取到大量有用的静态信息,我们再来介绍几个方法,可以获取到执行时动态的信息,当然、同样地,不用写一行代码。
android hooking watch class com.android.settings.DisplaySettings: 我们还是以显示设置里面的显示界面为例子简单地演示一下。
- 首先我们打开设置的显示界面
- 然后我们运行上面的命令,
hook这个类:
可以看到 objcetion 自动为我们 hook 了这个类的所有方法,我们使用 jobs list 命令查看一下:
这个时候,我们调节一下显示亮度,就会发现自动打印出了日志:
说明调节亮度会调用到这个方法。
android hooking watch class_method com.android.settings.DisplaySettings.getMetricsCategory --dump-args --dump-return --dump-backtrace: 如果我们对某个方法感兴趣,就可以查看这个方法的参数、返回值和调用栈:
再操作一下屏幕亮度调节按钮,得到如下输出:
是不是非常的牛逼呢!!!
android hooking watch class_method java.io.File.$init --dump-args: objection的help中指出,在hook给出的单个方法的时候,会hook它的所有重载,除非我们给出了需要hook的方法的全限定名。这里objection为我们hook了File构造器的所有重载,一共是6个。
随便操作一下按钮,就能得到输出:
插件介绍
objection 还可以安装插件。
首先,我们找到想要安装的插件,比如 Wallbreaker:
然后 clone 下来:
mkdir -p ~/.objection/plugins/
cd ~/.objection/plugins/
git clone https://github.com/hluwa/Wallbreaker
在 objection 里面安装:
plugin load /root/.objection/plugins/Wallbreaker
安装成功:
使用看文档就好了,简单演示一下:
这个作者还有一个脱壳的插件:github.com/hluwa/frida…
用法看文档就好了。