概述
开门见山,本文的核心思路就是通过填充页表项,将一块连续的虚拟地址映射到新的地址,同时将需要修改的只读内存对应页表项的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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复