进程P2有没有办法访问另一个进程P1的局部变量?

问题描述 投票:1回答:3

假设linux中有两个进程P1,P2(这是一个病毒)。 P2可以访问P1的本地可变量(比如x)吗?

在网上搜索时,我发现由于进程中使用的地址是逻辑地址,因此P2无法访问P1的局部变量“x”。 但我想知道P2是否生成随机地址,其中一个解析为与'x'相同的物理地址,然后无法访问它? P2真的可以访问P1的'x'吗? 如果有,怎么样? (如果可以通过任何技巧访问它,请告诉我) 如果不是,为什么?

P1代码:

int main() {
  int x = 20;
  return 0;
}

p2代码:

int main() {
  /*
  generate random addresses and access them.
  one of them might resolve to physical address of 'x' in P1
  */
  return 0;
}
c++ memory-management process
3个回答
1
投票

详细的机制取决于操作系统,但使用virtual memory的现代CPU架构:

  • 每个过程都有自己的virtual address space
  • 硬件组织虚拟地址和真实物理地址之间的映射。
  • 对未映射的虚拟地址的任何访问都会引发将被捕获的错误

因此,如果P1使用地址0x200,并且如果P2知道该地址并决定使用它来注入一些东西,那么这将无效。因为一个进程的虚拟地址0x200与另一个地址的虚拟地址0x200不同。这些进程之间没有共享地址(OS地址空间除外,这受到很好的保护)。因此(原则上)P2无法破坏P1。

可以使用OS中的一些特殊功能来共享一些内存,可以通过shared memory或通过memory mapped files。但是这两个过程都需要合作才能共享内存。

最后,根据P2的特权,P2可以请求从OS访问P1的地址空间。对于windows,它是API函数ReadProcessMemory()WriteProcessMemory(),在linux下,它可以访问对应于物理内存的/dev/mem设备。但这些特权仅适用于值得信赖的用户运行的可靠流程。原则上普通用户的正常流程不应该具有这些非常敏感的权限......所以你的P1应该是安全的。


0
投票

linux中的进程以受保护模式运行。这意味着进程具有虚拟地址而不是物理地址。

问题的答案是肯定的,因为linux提供了写入和读取另一个进程的内存的方法。

这可以通过编写和读取文件/ proc /%ld / mem来完成,其中%ld是进程的id。

如果您想了解更多信息,请访问:https://nullprogram.com/blog/2016/09/03/


0
投票

C ++语言中不存在进程的概念。 C ++中的进程之间没有标准的通信方式。

然而,操作系统提供了平台特定的进程间通信(IPC)方式。广泛使用的IPC方法是网络套接字,其不仅可以用于同一系统内的进程之间的通信,还可以用于通过网络连接的不同系统上的进程之间的通信。

© www.soinside.com 2019 - 2024. All rights reserved.