话不多说,直接上代码
原理:
先分配一个Mapper,用MmAllocateIndependentPages的原因是不会分配出大页,用ExAllocatePool等api是有概率分配出大页Pde内存的哦
获取Mapper的Pte并保存原始Pfn,用于后续还原
改Pte->Pfn使得Mapper映射我们的物理地址,刷tlb,拷贝内存,还原Pfn
关中断的原因是invlpg之后切到其他核心会导致在其他核心的tlb没被刷新从而拷贝到错误的数据,其实提升irql就行了
注意事项:
多核情况要注意分配多个Mapper给每个核心使用
[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
感谢分享,帖子内容很实用。附上思维导图助你梳理思路。