内存

那么何为写拷贝, 在物理页中是没有写拷贝一说,但是为了方便线性地址的管理,所以有了 VAD 二叉树管理
在每个进程中都有一个 EPROCESS 结构体, 在 EPROCESS 结构体中有一个 VadRoot 属性, 其中管理着线性地址的 起始 和 结束 以及 虚拟属性,如图:
 
我们使用 WinDbg 自带的 !vad 命令查看 VAD 二叉树, 如下,
Start 是 线性地址的起始,单位是4KB, End 是 线性地址的结束,单位是4KB
Private属性代表这块内存是由 VirtualAlloc 函数申请的私有内存, Mapped 属性代表这块内存是由 FileMapping 函数申请出来的共享内存, 所以可以说,在3环真正申请内存的只有前面这两个函数,
而类似malloc函数其实只是在前面两函数申请的私有/共享的内存中取其一小块内存,并不会进入0环申请内存
READWRITE 代表该快内存可读可写,  EXECUTE_WRITECOPY 代表该快内存为写拷贝
 
 
那么继续说明写拷贝的含义,由上面我们可以知道在虚拟内存中有READ(只读)、EXECUTE_WRITECOPY(写拷贝)等属性,而只读和写拷贝的物理页只能读取,不能写入, 
而当我们尝试 HOOK 写入有 EXECUTE_WRITECOPY 属性的虚拟线性地址时,会优先触发PDE/PTE的缺页异常,在异常函数中会去判断你的线性地址 Vad 属性是写拷贝还是只读,若是只读则会返回一个0xC000005错误,若是写拷贝,则会将你要HOOK的虚拟线性地址物理页重新拷贝一份到其他物理页,并且将你HOOK的虚拟线性地址重新指向新的拷贝的物理页,此为写拷贝!
所以我们可以将写拷贝物理页的只读属性将其改为可读可写或者关闭CR0的写保护亦或者利用MmMapIoSpace重新映射物理页,则不会触发缺页异常,也不会触发写拷贝!从而达到 HOOK 自身系统DLL函数,相当于 HOOK 了其他调用该DLL函数的进程(类似SSDTHOOK)。
posted @ 2022-09-07 11:00  HcyRcer  阅读(71)  评论(0编辑  收藏  举报