Bootstrap

[VT虚拟化驱动]利用EPT实现无痕HOOK


一、 原理

EPT无痕HOOK的原理其实很简单,就是操作EPT,把要HOOK的函数的对应的页面的pte属性改成只能读写,不能执行,把函数页面复制一份,在复制出来的页面做HOOK,页面属性为只能执行

执行的原函数页面的时候,会触发EptViolation进入host,把原函数所在页对应pte的物理地址改成HOOK的页面,也就是复制出来的页面,属性是只能执行
读写被HOOK函数页面的时候,会触发EptViolation进入host,把原函数所在页对应pte的物理地址改成原函数的页面,属性是能读写不能执行

为什么不直接HOOK原函数页,读写复制出来的页面呢?
HOOK原函数页,在退出的时候还得改回来,而HOOK复制出来的就不用再去改回来了,直接释放就好

二、代码编写

一些准备

需要一个反汇编库,以便计算HOOK时要修改的指令的总长度,这里HOOK是使用push ret方式,千万不能用jmp或者其他需要读内存页方式来HOOK,否则会一直触发EptViolation,需要12个字节,但不能字节改,

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;