gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:47 24 4
gpt4 key购买 nike

我有一个简单的程序:

#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 在进程的虚拟内存中(几乎)您想要的任何地方写入数据。但是,是否可以通过使用另一个应用程序(当然是使用自己的虚拟内存)来修改位于 0x601048 地址的 int a 的值?这个怎么做?我只对 C 的解决方案感兴趣。

最佳答案

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

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

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

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

你可以阅读更多关于

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

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

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

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

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

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

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

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

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

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

关于c - 从另一个应用程序访问(读/写)虚拟内存进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19071288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com