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

Var*_*Zon 0 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;
}
Run Code Online (Sandbox Code Playgroud)

输出(Ubuntu x64):

0x601048 5
0x601048 5
0x601048 5
0x601048 5
Run Code Online (Sandbox Code Playgroud)

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

Bas*_*tch 5

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

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

你真的应该阅读像高级Linux编程这样的书.他们在这个问题上有几章(这很复杂).

通常,如果您真的想共享内存,则不会在调用堆栈上共享一些内存,但是您将"保留"一些内存区域以便以后共享.

你可以阅读更多关于

  • pthread -s(例如读这个pthread tutprial)

  • 共享内存段设置与MMAP(2)使用MAP_SHARED

  • 特别是使用ptrace(2)的低级调试工具PTRACE_PEEKDATA

  • 使用shmat的旧SysV共享内存(2)

  • Posix共享内存(参见shm_overview(7) ...)使用shm_open(2)

  • /proc/文件系统proc(5)例如/proc/$PID/mem; 我强烈建议file:///proc/self/maps您先在浏览器中查看并阅读更多信息,直到您了解这些内容为止.(你可以做mmap一些其他的过程/proc/$PID/mem....)

  • /dev/mem(物理RAM)见mem(4)

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

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

通常你需要root特权.查看功能(7)