C ++从内存中执行函数

时间:2014-05-29 06:41:27

标签: c++ assembly inline-assembly

我最近考虑过可预编译的脚本语言,它将在程序加载过程中转换为机器代码。

让我们说我可以自己生成这个二进制函数。现在我需要以某种方式执行它。一般方案看起来像这样:

char* binary = compile("script.sc");
pushArgsToStack(1,7);
memexec(binary);
int ret = getEax();

有没有机会让它发挥作用?

另外,调用jmp到c ++函数地址的工作是否有计划?我的意思是,在推动args,returnAddr等之后,我想以某种方式从我编译的脚本中调用该函数。

感谢您的回答

1 个答案:

答案 0 :(得分:3)

这当然可以做到。

最重要的部分是compile功能,除非你的“.sc”语言非常简单,否则需要相当多的工作。您可能希望查看例如llvm,它允许您从中间虚拟机指令集生成代码。它增加了许多代码,但在生成(相当不错的)指令时会让您的生活更轻松。

你无法在函数中真正推送参数 - 当你返回时,推送会被删除。您必须在“编译”过程中生成推送指令。

你应该能够做到:

int ret = memexec(binary);

您可能希望在汇编程序中编写memexec,并且可能需要多个参数(但如果这些参数的类型是什么,您仍然会遇到问题,因此某种类型信息的参数列表是可能真的需要 - 或者总是将参数作为字符串或其他类似的方式传递

假设您拥有过去15 - 20年的操作系统,您还需要使用“执行权限”分配内存,这需要malloc之外的其他内容。在操作系统上开放,您需要的电话会有所不同。