是否可以将二进制文件加载到内存中并在 windows 中执行

Is it possible to load a binary file into memory and execute it in windows

我正在尝试编写一个程序来从内存中读取二进制文件,执行它并退出,但是 OS 似乎不允许我从内存中执行它,这个练习的重点是将没有 header 的二进制文件加载到内存中。

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

push eax

mov eax,3
mov edi,eax
sub eax,edi


pop eax
leave
ret

而我的loader如下:

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;
}

我知道我可能做错了。

可能吗?是的。但正如人们评论的那样,它比你目前正在进行的要多得多(甚至忽略代码中未决的段错误)。除其他事项外,您应该意识到 Visual Studio(至少)构建默认情况下明确阻止执行 'data' 的程序。请参阅 /NXCOMPAT 标志和 Data Execution Prevention

的文档

虽然您显示的代码与位置无关,因此可以在任何地方执行,但不是为数据分配内存的情况。 OS 的实际版本强制执行内存访问保护,明确拒绝在数据内存上执行。 但是首先你的程序有一个很大的错误,你没有为你想要加载的代码定义任何内存:

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

当从磁盘读取数据时,它会写入内存中的某处,从而触发内存访问错误。 要从 OS 获取可执行内存,您可以使用函数作为 VirtualAlloc, and then make the allocated memory executable using other functions as VirtualProtect。 然后你必须为你的函数指针分配可执行内存的地址,并且只有在那个时候从磁盘读取代码。 这个过程通常用于恶意软件或代码注入,并且可以用于本地或远程进程,这就是为什么我不会给出更好的解释。好奇心很好,但是... ;-)