我是靠谱客的博主 合适蜡烛,最近开发中收集的这篇文章主要介绍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修改内核非分页写保护内存的一种思路(x64)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部