目录
一、消息发送
二、环境准备
三、从目标进程中发消息
四、在目标进程中接收消息
五、在目标进程中以阻塞方式接收消息
官方链接:Messages | Frida • A world-class dynamic instrumentation toolkit
参考链接:Frida官方手册 - 消息发送_frida send-CSDN博客
一、消息发送
在这篇教程里,我们来讲述如何从目标进程发送消息到主控端以及如何反向发消息。
二、环境准备
- 创建文件 hello.c
#include <stdio.h>
#include <unistd.h>
void f (int n){
printf ( "Number: %d\n", n);
}
int main ( int argc, char * argv[])
{
int i = 0;
printf ( "f() is at %p\n", f);
while (1)
{
f (i++);
sleep (1);
}
}
添加说明:我是在 pycharm 中来进行这个学习,新建一个文件,改文件名为 hello.c。之后使用下面命令编译,需要GCC环境,下载参考:http://t.csdnimg.cn/jJcdC 。
-
编译
在 hello.c 所在文件夹 cmd 命令,再使用下方命令编译
gcc -Wall hello.c -o hello
编译后,会在文件夹中生成一个hello.exe文件(这个文件名对应后面的进程名)
- 然后启动程序,并记录下函数 f() 的地址(at 后面的内容 例如:00007ff78e5a13b4):
启动程序,可以在cmd窗口输入 hello.exe 或者 .\hello.exe会直接启动,保持其的运行。
三、从目标进程中发消息
- 在下面的这个例子中,脚本从目标进程中给Python主控端发回了一条消息,理论上你可以发送任何可以序列化成JSON的任何JavaScript值。
- 创建文件 send.py,大致内容如下:
import frida
import sys
def on_message(message, data):
print(message)
session = frida.attach("hello.exe")
script = session.create_script("send (1337);")
script.on('message', on_message)
script.load()
sys.stdin.read()
- 打开pycharm终端(alt + F12)使用如下命令执行脚本:
python .\send.py 或者 python send.py
# 备注技巧:python 输入个 s ,再按tab按键会出来s开头的文件
- 正常情况下,应该能看到如下的输出:
- 从上面的结果可以知道,send(1337) 这段JavaScript代码已经在 hello.exe 这个进程中执行了,可以使用 Ctrl + C 来终止脚本执行。
四、在目标进程中接收消息
- 也可以从Python主控端往目标进程中的JavaScript代码发消息,比如下面的这个脚本 pingpong.py:
import frida
import sys
def on_message(message, data):
print(message)
session = frida.attach("hello.EXE")
script = session.create_script("""
recv('poke', function onMessage(pokeMessage) { send('pokeBack'); });
""")
script.on('message', on_message)
script.load()
script.post({"type": "poke"})
sys.stdin.read()
执行脚本,正常情况下出现如下图:
五、在目标进程中以阻塞方式接收消息
- 在目标进程中的JavaScript代码可以用阻塞的方式接收来自主控端的消息,下面给一个例子 rpc.py:
import frida
import sys
def on_message(message, data):
print(message)
val = int(message['payload'], 16)
script.post({'type': 'input', 'payload': str(val * 2)})
session = frida.attach("hello.exe")
script = session.create_script("""
Interceptor.attach(ptr("%s"), {
onEnter(args) {
send(args[0].toString());
const op = recv('input', value => {
args[0] = ptr(value.payload);
});
op.wait();
}
});
""" % int(sys.argv[1], 16))
script.on('message', on_message)
script.load()
sys.stdin.read()
- 然后使用如下命令执行脚本(保持程序运行着):
python rpc.py 00007ff78e5a13b4 #上面的地址
- 然后观察 hello 命令窗口输出,大致应该如下:
hello.exe这个程序界面应该一直输出你输入的数据的2倍的值,直到你按下 Ctrl+C结束。
文章到此结束,欢迎讨论,谢谢大家。