gpt4 book ai didi

将函数复制到可执行页面并调用

转载 作者:行者123 更新时间:2023-11-30 18:29:44 25 4
gpt4 key购买 nike

我正在尝试将我必须的函数复制到可执行页面并从那里运行它,但我似乎遇到了一些问题。这是我的代码:

#include <stdio.h>
#include <string.h>
#include <windows.h>

int foo()
{
return 4;
}
int goo()
{
return 5;
}
int main()
{
int foosize = (int)&goo-(int)&foo;
char* buf = VirtualAlloc(NULL, foosize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (buf == NULL)
{
printf("Failed\n");
return 1;
}

printf("foo %x goo %x size foo %d\n", &foo, &goo, foosize);

memcpy (buf, (void*)&foo, foosize);

int(*f)() = &foo;
int ret1 = f();
printf("ret 1 %d\n", ret1);

int(*f2)() = (int(*)())&buf;
int ret2 = f2 (); // <-- crashes here
printf("ret2 %d\n", ret2);

return 0;
}

我知道有些代码在技术上是 UB ((int)&goo-(int)&foo),但在这种情况下表现良好。

我的问题是为什么这没有按预期工作?在我看来,我将一个页面映射为可执行文件,并在那里复制了一个现有函数,我只是调用它。

我错过了什么?

这在使用 mmap 的 Linux 上会有不同的表现吗?提前致谢

最佳答案

正如每个人都在评论中指出的那样,这完全是未定义的行为,永远不应该真正期望起作用。但是,我使用调试器对您的代码进行了一些操作,并意识到它不起作用的原因(至少在 Cygwin gcc 编译器中)是您错误地创建了 f2 来指向存储指针的地址分配的内存,即buf。您想要指向 buf 指向的内存。因此,您的作业应该是

int(*f2)() = (int(*)())buf;

完成此更改后,您的代码将为我执行。但即使它有效,一旦您对程序进行任何其他更改,它也可能再次崩溃。

关于将函数复制到可执行页面并调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35655260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com