是否可以将二进制文件加载到内存中并在 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。
然后你必须为你的函数指针分配可执行内存的地址,并且只有在那个时候从磁盘读取代码。
这个过程通常用于恶意软件或代码注入,并且可以用于本地或远程进程,这就是为什么我不会给出更好的解释。好奇心很好,但是... ;-)
我正在尝试编写一个程序来从内存中读取二进制文件,执行它并退出,但是 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。 然后你必须为你的函数指针分配可执行内存的地址,并且只有在那个时候从磁盘读取代码。 这个过程通常用于恶意软件或代码注入,并且可以用于本地或远程进程,这就是为什么我不会给出更好的解释。好奇心很好,但是... ;-)