MmAllocateContiguousMemory 函数自己的解释

本文详细介绍了MmAllocateContiguousMemory函数的使用方法及其在物理内存中的分配特性,并针对在WDM驱动程序中出现的编译错误提供了有效的解决方案。

MmAllocateContiguousMemory() //分配的是非页面内存,且保证在物理内存中是连续的(分配的内存多于一个页面时)

 

包含在 ntddk.h文件中,在WDM驱动程序中调用 MmAllocateContiguousMemory函数会出现编译失败,失败原因是ntddk.h包含的这个函数和WDM模式不兼容,导致找不到链接符合,不能正常的编译。

 

解决的办法:在VS2008选择项目属性--》连接器--》输入---》附件依赖项--》wdm.lib ntoskrnl.lib

上面问题的具体函数是 VOID HookKuserSharedData(Hider::PHIDDEN_PROCESS HiddenProcess) { KAPC_STATE State; // 处理器状态保存结构 /* 准备最大物理地址值: $PhysicalMax = 0xFFFF...FFFF$ */ PHYSICAL_ADDRESS PhysicalMax; PhysicalMax.QuadPart = ~0ULL; /** * 分配新的物理连续内存区域: * - 大小: $PAGE\_SIZE$ (通常4KB) * - 约束: 无地址限制($PhysicalMax$) * * @note 分配的内存将用作伪造的KUSER_SHARED_DATA[^1] */ PVOID NewKuserSharedData = MmAllocateContiguousMemory(PAGE_SIZE, PhysicalMax); /* 计算新内存的物理页帧号(PFN): $PFN = \frac{PhysicalAddress}{PAGE\_SIZE}$ */ ULONG64 PfnNewKuserSharedData = MmGetPhysicalAddress(NewKuserSharedData).QuadPart >> PAGE_SHIFT; /** * 附加到目标进程地址空间: * - 切换当前线程上下文到目标进程 * - 允许修改目标进程的内存映射 * * @param DebuggedProcess 目标进程的EPROCESS结构 * @param State 保存当前线程状态 */ KeStackAttachProcess((PRKPROCESS)HiddenProcess->DebuggedProcess, &State); /* 获取新内存对应的物理页帧结构(MMPFN) */ PMMPFN FakeKUSDMmpfn = (PMMPFN)(MmPfnDatabase + PfnNewKuserSharedData); /** * 设置物理页帧的特殊标志位(0x200000000000000): * - 通常表示页面已被修改/重定向 * - 位操作公式: $新值 = 原值 | 2^{57}$ */ FakeKUSDMmpfn->u4.EntireField |= 0x200000000000000; /* 复制原始KUSER_SHARED_DATA内容到新区域 */ RtlCopyMemory(NewKuserSharedData, (PVOID)KUSER_SHARED_DATA_USERMODE, PAGE_SIZE); /* 获取原始KUSER_SHARED_DATA的页表项(PTE)地址 */ HiddenProcess->Kusd.PteKuserSharedData = (PTE*)GetPteAddress(KUSER_SHARED_DATA_USERMODE); /** * 修改页表项实现重定向: * 1. 保存原始物理页帧号: $OriginalPFN = PTE.PhysicalAddress$ * 2. 替换PTE中的物理地址: $PTE.PhysicalAddress = NewPFN$ */ HiddenProcess->Kusd.OriginalKuserSharedDataPfn = HiddenProcess->Kusd.PteKuserSharedData->Fields.PhysicalAddress; HiddenProcess->Kusd.PteKuserSharedData->Fields.PhysicalAddress = PfnNewKuserSharedData; /* 记录新分配的KUSER_SHARED_DATA虚拟地址 */ HiddenProcess->Kusd.KuserSharedData = (PKUSER_SHARED_DATA)NewKuserSharedData; /* 解除进程附加状态,恢复原始线程上下文 */ KeUnstackDetachProcess(&State); }
08-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值