分配虚拟内存

每个进程都有自己的虚拟进程。进程之间存在共享内存,但在一般情况下,如果没有Kernel的协助,进程A应该无法查看进程B的虚拟内存。内核当然可以看到所有进程的虚拟内存,因为它必须执行虚拟内存到物理内存的转换。进程A可以使用虚拟内存API在进程B的地址空间中分配新的虚拟内存,这个功能的具体操作由内核在内部实施

  1. 使用OpenProcess或NtOpenProcess打开一个目标进程
  2. 使用VirtualAllocEx或NtAlliocateVirualMemory在目标进程中分配eXecute-Read-Write(XRW)内存
  3. 使用WriteProcessMemory或NtWriteVirtualMemory 将payload复制到新内存中
  4. 执行payload
  5. 使用VirtualFreeEx或NtWriteMemory在目标进程中取消释放的XRW内存
  6. 使用CloseHandle或Ntclose关闭目标进程句柄

创建section(节)对象

节对象代表一段可以分享的内存,进程可以使用section对象与其他共享部分内存地址空间。Section对象还提供一种机制,可以通过该机制将文件映射到内存地址空间

  1. NtCreateSection 创建一个新的内存区段,并返回一个句柄