-
-
[分享]在AMD-V上模拟"只执行"内存页 npt hook
-
发表于: 6小时前 191
-
问题:NPT不支持Execute-Only
AMD-V的嵌套页表(NPT)有个硬性限制——不支持"只执行"权限。
页表权限组合只有:读+写、读+执行、读+写+执行。无法设置成"可执行但不可读"。
这就导致一个尴尬场景:你想保护函数不被读取和篡改,但又必须让它能正常执行——NPT做不到。
解法:借用Memory Protection Keys
AMD CPU有个特性叫内存保护密钥(PK),原本用于用户态细粒度权限管理,但这里派上了大用场。
关键点:PK的权限检查不影响指令获取(Instruction Fetch)。
也就是说:
· PK把页标记为"不可读/写" → 任何mov访问触发#PF
· 但call/jmp执行代码 → 完全不受影响,正常取指运行
工作流
```
1. 给目标函数所在页设置一个PK Key(比如Key=1)
2. 设置PKRU寄存器,禁止对Key=1的页进行读/写
3. 结果:
- call 函数 → ✅ 正常执行
- mov eax, [函数] → ❌ 触发#PF,VMM接管
- mov [函数], eax → ❌ 触发#PF,VMM接管
```
就这样,在AMD-V上"模拟"出了原生不支持的Execute-Only页。
应用场景
· 隐蔽Hook:INT3断点 + PK保护,外部读取时VMM动态还原原始字节,扫描器永远看到"干净"的代码
· 防篡改:关键代码页禁止写入
· 反内存扫描:任何dump行为都会触发异常,由VMM静默处理
检测与隐匿
检测手段:检查CR4.PKE位是否被置位。
反制手段:VMM拦截所有CR4读写,返回伪造值(PKE=0),让客户机完全感知不到PK已启用。
---
一句话总结:NPT不给Execute-Only,就用PK硬造一个,完美绕过硬件限制。
开源实现:MemHvHooked
赞赏
- [分享]在AMD-V上模拟"只执行"内存页 npt hook 191
- [转帖]nvidia截图分析 4456
- [原创]HyperCE: VT调试器 过保护 11316
- [原创]GsDriver的ring3调用 5631