avatar

Catalog
跨进程读写内存

要点回顾

跨进程的本质是“进程挂靠”,正常情况下,A进程的线程只能访问A进程的地址空间,如果A进程的线程想访问B进程的地址空间,就要修改当前的Cr3的值为B进程的页目录表基址(KPROCESS.DirectoryTableBase)

即:

Code
1
mov cr3, B.DirectoryTableBase

跨进程操作

A进程中的线程代码如下:

Code
1
2
3
4
mov cr3,B.DirectoryTableBase		//切换Cr3的值为B进程
mov eax,dword ptr ds:[0x12345678] //将进程B 0x12345678的值存的eax中
mov dword ptr ds:[0x00401234],eax //将数据存储到0x00401234中
mov cr3,A.DirectoryTableBase //切换回Cr3的值

这是一个模拟跨进程读写内存的操作,但是代码实际上是存在问题的。代码中,将数据写入到0x00401234这个地址里,但这个地址是位于B进程地址空间的,因此A进程中是无法读出来这个值的。那该如何读写另一个进程的内存呢?

之前,在学习保护模式内容的时候,发现不同进程低2G对应的物理页往往是不同的,但是高2G对应的物理页往往是相同的。可以利用这一点,可以先将数据暂存到高2G的内存,然后切换到另一个进程中,进入读写操作。具体我们来参考一下NtReadVirtualMemory的实现理念。

NtReadVirtualMemory流程

NtWriteVirtualMemory流程

通过分析这两个函数实现跨进程读写的原理可以发现,都是利用了进程高2G地址对应的物理页相同这个特性,先将数据暂存到高2G的位置,然后切换进程,再在另一个进程是进行读取操作。

总结

Author: cataLoc
Link: http://cata1oc.github.io/2020/04/06/%E8%B7%A8%E8%BF%9B%E7%A8%8B%E8%AF%BB%E5%86%99%E5%86%85%E5%AD%98/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶