我有简单的程序:
#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的解决方案感兴趣。
答案 0 :(得分:5)
不容易(在Linux上的两个不同进程之间共享虚拟内存)。作为第一个近似值,如果不可能编码。
即使您确实共享了这样的内存,也会遇到同步问题。
你真的应该阅读像Advanced Linux Programming这样的书。他们在这个问题上有几个章节(很复杂)。
通常,如果你真的想共享内存,你就不会在调用堆栈上共享一些内存,但你会“保留”一些内存区域以便以后共享。
你可以阅读更多关于
的内容pthread - s(例如,阅读此pthread tutprial)
使用MAP_SHARED
使用ptrace(2)的低级调试工具PTRACE_PEEKDATA
使用shmat(2)
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)