【发布时间】:2019-02-13 14:30:32
【问题描述】:
我正在为缓冲区溢出执行生成机器代码,并且想要一种快速简便的方法将字节码插入程序并查看它如何在我的主机上运行。
我寻找在 C++ 中动态生成函数的方法,并在very interesting answer 中遇到了这个问题。它得到了相当多的支持,似乎没有人质疑他们所说的话。
但是,当尝试实现他们在我自己的程序中编写的内容时,我收到错误“表达式不能用作函数”。
这是我的代码:
int main()
{
uint8_t machinecode[] = {0x90, 0x0F, 0x01};
*reinterpret_cast<void**>(&machinecode)();
return 0;
}
【问题讨论】:
-
操作系统不允许你执行任意一块内存。为此,您需要
mmap(或等效的,取决于您的操作系统)才能创建可执行的内存块。还有reinterpret_cast到void**?不,您需要重新解释为函数指针。您可能想阅读以下内容:eli.thegreenplace.net/2013/11/05/how-to-jit-an-introduction -
对于初学者来说,
()的优先级高于*,在这种情况下。所以这是错误的,马上。其次,void *不是可调用函数,它是无类型指针,不能作为函数调用。指向返回 void 的函数的指针是void (*)()。 -
@EdwardSeverinsen 最后一个问题:你到底想做什么?编写自己的 jit 是一项困难、容易出错且极其耗时的任务。你确定你不想使用一些现有的工具,例如LLVM?
-
您链接的答案获得了 32 次赞成,这仅表明人们会赞成他们不理解的事情,只要它看起来足够聪明并且已经有一些赞成。
-
字节码。你一直用那个词。 I don't think it means what you think it means.