假设在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;
}
答案 0 :(得分:1)
详细的机制取决于操作系统,但使用virtual memory的现代CPU体系结构:
因此,如果P1使用地址0x200,并且P2知道该地址并决定使用它来注入一些东西,那么它将无法正常工作。因为一个进程的虚拟地址0x200与另一地址的虚拟地址0x200不同。这些进程之间没有共享地址(除了OS地址空间外,都得到了很好的保护)。因此,(原则上)P2无法破坏P1。
可以通过shared memory或memory 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方法,它不仅可以用于同一系统内的进程之间的通讯,还可以用于通过网络连接的不同系统上的进程之间的通讯。