我要问的是有点hacky(因为这是一种非常糟糕的攻击方法) - 我理解并且不打算将其用作长期解决方案,仅用于证明 - 概念
那就是说,我正在开发一个项目,该项目使用QEMU作为基础,将进程(最终线程)从一台机器迁移到另一台机器。我正在本机启动进程,使用ptrace暂停它,然后复制CPU的寄存器和堆栈并将这些值推送到新创建的QEMU实例(具有相同的底层架构,即x86-64 - &gt ; x86_64,ARM64 - > ARM64)。然后我(最终)在QEMU恢复执行。
我已经到了需要将寄存器+堆栈传递到QEMU的阶段,但是我已经碰到了一堵墙;理想情况下,我会拆分QEMU并将整个程序编译为我自己的程序的一部分,但这是概念验证发挥作用的地方。 QEMU是一个庞大的计划,拆分/重建Makefiles是我现在不太热衷于接近的东西。所以......
我是否可以在程序中使用寄存器+堆栈填充结构,创建指向该结构的指针,将该指针强制转换为char *,然后将该char *指针传递给execlp,以便重新编译(修改版)QEMU?目标是从QEMU中访问这些值。例如:
struct regs_and_stack my_struct = {...};
struct regs_and_stack *my_struct_ptr = &my_struct;
execlp("qemu", "qemu", "test", "100000", (char*)my_struct_ptr);
如果需要,我可以发布我的其余代码以更好地了解大局。一如既往,谢谢你的帮助!!!
我已经确定了qemu main函数(linux-users / main.c)中的重点,我可以在它到达解析选项之前从argv弹出最终指针;我稍后会在程序的执行中使用这些信息。问题是如何将这个结构体首先放入主要功能中。
答案 0 :(得分:0)
如果我理解你想要序列化你的结构然后在另一端反序列化它们。 以下代码片段构成了此问题的答案Serialization of struct 要解决问题,你必须编辑自己的序列化和反序列化函数,因为它们依赖于你的strut的结构。只需跳过q变量,就可以为你的结构变量打开一个适合文本序列的地方。
#include <iostream>
#include <cstring>
#define BUFSIZE 512
#define PACKETSIZE sizeof(MSG)
using namespace std;
typedef struct MSG
{
int type;
int priority;
int sender;
char message[BUFSIZE];
}MSG;
void serialize(MSG* msgPacket, char *data);
void deserialize(char *data, MSG* msgPacket);
void printMsg(MSG* msgPacket);
int main()
{
MSG* newMsg = new MSG;
newMsg->type = 1;
newMsg->priority = 9;
newMsg->sender = 2;
strcpy(newMsg->message, "hello from server\0");
printMsg(newMsg);
char data[PACKETSIZE];
serialize(newMsg, data);
MSG* temp = new MSG;
deserialize(data, temp);
printMsg(temp);
return 0;
}
void serialize(MSG* msgPacket, char *data)
{
int *q = (int*)data;
*q = msgPacket->type; q++;
*q = msgPacket->priority; q++;
*q = msgPacket->sender; q++;
char *p = (char*)q;
int i = 0;
while (i < BUFSIZE)
{
*p = msgPacket->message[i];
p++;
i++;
}
}
void deserialize(char *data, MSG* msgPacket)
{
int *q = (int*)data;
msgPacket->type = *q; q++;
msgPacket->priority = *q; q++;
msgPacket->sender = *q; q++;
char *p = (char*)q;
int i = 0;
while (i < BUFSIZE)
{
msgPacket->message[i] = *p;
p++;
i++;
}
}
void printMsg(MSG* msgPacket)
{
cout << msgPacket->type << endl;
cout << msgPacket->priority << endl;
cout << msgPacket->sender << endl;
cout << msgPacket->message << endl;
}
getLetterGrade()
此链接也很有用: stackoverflow.com/questions/1653681/serialization-deserialization-of-a-struct-to-a-char-in-c