Frida Hook
声明: 谢绝一切形式的转载。 @[toc]
Hook
Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。
非常类似于中间人攻击,只不过中间人是钩子,操控的是程序的执行流程。
在不同平台下编写hook代码是一件很痛苦的事情,Windows下,必须要熟悉窗口、消息传递机制的,而在Linux下hook底层的消息还需要重新编写内核模块,在Android平台要Hook动态库文件,要懂得arm汇编。
而Frida的出现,让一切变得简单了,只需要会Python,会JavaScript就能够hook任何想hook的内容。
Frida is so great!
Frida
Frida是一个动态代码检测工具。它允许你将JavaScript代码片段或者你自己的库注入到到Windows、 macOS、GNU/Linux、iOS、Android,、and QNX的本机应用中。Frida还为您提供了一些基于Frida API的简单工具。这些可以按原样使用,也根据您的需要进行调整,或者用作有关如何使用API的示例。
安装
仅需呀一行命令就可以完成安装,当然前提条件是已经已经安装了Python,版本最好是3.x。
pip install frida-tools
网上狠毒文章说使用 pip install frida
和 pip install frida-tools
进行安装,但是现在一条命名就够了。如果不嫌麻烦,也可以通过源码进行安装。
具体可参见https://blog.csdn.net/helloworlddm/article/details/105068941。
Frida架构

Windows
开启一个可以注入的进程
本文使用的是记事本notepad.exe,打开记事本。
编写代码
编写example.py,枚举进程使用的模块。
import frida
def on_message(message, data):
print("[on_message] message:", message, "data:", data)
session = frida.attach("notepad.exe")
script = session.create_script("""
rpc.exports.enumerateModules = function () {
return Process.enumerateModules();
};
""")
script.on("message", on_message)
script.load()
print([m["name"] for m in script.exports.enumerate_modules()])
运行,可以看出notepad.exe使用了什么模块。

Linux
前提
首先需要使用下面的命令 "to enable ptracing non-child processes"
sudo sysctl kernel.yama.ptrace_scope=0
开启一个可以注入的进程
本文开启crackerMe00,如下所示:

编写代码
另外开启一个终端, 编写example.py,枚举进程使用的模块。
import frida
def on_message(message, data):
print("[on_message] message:", message, "data:", data)
session = frida.attach("crackerMe00")
script = session.create_script("""
rpc.exports.enumerateModules = function () {
return Process.enumerateModules();
};
""")
script.on("message", on_message)
script.load()
print([m["name"] for m in script.exports.enumerate_modules()])
运行,可以看出crackerMe00使用了哪些模块。

Android
前提
手机需要ROOT,不ROOT也是可以的,需要该一些配置文件。后续文章会说。将frida-server推送到手机中。运行./frida-server

查看进程信息 frida-ps-U

编写代码
编写example.py,枚举进程使用的模块。
import frida
def on_message(message, data):
print("[on_message] message:", message, "data:", data)
session = frida.get_usb_device().attach("com.android.chrome")
script = session.create_script("""
rpc.exports.enumerateModules = function () {
return Process.enumerateModules();
};
""")
script.on("message", on_message)
script.load()
print([m["name"] for m in script.exports.enumerate_modules()])
运行,结果如下:

公众号
关于Frida有一句很流行的话:没有做不到,只有想不到。打算开一个frida专题,欢迎多多支持。更多内容欢迎关注我的公众号。
