Objection快速逆向

Objection是基于Frida的工具。

Objection介绍

  在Frida提供的各种API基础之上可以实现无数的具体功能,Objection可以说是一个将各种常用功能整合进工具中供我们直接在命令行中使用的利器,Objection甚至可以不写一行代码就能进行App的逆向分析。

  Objection集成的功能主要支持Android和iOS两大移动平台。在对Android的支持中,Objection可以快速完成如内存搜索、类和模块搜索、方法Hook以及打印参数、返回值、调用栈等常用功能。

Objection三大组成部分

第一部分指Objection重打包的相关组件。Objection可以将Frida运行时所需要的frida-gadget.so重打包进App中,从而完成Frida的无root调试。
第二部分指Objection本身。Objection是一个Python的pypi包,可以和包含frida-gadget.so这个文件的App进行交互,运行Frida的Hook脚本,并分析Hook结果。
第三部分指Objection从TypeScript项目编译而成的一个agent.js文件。该文件在App运行过程中插了Frida运行库,使得Objection支持的所有的功能成为可能。
Objection依托Frida完成了对应用的注入以及对函数的Hook模板,使用时只需要将具体的类填充进去即可完成相应的Hook测试。

Objection安装使用

安装

Objection的运行条件:
1.Python的版本大于3.4。可通过python -V 查看

2.Python的包管理软件pip的版本大于9.0.可通过pip --version查看版本。

3.使用pip命令安装Objection。
  在安装前,要知道Frida版本更新很快,不同的Frida可能支持的API不尽相同,要尽量选择Objection在Frida相应版本靠近的。可以通过在pypi官网查看Objection不同版本的发布时间,同时使用GitHub Frida的仓库查看查看Frida发布时间进行对比确认。
先查看自己的Frida版本

找到发布时间

查Objection版本发布时间,这里最新的是1.11.0

pip安装
pip install objection==1.11.0

查看版本

使用

使用界面和基本命令如下

Objection默认通过USB连接设备,这里不必和Frida的命令行一样通过指定USB模式连接,同时主要通过-g参数指定注入的进程并通过explore命令进入REPL模式。
进入REPL模式后便可以使用Objection进行Hook的常用命令。
Objection支持通过-N参数来指定网络中的设备并通过-h参数和-p参数来指定对应设备的IP和端口以进行连接,从而对网络设备的注入与Hook。
此外还可以通过patchapk命令将frida-gadget.so打包进App等。
现在以Android系统基本应用”设置”为例来介绍Objection的REPL模式常用命令。
先确认手机使用USB线连接手机后,运行相应的frida-sever,运行“设置”应用以通过frida-ps找到对于应的App及其包名,具体

1
frida-ps -U | grep setting 

在Windows中代码要稍微修改下

找到设置的包名com.android.settings后,通过objection注入“设置”应用,注入成功后便进入了Objection的REPL界面,具体操作命令及结果如下

在学习Objection的REPL界面命令之前,首先要了解空格键的作用。在Objection REPL 界面中,当不知道命令时通过按空格键就会揭示可用的命令,出现提示后通过上下选择键及回车键便可以输入命令。

(1)help命令。知道当前命令效果时,在当前命令前加help(如help env)再回车就会出现当前命令的解释信息

(2)jobs命令。作业系统很好用,用于查看和管理当前所执行Hook的任务,可以同时运行多项Hook作业。
(3)Frida命令。查看Frida相关信息

(4)内存漫游相关命令。Objection可以快速便捷地打印出内存中的各类相关信息。

  • 可以使用以下命令列出内存中的所有类
    android hooking list classes

    把类都列出来了
  • 可以使用以下命令在内存中所有已加载的类中搜索包含特定关键词的类。
    android hooking search classes 类名
    这里搜索display关键词的类
  • 使用以下命令从内存中搜索所有包含关键词key的方法。
    android hooking search method <key>
  • 搜索到感兴趣的类后,可以使用以下命令查看关心的类的所有方法。
    android hooking list class_methods
    这里以android.hardware.display.DisplayManager这个类为例
  • 以上是基础的Java类相关的内容。在Android中,四大组件很值得关注,Objection在这方面也提供支持,通过以下命令列出进程中所有的activity。
    android hooking list activities
  • 通过以下命令列出进程所有的service。
    android hooking list services

    需要列出其他两个组件信息时,只要将对应的地方更换为receivers和providers即可
    (5)Hook相关命令。通过以下命令对指定的方法进行Hook。
    android hooking watch class_method <methodName>
    这里选择Java中File类的构造函数进行Hook,结果如下:

      上述命令中,我们加上了–dump-args –dump-backtrace –dump-return三个参数,分别用于打印函数的参数、调用栈以及返回值。这三个参数对逆向分析的帮助很大:有些函数的明文和密文非常有可能放在参数和返回值中,而打印调用栈可以让分析者快速进行调用链的溯源。
      此时虽然只确定了Hook构造函数,但是默认会Hook对应方法的所有重载。
      最后一行输出的(agent) Registering job 883246.,这表示Hook被作为一个“作业添加到Objection的作业系统中了”,此时运行jobs list命令就可以查看到这个“作业”的相关信息,如下图,可以看到Job ID对应的是883246,同时Hooks对应的6正是Hook的函数的数量。

      当我们在“设置”应用中任意位置进行点击时,会发现java.io.File.File(java.io.File, java.lang.String)函数被调用。在Backtrace之后打印的调用栈中,可以清除看到这个构造函数的调用来源
      调用栈的顺序是从下至上的,其中的信息有文件路径,文件名,返回值。

    测试完了根据“作业”的ID来删除“作业”,取消对这些函数的Hook
    jobs kill <id>
    最终执行结果

      除了可以直接Hook一个函数之外,Objection还可以通过执行如下命令实现对指定类calssname中所有函数的Hook(这里的所有函数并不包括构造函数的Hook)
    android hooking watch class <classname>
    以java.io.File类为例,执行结果如下:

    执行jobs list查看Hook的函数个数

(6)主动调用:android heap相关命令。
主动调用在Objection中的使用。

  • 基于最简单的Java.choose的实现,在Frida脚本中,对实例的搜索在Objection中使用以下命令实现:
    android heap search instance <classname>
    这里以java.io.File类为例,搜索到很多File的实例,并打印对应的Handle和toString()的结果
  • 在Objection中调用实例方法的方式有两种。
    第一种使用以下命令调用实例方法
    android heap execute <Handle> <methodname>
    这里的实例方法指的是没有参数的实例方法。
    使用HashCode值为1645413532所对应的实例来执行File的getPath方法,结果与上图中的一致。

    如果使用execute执行带参函数会报错。
    如要执行带参数的函数,则需先执行以下命令:
    android heap evaluate <Handle>
    进入编辑器环境后,输入想要执行的脚本内容,确认编辑完成,然后按Esc退出,最后按回车键,会开始执行这行脚本并输出结果。