JS ` objection` (`Frida` 的上层封装):自动化逆向与 Hooking

咳咳,各位观众老爷,晚上好!欢迎来到今天的“懒人逆向福音:Objection + Frida 自动化 Hooking” 讲座。我是你们的老朋友,今晚负责带大家偷懒的讲师。

咱们今天的主题,就是如何用 Objection 这个好东西,结合 Frida 的强大能力,让逆向工程变得更轻松、更自动化。说白了,就是教大家怎么“优雅”地偷懒!

第一部分:啥是 Objection?为啥要用它?

首先,咱们得明白 Objection 是个啥玩意儿。简单来说,Objection 就是 Frida 的一个“高级”封装。Frida 就像一个强大的底层工具库,啥都能干,但用起来稍微有点麻烦。而 Objection,就像一个已经帮你组装好的工具箱,里面放着常用的 Frida 脚本,可以直接拿来用,大大简化了操作。

为什么要用 Objection 呢?理由很简单:

  • 省时间! 很多常用的 Hooking 操作,Objection 都已经帮你封装好了,一行命令搞定,不用自己写 Frida 脚本。
  • 更简单! Objection 的命令更简洁易懂,上手更快,即使你对 Frida 不太熟悉,也能快速入门。
  • 更安全?(这个存疑,但某种程度上是对的)Objection 封装了一些安全检查,可以避免一些常见的 Frida 使用错误,比如内存泄露。

总之,Objection 就是一个让你更高效、更轻松地进行逆向工程的利器。

第二部分:Objection 安装与环境搭建

要用 Objection,首先得把它装好。这部分非常重要,环境不对,一切白费。

  1. 安装 Python 和 pip

    Objection 是基于 Python 开发的,所以你得先安装 Python。推荐使用 Python 3.x 版本。安装好 Python 后,pip(Python 包管理器)也会自动安装。

    验证是否安装成功:

    python --version
    pip --version

    如果显示版本号,就说明安装成功了。

  2. 安装 Objection

    打开终端,运行以下命令:

    pip install objection

    等待安装完成。

  3. 安装 Frida

    Objection 依赖 Frida,所以你还得安装 Frida。

    pip install frida-tools
  4. 在目标设备上安装 Frida Server

    这步至关重要!Frida Server 是运行在目标设备上的一个程序,负责与你的 Frida 客户端(也就是 Objection)进行通信。

    • 找到合适的 Frida Server 版本

      你需要找到与你设备上运行的 Frida 版本匹配的 Frida Server 版本。可以在 Frida releases 页面下载。

      重要提示: 你的设备需要 root 权限才能运行 Frida Server。

    • 将 Frida Server 推送到设备

      使用 adb(Android Debug Bridge)工具将 Frida Server 推送到设备:

      adb push frida-server /data/local/tmp/
    • 赋予 Frida Server 执行权限

      adb shell "chmod 755 /data/local/tmp/frida-server"
    • 运行 Frida Server

      adb shell "/data/local/tmp/frida-server &"

      & 符号表示在后台运行 Frida Server。

第三部分:Objection 常用命令详解

Objection 的命令非常多,但常用的也就那么几个。咱们来逐一讲解:

命令 功能 示例
objection -g <package> 连接到目标应用。<package> 是应用的包名。 objection -g com.example.app explore
android hooking list activities 列出应用的所有 Activity。 android hooking list activities
android hooking list services 列出应用的所有 Service。 android hooking list services
android hooking list receivers 列出应用的所有 Broadcast Receiver。 android hooking list receivers
android hooking list classes 列出应用的所有 Class。 android hooking list classes
android hooking list methods <class> 列出指定 Class 的所有方法。<class> 是 Class 的完整名称。 android hooking list methods com.example.MyClass
android hooking watch class <class> 监听指定 Class 的所有方法调用。 android hooking watch class com.example.MyClass
android hooking watch method <class>.<method> 监听指定方法的调用。 android hooking watch method com.example.MyClass.myMethod
android hooking set attribute <class> <field> <value> 修改指定 Class 的字段值。<class> 是 Class 的完整名称,<field> 是字段名称,<value> 是要设置的值。 android hooking set attribute com.example.MyClass myField "new value"
android hooking get attribute <class> <field> 获取指定 Class 的字段值。 android hooking get attribute com.example.MyClass myField
memory list modules 列出应用加载的所有模块(比如 so 库)。 memory list modules
memory dump from <module> <start_address> <size> <file> 从指定模块的指定地址开始,dump 指定大小的内存到文件。<module> 是模块名称,<start_address> 是起始地址,<size> 是大小(字节),<file> 是保存的文件名。 memory dump from libnative-lib.so 0x12345678 1024 my_dump.bin
memory patch <address> <bytes> 修改指定地址的内存。<address> 是要修改的地址,<bytes> 是要写入的字节(十六进制字符串)。 memory patch 0x12345678 "00 00 00 00"
ios hooking list classes (iOS) 列出应用的所有 Class。 ios hooking list classes
ios hooking list methods <class> (iOS) 列出指定 Class 的所有方法。 ios hooking list methods MyClass

重要提示: 在使用这些命令之前,你必须先使用 objection -g <package> explore 命令连接到目标应用。

第四部分:实战演练:破解一个简单的 Android 应用

咱们来搞个简单的例子,破解一个简单的 Android 应用。这个应用有一个校验用户名和密码的功能,咱们要绕过这个校验。

  1. 找到校验函数

    首先,我们要找到负责校验用户名和密码的函数。这可能需要一些逆向分析的技巧,比如查看应用的 Smali 代码。假设我们找到了一个名为 checkCredentials 的方法,位于 com.example.app.AuthManager 类中。

  2. Hook 校验函数

    使用 Objection 的 android hooking watch method 命令来监听这个函数的调用:

    android hooking watch method com.example.app.AuthManager.checkCredentials

    输入错误的用户名和密码,看看这个函数是否被调用。如果被调用,说明我们找对了。

  3. 修改校验结果

    现在,我们要修改校验结果,让它永远返回 true。可以使用 Objection 的 android hooking set return 命令:

    android hooking set return com.example.app.AuthManager.checkCredentials true

    这个命令会 Hook checkCredentials 方法,并强制它返回 true。

  4. 测试破解结果

    再次输入错误的用户名和密码,看看是否能成功登录。如果能成功登录,恭喜你,破解成功了!

代码示例:Frida 脚本版(作为对比)

为了让大家更好地理解 Objection 的作用,咱们来看一下用 Frida 脚本实现同样功能的代码:

Java.perform(function() {
    var AuthManager = Java.use("com.example.app.AuthManager");
    AuthManager.checkCredentials.implementation = function(username, password) {
        console.log("Hooked checkCredentials method!");
        console.log("Username: " + username);
        console.log("Password: " + password);
        return true; // 强制返回 true
    };
});

这段代码需要你编写 JavaScript 脚本,并使用 Frida 命令行工具加载到目标应用。相比之下,Objection 的 android hooking set return 命令就简单多了。

第五部分:高级技巧与注意事项

  • 使用--verbose参数:Objection的很多命令都支持--verbose参数,可以打印更详细的调试信息,方便排查问题。
  • 自定义 Frida 脚本:Objection也支持加载自定义的 Frida 脚本,可以实现更复杂的功能。使用script load <script_path>命令加载脚本。
  • 处理混淆代码:如果应用使用了代码混淆,Objection 的一些命令可能无法正常工作。你需要先对应用进行反混淆,或者手动找到目标函数和类名。
  • 动态分析结合静态分析:Objection 主要用于动态分析,但结合静态分析工具(比如 jadx、IDA Pro)可以更好地理解应用的代码逻辑。
  • 注意安全问题:在使用 Frida 和 Objection 进行逆向工程时,要注意安全问题,避免泄露敏感信息。

第六部分:Objection 的局限性

虽然 Objection 很方便,但它也有一些局限性:

  • 依赖 Frida Server:Objection 依赖 Frida Server 运行在目标设备上,这意味着你需要 root 权限。
  • 功能有限:Objection 封装了一些常用的 Frida 脚本,但并非所有 Frida 功能都支持。对于一些特殊的需求,你可能需要自己编写 Frida 脚本。
  • 版本兼容性问题:Objection 和 Frida 都在不断更新,可能会出现版本兼容性问题。

第七部分:Objection 在 iOS 上的使用

Objection 同样支持 iOS 应用的逆向工程。使用方法与 Android 类似,但有一些差异:

  • 越狱设备:你需要一台越狱的 iOS 设备。
  • 安装 Frida Server:使用 Cydia 安装 Frida。
  • 使用 iOS 相关的命令:Objection 提供了一些 iOS 相关的命令,比如 ios hooking list classesios hooking list methods 等。

第八部分:总结与展望

Objection 是一个非常强大的 Frida 上层封装,可以大大简化逆向工程的流程。通过学习和掌握 Objection 的使用方法,你可以更高效、更轻松地分析和破解各种应用。

当然,Objection 并不是万能的。对于一些复杂的应用,你可能还需要结合其他工具和技术,比如静态分析、动态调试等。

希望今天的讲座能对大家有所帮助。记住,逆向工程是一门需要不断学习和实践的艺术。多动手、多思考,你才能成为真正的逆向高手!

感谢大家的观看,咱们下期再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注