从另一个应用程序访问(读/写)虚拟内存进程

时间:2013-09-28 20:21:57

标签: c linux virtual-memory

我有简单的程序:

#include <stdio.h>

int a = 5;

int
main(void)
{
    while(1)
    {
        int i;
        sleep(1);
        printf("%p %i\n", &a, a);
    }
    return 0;
}

输出(Ubuntu x64):

0x601048 5
0x601048 5
0x601048 5
0x601048 5

我正在学习C中的指针,我已经知道你可以使用memcpy在进程的虚拟内存中的任何地方(几乎)编写数据。但是,是否可以通过使用另一个应用程序(当然使用自己的虚拟内存)来修改位于int a地址的0x601048的值?这该怎么做?我只对C的解决方案感兴趣。

1 个答案:

答案 0 :(得分:5)

不容易(在Linux上的两个不同进程之间共享虚拟内存)。作为第一个近似值,如果不可能编码。

即使您确实共享了这样的内存,也会遇到同步问题。

你真的应该阅读像Advanced Linux Programming这样的书。他们在这个问题上有几个章节(很复杂)。

通常,如果你真的想共享内存,你就不会在调用堆栈上共享一些内存,但你会“保留”一些内存区域以便以后共享。

你可以阅读更多关于

的内容
  • pthread - s(例如,阅读此pthread tutprial

  • 使用MAP_SHARED

  • 使用mmap(2)设置的共享内存段
  • 使用ptrace(2)的低级调试工具PTRACE_PEEKDATA

  • 使用shmat(2)

  • 的旧SysV共享内存
  • Posix使用shm_overview(7)共享内存(请参阅shm_open(2) ...)

  • /proc/文件系统proc(5),例如/proc/$PID/mem;我强烈建议您首先在浏览器中查看file:///proc/self/maps,然后阅读更多信息,直到您了解向您展示的内容为止。 (你可以mmap其他人的进程/proc/$PID/mem ....)

  • /dev/mem(物理内存网)请参阅mem(4)

  • 加载内核模块做疯狂的技巧。

我强烈建议不要为初学者玩这种肮脏的记忆技巧。如果您坚持,请准备好打破您的系统并经常备份它。在Linux新手时不要玩这样的技巧。

通常您需要root个权限。见capabilities(7)