Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从C+运行可执行文件+;同一过程中的程序_C++_Process - Fatal编程技术网

C++ 从C+运行可执行文件+;同一过程中的程序

C++ 从C+运行可执行文件+;同一过程中的程序,c++,process,C++,Process,可能吗?我希望能够轻松访问可执行文件的内存来编辑它。或者,当我不是管理员时,是否可以从另一个进程编辑可执行文件的内存?我尝试过ptrace库,如果我不是管理员,它就会失败。我在Linux上我不完全确定你在问什么,但这在共享内存中是可能的 请参见此处:我不完全确定您在问什么,但这可以通过共享内存实现 请参见此处:调试器就是这样做的。您可以查看开源调试器的代码,例如gdb,以了解其工作原理 调试器就是这样做的。您可以查看开源调试器的代码,例如gdb,以了解其工作原理 在Windows中,用于此操作的

可能吗?我希望能够轻松访问可执行文件的内存来编辑它。或者,当我不是管理员时,是否可以从另一个进程编辑可执行文件的内存?我尝试过ptrace库,如果我不是管理员,它就会失败。我在Linux上

我不完全确定你在问什么,但这在共享内存中是可能的


请参见此处:

我不完全确定您在问什么,但这可以通过共享内存实现


请参见此处:

调试器就是这样做的。您可以查看开源调试器的代码,例如gdb,以了解其工作原理

调试器就是这样做的。您可以查看开源调试器的代码,例如gdb,以了解其工作原理

在Windows中,用于此操作的方法名为ReadProcessMemory/WriteProcessMemory,但是,您需要此操作的管理权限。linux也是如此,正如我在评论中所说的,任何健全的系统都不允许用户进程修改非自有内存

对于linux,唯一的功能是。您需要成为管理员

包含更详细的讨论


您能想象允许进程在没有管理员身份的情况下修改其他进程内存的后果吗?

在Windows中,用于此操作的方法名为ReadProcessMemory/WriteProcessMemory,但是,您需要对此具有管理权限。linux也是如此,正如我在评论中所说的,任何健全的系统都不允许用户进程修改非自有内存

对于linux,唯一的功能是。您需要成为管理员

包含更详细的讨论

您能想象允许进程在不担任管理员的情况下修改其他进程内存的后果吗?

答案:

  • 是-它可以工作:您不必是管理员/root,但当然您需要访问进程内存的权限,即同一用户
  • 不,这不容易
写入
/proc/pid/mem
的可能性是不久前添加到Linux内核的。因此,它取决于您使用的内核。这些小程序在内核3.2中进行了检查,在内核3.2中进行了检查,在内核2.6.32中失败了

该解决方案由两个程序组成:

  • 启动的“服务器”分配一些内存,将一些图案写入该内存,并每三秒输出一次图案打印后放置的内存内容
  • “客户端”通过/proc/pid/maps和/proc/pid/mem连接到服务器,搜索模式并将其他字符串写入服务器内存
  • 该实现使用堆—但只要权限允许—也可以更改其他进程内存的其他部分

    这是用C实现的,因为它非常低,但是它应该在C++中工作。这是一个概念验证-无生产代码-例如,缺少一些错误检查,并且有一些固定大小的缓冲区

    memholder.c 其他解释 对您的问题还有另一种解释(当阅读标题而不是问题时),您希望用另一个进程替换一个进程中的“可执行文件”。可由
    exec()
    (和朋友)轻松处理:

    man exec

    exec()函数族用新的进程映像替换当前进程映像

    答案是:

    • 是-它可以工作:您不必是管理员/root,但当然您需要访问进程内存的权限,即同一用户
    • 不,这不容易
    写入
    /proc/pid/mem
    的可能性是不久前添加到Linux内核的。因此,它取决于您使用的内核。这些小程序在内核3.2中进行了检查,在内核3.2中进行了检查,在内核2.6.32中失败了

    该解决方案由两个程序组成:

  • 启动的“服务器”分配一些内存,将一些图案写入该内存,并每三秒输出一次图案打印后放置的内存内容
  • “客户端”通过/proc/pid/maps和/proc/pid/mem连接到服务器,搜索模式并将其他字符串写入服务器内存
  • 该实现使用堆—但只要权限允许—也可以更改其他进程内存的其他部分

    这是用C实现的,因为它非常低,但是它应该在C++中工作。这是一个概念验证-无生产代码-例如,缺少一些错误检查,并且有一些固定大小的缓冲区

    memholder.c 其他解释 对您的问题还有另一种解释(当阅读标题而不是问题时),您希望用另一个进程替换一个进程中的“可执行文件”。可由
    exec()
    (和朋友)轻松处理:

    man exec

    exec()函数族用新的进程映像替换当前进程映像


    哦,天哪,不。为什么任何理智的系统都允许用户进程修改其他进程的内存?我不确定我是否完全理解你们的问题。您想在进程运行时访问自己的进程内存吗?@Yossarian,在Windows和Linux中都可以编辑另一个进程的内存。下面是一个黑客扫雷器的代码示例:(适用于Windows XP)。所以这通常是可能的,只有在我没有管理员权限的情况下才会失败。戴维德,这不是我自己的过程。这是一个游戏,我想访问它的内存(如扫雷舰示例)。我没有它的源代码可以编辑,因此所有给出的建议都不行。哦,天哪,不。为什么任何一个健全的系统都允许用户进程修改其他进程的内存?我不确定我是不是
    /*
     * Alloc memory - write in some pattern and print out the some bytes
     * after the pattern.
     *
     * Compile: gcc -Wall -Werror memholder.c -o memholder.o
     */
    
    #include <sys/types.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    
    int main() {
    
       char * m = (char*) malloc(2048);
       memset(m, '\xAA', 1024);
       strcpy(m + 1024, "Some local data.");
    
       printf("PID: %d\n", getpid());
    
       while(1) {
          printf("%s\n", m + 1024);
          sleep(3);
       }
    
       return 0;
    }
    
    /*
     * Searches for a pattern in the given PIDs memory
     * and changes some bytes after them.
     *
     * Compile: gcc -Wall -std=c99 -Werror memwriter.c -o memwriter
     */
    
    #include <sys/types.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <string.h>
    #include <sys/mman.h>
    #include <sys/ptrace.h>
    #include <sys/wait.h>
    
    int open_proc_file(pid_t other_pid, char const * const sn,
       int flags) {
       char fname[1024];
       snprintf(fname, 1023, "/proc/%d/%s", other_pid, sn);
       // Open file for reading and writing
       int const fd = open(fname, flags );
       if(fd==-1) {
          perror("Open file");
          exit(1);
       }
       return fd;
    }
    
    void get_heap(int fd_maps, size_t * heap_start, size_t * heap_end) {
       char buf[65536];
       ssize_t const r = read(fd_maps, buf, 65535);
       if(r==-1) {
          perror("Reading maps file");
          exit(1);
       }
       buf[r] = '\0';
       char * const heap = strstr(buf, "[heap]");
       if(heap==NULL) {
          printf("[heap] not found in maps file");
          exit(1);
       }
    
       // Look backward to the latest newline
       char const * hl_start;
       for(hl_start = heap; hl_start > buf && *hl_start != '\n'; 
           --hl_start) {}
       // skip \n
       ++hl_start;
    
       // Convert to beginnig and end address
       char * lhe;
       *heap_start = strtol(hl_start, &lhe, 16);
       ++lhe;
       *heap_end = strtol(lhe, &lhe, 16);
    }
    
    int main(int argc, char *argv[]) {
    
       if(argc!=2) {
          printf("Usage: memwriter <pid>\n");
          return 1;
       }
    
       pid_t const other_pid = atoi(argv[1]);
       int fd_mem = open_proc_file(other_pid, "mem", O_RDWR);
       int fd_maps = open_proc_file(other_pid, "maps", O_RDONLY);
    
       size_t other_mem_start;
       size_t other_mem_end;
       get_heap(fd_maps, &other_mem_start, &other_mem_end);
    
       ptrace(PTRACE_ATTACH, other_pid, NULL, NULL);
       waitpid(other_pid, NULL, 0);
    
       if( lseek(fd_mem, other_mem_start, SEEK_SET) == -1 ) {
          perror("lseek");
          return 1;
       }
    
       char buf[512];
    
       do {
          ssize_t const r = read(fd_mem, buf, 512);
          if(r!=512) {
             perror("read?");
             break;
          }
    
          // Check for pattern
          int pat_found = 1;
          for(int i = 0; i < 512; ++i) {
             if( buf[i] != '\xAA' ) 
                pat_found = 0;
                break;
          }
          if( ! pat_found ) continue;
    
          // Write about one k of strings
          char const * const wbuf = "REMOTE DATA - ";
          for(int i = 0; i < 70; ++i) {
             ssize_t const w = write(fd_mem, wbuf, strlen(wbuf));
             if( w == -1) {
                perror("Write");
                return 1;
             }
          }
          // Append a \0
          write(fd_mem, "\0", 1);
          break;
    
       } while(1);
    
       ptrace(PTRACE_DETACH, other_pid, NULL, NULL);   
    
       close(fd_mem);
       close(fd_maps);
    
       return 0;
    }
    
    $ ./memholder
    PID: 2621
    Some local data.
    Some local data.
    MOTE DATA - REMOTE DA...