咳咳,各位观众老爷,晚上好!欢迎来到今天的“懒人逆向福音:Objection + Frida 自动化 Hooking” 讲座。我是你们的老朋友,今晚负责带大家偷懒的讲师。
咱们今天的主题,就是如何用 Objection 这个好东西,结合 Frida 的强大能力,让逆向工程变得更轻松、更自动化。说白了,就是教大家怎么“优雅”地偷懒!
第一部分:啥是 Objection?为啥要用它?
首先,咱们得明白 Objection 是个啥玩意儿。简单来说,Objection 就是 Frida 的一个“高级”封装。Frida 就像一个强大的底层工具库,啥都能干,但用起来稍微有点麻烦。而 Objection,就像一个已经帮你组装好的工具箱,里面放着常用的 Frida 脚本,可以直接拿来用,大大简化了操作。
为什么要用 Objection 呢?理由很简单:
- 省时间! 很多常用的 Hooking 操作,Objection 都已经帮你封装好了,一行命令搞定,不用自己写 Frida 脚本。
- 更简单! Objection 的命令更简洁易懂,上手更快,即使你对 Frida 不太熟悉,也能快速入门。
- 更安全?(这个存疑,但某种程度上是对的)Objection 封装了一些安全检查,可以避免一些常见的 Frida 使用错误,比如内存泄露。
总之,Objection 就是一个让你更高效、更轻松地进行逆向工程的利器。
第二部分:Objection 安装与环境搭建
要用 Objection,首先得把它装好。这部分非常重要,环境不对,一切白费。
-
安装 Python 和 pip
Objection 是基于 Python 开发的,所以你得先安装 Python。推荐使用 Python 3.x 版本。安装好 Python 后,pip(Python 包管理器)也会自动安装。
验证是否安装成功:
python --version pip --version
如果显示版本号,就说明安装成功了。
-
安装 Objection
打开终端,运行以下命令:
pip install objection
等待安装完成。
-
安装 Frida
Objection 依赖 Frida,所以你还得安装 Frida。
pip install frida-tools
-
在目标设备上安装 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 应用。这个应用有一个校验用户名和密码的功能,咱们要绕过这个校验。
-
找到校验函数
首先,我们要找到负责校验用户名和密码的函数。这可能需要一些逆向分析的技巧,比如查看应用的 Smali 代码。假设我们找到了一个名为
checkCredentials
的方法,位于com.example.app.AuthManager
类中。 -
Hook 校验函数
使用 Objection 的
android hooking watch method
命令来监听这个函数的调用:android hooking watch method com.example.app.AuthManager.checkCredentials
输入错误的用户名和密码,看看这个函数是否被调用。如果被调用,说明我们找对了。
-
修改校验结果
现在,我们要修改校验结果,让它永远返回 true。可以使用 Objection 的
android hooking set return
命令:android hooking set return com.example.app.AuthManager.checkCredentials true
这个命令会 Hook
checkCredentials
方法,并强制它返回 true。 -
测试破解结果
再次输入错误的用户名和密码,看看是否能成功登录。如果能成功登录,恭喜你,破解成功了!
代码示例: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 classes
、ios hooking list methods
等。
第八部分:总结与展望
Objection 是一个非常强大的 Frida 上层封装,可以大大简化逆向工程的流程。通过学习和掌握 Objection 的使用方法,你可以更高效、更轻松地分析和破解各种应用。
当然,Objection 并不是万能的。对于一些复杂的应用,你可能还需要结合其他工具和技术,比如静态分析、动态调试等。
希望今天的讲座能对大家有所帮助。记住,逆向工程是一门需要不断学习和实践的艺术。多动手、多思考,你才能成为真正的逆向高手!
感谢大家的观看,咱们下期再见!