进程P2是否可以通过任何方式访问另一个进程P1的局部变量?

时间:2019-03-23 20:39:57

标签: c++ memory-management process

假设在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;
}

3 个答案:

答案 0 :(得分:1)

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

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

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

可以通过shared memorymemory mapped files使用操作系统中的某些特殊功能来共享一些内存。但是两个进程需要合作才能共享内存。

最后,根据P2的特权,P2可以请求从OS访问P1的地址空间。对于Windows,它是API函数ReadProcessMemory()WriteProcessMemory(),在Linux下,它可以访问与物理内存相对应的/dev/mem设备。但是,这些特权仅授予可信任用户运行的可信任进程。原则上,普通用户的正常流程不应具有这些非常敏感的特权...因此,您的P1应该是安全的。

答案 1 :(得分:0)

Linux中的进程在保护模式下运行。这意味着一个进程具有虚拟地址而不是物理地址。

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

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

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

答案 2 :(得分:0)

在C ++语言中不存在进程的概念。在C ++中,没有标准的方法可以在进程之间进行通信。

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