我正在尝试编写一个程序来从内存中读取二进制文件执行它并退出但操作系统似乎不允许我从内存中执行它,本练习的全部内容是加载二进制文件没有标题进入记忆。
这是我的二进制文件代码:
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;
}
我知道我可能会以错误的方式解决这个问题。
答案 0 :(得分:4)
虽然您显示的代码与位置无关,但可以在任何地方执行,但不是为数据分配的内存。 OS的实际版本强制执行内存访问保护,明确拒绝在数据内存上执行。 但首先,程序中存在一个很大的错误,您没有为要加载的代码定义任何内存:
void (*ptr)(void); //This allocates only space for a function pointer, but no memory
从磁盘读取数据时,它将在内存中的某处写入,从而触发内存访问错误。 要从OS获取可执行内存,可以使用VirtualAlloc函数,然后使用VirtualProtect等其他函数使分配的内存可执行。 然后,您必须为您的函数指针指定可执行内存的地址,并且只在那时从磁盘读取代码。 此过程通常用于恶意软件或代码注入,并且可以用于本地或远程进程,这就是为什么我不会给出更好的解释。好奇心很好,但......; - )
答案 1 :(得分:0)
有可能吗?是。但是正如人们所评论的那样,它比你目前所做的更多(甚至忽略代码中的挂起段错误)。除此之外,您应该意识到Visual Studio(至少)构建的程序默认情况下被明确阻止执行“数据”。请参阅/ NXCOMPAT标志和Data Execution Prevention
的文档