虚拟页表。
实现内存隐藏欺骗。
原理:(目前在X86测试通过)
通过HOOK
0xe
号中断,即HOOK缺页中断函数。在HOOK后的处理函数中通过判断CR3来确定是在哪个程序发生的在处理函数中通过判断CR2来判断缺页的虚拟地址,以此来保护(通过修改PTE来隐藏或者保护我们的目标虚拟地址),但是我们需要执行(如果是执行保护)一下目标内存代码,目的是更新TLB,然后再把PTE的错误(欺骗)地址写回去。
我们通过
errno
判读缺页类型。例如是0
的执行缺页还是其他的读写缺页等等。以此实现读取和执行等不同种类缺页的不同对策。达到执行正常,但是无法读取可执行代码的效果通过EIP可以知道触发缺页中断时系统代码的执行地址。
此方法可以欺骗CE、OD等工具,使其无法读取应用程序的可执行代码的信息,但是应用程序仍然可以正常执行。可以做到代码保护反调试的效果。
通过测试猜测:CE在RING3下通过系统API来获取进程内存;但是加载了驱动后,CE也使用PTE复制到类似0地址的地方进行读取,ShadowWalker仍然祈起到效果。(通过查看缺页时EIP得知)
需要HOOK系统中断API,不适合实际应用,可能会导致系统不稳定。