我是靠谱客的博主 合适蜡烛,这篇文章主要介绍linux内存写保护,[原创]不用CR0或MDL修改内核非分页写保护内存的一种思路(x64),现在分享给大家,希望可以做个参考。

开门见山,本文的核心思路就是通过填充页表项,将一块连续的虚拟地址映射到新的地址,同时将需要修改的只读内存对应页表项的Dirty位置位。在Windows操作系统下,写保护是通过保护特定虚拟地址实现的,若不建立新映射,则即使将Dirty位置位,尝试写只读内存照样会触发BugCheck,若建立了新映射但不置位Dirty则触发PAGE_FAULT的BugCheck,两个步骤缺一不可。

填充页表项首先需要动态定位PTEBase,国际惯例是采用大表哥的页表自映射法,代码如下:ULONG_PTR PTEBase = 0;

BOOLEAN hzqstGetPTEBase()

{

BOOLEAN Result = FALSE;

ULONG_PTR PXEPA = __readcr3() & 0xFFFFFFFFF000;

PHYSICAL_ADDRESS PXEPAParam;

PXEPAParam.QuadPart = (LONGLONG)PXEPA;

ULONG_PTR PXEVA = (ULONG_PTR)MmGetVirtualForPhysical(PXEPAParam);

if (PXEVA)

{

ULONG_PTR PXEOffset = 0;

do

{

if ((*(PULONGLONG)(PXEVA + PXEOffset) & 0xFFFFFFFFF000) == PXEPA)

{

PTEBase = (PXEOffset + 0xFFFF000) <

Res

最后

以上就是合适蜡烛最近收集整理的关于linux内存写保护,[原创]不用CR0或MDL修改内核非分页写保护内存的一种思路(x64)的全部内容,更多相关linux内存写保护,[原创]不用CR0或MDL修改内核非分页写保护内存内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(114)

评论列表共有 0 条评论

立即
投稿
返回
顶部