要点回顾
跨进程的本质是“进程挂靠”,正常情况下,A进程的线程只能访问A进程的地址空间,如果A进程的线程想访问B进程的地址空间,就要修改当前的Cr3的值为B进程的页目录表基址(KPROCESS.DirectoryTableBase)
即:
Code
1 | mov cr3, B.DirectoryTableBase |
跨进程操作
A进程中的线程代码如下:
Code
1 | mov cr3,B.DirectoryTableBase //切换Cr3的值为B进程 |
这是一个模拟跨进程读写内存的操作,但是代码实际上是存在问题的。代码中,将数据写入到0x00401234这个地址里,但这个地址是位于B进程地址空间的,因此A进程中是无法读出来这个值的。那该如何读写另一个进程的内存呢?
之前,在学习保护模式内容的时候,发现不同进程低2G对应的物理页往往是不同的,但是高2G对应的物理页往往是相同的。可以利用这一点,可以先将数据暂存到高2G的内存,然后切换到另一个进程中,进入读写操作。具体我们来参考一下NtReadVirtualMemory的实现理念。
NtReadVirtualMemory流程
NtWriteVirtualMemory流程
通过分析这两个函数实现跨进程读写的原理可以发现,都是利用了进程高2G地址对应的物理页相同这个特性,先将数据暂存到高2G的位置,然后切换进程,再在另一个进程是进行读取操作。
总结
无