0

我有简单的程序:

#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 的解决方案感兴趣。

4

1 回答 1

5

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

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

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

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

你可以阅读更多关于

  • pthread -s(例如阅读此pthread tutprial

  • 使用mmap(2)设置的共享内存段MAP_SHARED

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

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

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

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

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

  • 加载一个内核模块做疯狂的把戏。

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

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

于 2013-09-28T20:38:23.387 回答