跨进程的本质是"进程挂靠”正常情况下, A进程的线程只能访问A进程的地址空间,如果A进程的线程想访问B进程的地址空间,就要修改当前的Cr3的值为B进程的页目录表基值(KPROCESS.DirectoryTableBase)。
即: mov cr3,B.DirectoryTableBase
跨进程操作
A进制中的线程代码:
mov cr3,B.DirectoryTableBase //切换Cr3的值为B进程
mov eax,dword ptr ds:[0x12345678] //将进程B Ox12345678的值存的eax中
mov dword ptr ds[0x00401234],eax //将数据存储到0x00401234中
mov cr3,A.DirectoryTableBase //切换回Cr3的值
//此时0x00401234中的数据还有吗?
//如何将数据传递给A进程的变量呢?
NtReadVirtualMemory流程解析:
- 切换Cr3
- 将数据读复制到高2G
- 切换Cr3
- 从高2G复制到目标位置
NtWriteVirtualMemory流程解析:
- 将数据从目标位置复制到2高2G地址
- 切换Cr3
- 从高2G复制到目标位置
- 切换Cr3
代码
3环
#include<stdio.h>