目录

一、消息发送

二、环境准备

三、从目标进程中发消息

四、在目标进程中接收消息

五、在目标进程中以阻塞方式接收消息


官方链接:Messages | Frida • A world-class dynamic instrumentation toolkit

参考链接:Frida官方手册 – 消息发送_frida send-CSDN博客

一、消息发送

在这篇教程里,我们来讲述如何从目标进程发送消息到主控端以及如何反向发消息。

二、环境准备

  • 创建文件 hello.c
#include 
#include 

void f (int n){
    printf ( "Number: %d
", n);
    }

int main ( int argc, char * argv[])
{
    int i = 0;
    printf ( "f() is at %p
", 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会直接启动,保持其的运行。

Frida 学习之 messages插图

三、从目标进程中发消息

  • 在下面的这个例子中,脚本从目标进程中给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开头的文件
  • 正常情况下,应该能看到如下的输出:
  • Frida 学习之 messages插图(1)

  • 从上面的结果可以知道,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()

执行脚本,正常情况下出现如下图:

Frida 学习之 messages插图(2)

五、在目标进程中以阻塞方式接收消息

  • 在目标进程中的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 命令窗口输出,大致应该如下:

Frida 学习之 messages插图(3)

Frida 学习之 messages插图(4)

hello.exe这个程序界面应该一直输出你输入的数据的2倍的值,直到你按下 Ctrl+C结束。

文章到此结束,欢迎讨论,谢谢大家。

本站无任何商业行为
个人在线分享 » Frida 学习之 messages
E-->