c/c++语言开发共享将MachineCode从文件加载到内存并执行C – mprotect失败

嗨,我正在尝试将原始机器代码加载到内存中并在C程序中运行它,现在当程序执行时,它试图在内存上运行mprotect以使其可执行时中断。 我也不完全确定如果内存设置正确,它将执行。 我目前在Ubuntu Linux x86上运行它(也许问题是Ubuntu的过度保护?)

我目前拥有以下内容:

#include  #include  #include  int main ( int argc, char **argv ) { FILE *fp; int sz = 0; char *membuf; int output = 0; fp = fopen(argv[1],"rb"); if(fp == NULL) { printf("Failed to open file, aborting!n"); exit(1); } fseek(fp, 0L, SEEK_END); sz = ftell(fp); fseek(fp, 0L, SEEK_SET); membuf = (char *)malloc(sz*sizeof(char)); if(membuf == NULL) { printf("Failed to allocate memory, aborting!n"); exit(1); } memset(membuf, 0x90, sz*sizeof(char)); if( mprotect(membuf, sz*sizeof(char), PROT_EXEC | PROT_READ | PROT_WRITE) == -1) { perror("mprotect"); printf("mprotect failed!!! aborting!n"); exit(1); } if(!(fread(membuf, sz*sizeof(char), 1, fp))) { perror("fread"); printf("Read failed, aborting!n"); exit(1); } __asm__ ( "call %%eax;" : "=a" (output) : "a" (membuf) ); printf("Output = %xn", output); return 0; } 

我收到编译器警告:

 /tmp/ccVnhHak.s: Assembler messages: /tmp/ccVnhHak.s:107: Warning: indirect call without `*' 

我没有得到程序来达到这个代码,所以我无法看到我的汇编代码是否正在做它应该做的事情。

    好的,这是答案,根据我们在评论中的讨论:)

    内存区域应与系统页面大小对齐。 posix_memalign()调用是在这种情况下分配内存的正确方法:)

    在0x90(noop)字节后添加0xc3(返回指令)。 你的程序可能会崩溃,因为它运行在NOOP的末尾,并且运行到未初始化的内存,谁知道潜伏在那里,或者进入可执行页面的末尾。 如果不查看您正在加载的文件中的内容,我无法分辨。

    BTW strace对于这些类型的程序非常有用。 它会告诉你mprotect中的错误是什么。

    使用所有权限PROT_EXEC | PROT_READ | PROT_WRIT也不需要,有点危险。 你一般不需要PROT_WRITE,只需exec和read即可。

    一些安全的内核甚至不允许PROT_EXEC | PROT_WRIT。

    需要了解更多c/c++开发分享将MachineCode从文件加载到内存并执行C – mprotect失败,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享将MachineCode从文件加载到内存并执行C – mprotect失败相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979393.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐