是否有可能加载到内存的二进制文件,并在Windows中执行它

我试图编写一个程序来从内存中读取二进制文件执行它并退出,但操作系统似乎没有让我从内存中执行它,这个练习的整个目的是将一个没有头文件的二进制文件加载到内存中。

这是我的二进制文件的代码:

push eax mov eax,3 mov edi,eax sub eax,edi pop eax leave ret 

而我的装载机如下:

 int main(int argc, char **argv){ void (*ptr)(void); FILE *fo = fopen(argv[1],"r"); int l = fseek(fo,0,SEEK_END); fread((void*)ptr,l*sizeof(char),1,fo); ptr(); return 0; } 

我知道我可能正在做这个错误的方式。

Solutions Collecting From Web of "是否有可能加载到内存的二进制文件,并在Windows中执行它"

虽然你所展示的代码是独立的,所以可以在任何地方执行,而不是分配给数据的内存的情况。 实际版本的操作系统强制执行内存访问保护,明确拒绝在数据存储器上执行。 但是首先在你的程序中有一个很大的错误,你没有为你想要加载的代码定义任何内存:

 void (*ptr)(void); //This allocates only space for a function pointer, but no memory 

当从磁盘读取数据时,它将被写入内存的某个地方,从而触发内存访问故障。 要从操作系统获得可执行内存,您可以使用VirtualAlloc函数,然后使用其他函数(如VirtualProtect)使分配的内存可执行。 然后你必须分配给你的函数指针的可执行内存的地址,只有在那个时候从磁盘读取代码。 这个过程通常用于恶意软件或代码注入,可以用于本地或远程进程,这就是为什么我不会给出更好的解释。 好奇心不错,但… 😉

可能吗? 是。 但是正如人们所评论的那样,还有更多的东西比你现在正在进行的(甚至忽略代码中未决的seg错误)。 除此之外,您应该认识到Visual Studio(至少)构建默认情况下明确阻止执行“数据”的程序。 请参阅/ NXCOMPAT标志和数据执行保护的文档