首页
社区
课程
招聘
[分享]在AMD-V上模拟"只执行"内存页 npt hook
发表于: 6小时前 191

[分享]在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


[招生]科锐逆向工程师培训(2026年7月3日实地,远程教学同时开班, 第56期)!

收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回