Retrieving MmPhysicalMemoryBlock regardless of the NT version.

Windows11_22H2下的内存管理分析 内存管理机制分析 阅读详情
 

Here is a method I’m using in the next version of Win32DD (1.2), to retrieve MmPhysicalMemoryBlock regardless of the NT Version. The main problem with KDDEBUGGER_DATA64 structure is the version dependency. Then, we have to rebuild this field by ourselves.

To retrieve physical memory runs, I’m using MmGetPhysicalMemoryRanges() *undocumented* function. This function usage had been documented by Mark Russinovich in 1999, in the Volume 1 Number 5 edition of the Sysinternals Newsletter.

Actually, this function is defined in DDK. Even if, MSDN says “The following routines are reserved for system use. Do not use them in your driver.”

  1. #if (NTDDI_VERSION >= NTDDI_WIN2K)
  2. NTKERNELAPI
  3. PPHYSICAL_MEMORY_RANGE
  4. MmGetPhysicalMemoryRanges (
  5.     VOID
  6.     );
  7. #endif

MmPhysicalMemoryBlock is a structure that provides information regarding the physical memory ranges used by the system and also total physical memory size. These uses motivated me to write MmGetPhysicalMemoryBlock().

  1. [… ]
  2.     // NT 5.1 Addition
  3.     ULONG64   MmPhysicalMemoryBlock;
  4. [.. ]

As we can read in the KDDEBUGGER_DATA64 definition, MmPhysicalMemoryBlock field is an NT 5.1 Addition.

definition.

  1. typedef struct _PHYSICAL_MEMORY_RUN {
  2.     PFN_NUMBER BasePage;
  3.     PFN_NUMBER PageCount;
  4. } PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
  5.  
  6. typedef struct _PHYSICAL_MEMORY_DESCRIPTOR {
  7.     ULONG NumberOfRuns;
  8.     PFN_NUMBER NumberOfPages; // NumberOfPages * PAGE_SIZE is physical memory size.
  9.     PHYSICAL_MEMORY_RUN Run [ 1 ]; // NumberOfRuns is the total entries.
  10. } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
  11.  
  12. PPHYSICAL_MEMORY_DESCRIPTOR
  13. MmGetPhysicalMemoryBlock (
  14.         VOID
  15. );

code.

  1. /*++
  2. Function Name: MmGetPhysicalMemoryBlock
  3.  
  4. Overview:
  5.         - This function aims at retrieving MmPhysicalMemoryBlock, regardless
  6.         of the host version.
  7.  
  8.         The caller has to free the memory block.
  9.  
  10. Parameters:
  11.         -
  12.  
  13. Environment:
  14.         - Kernel Mode. PASSIVE_LEVEL.
  15.  
  16. Return Values:
  17.         - PPHYSICAL_MEMORY_DESCRIPTOR
  18. –*/
  19. PPHYSICAL_MEMORY_DESCRIPTOR
  20. MmGetPhysicalMemoryBlock ( VOID
  21.                           )
  22. {
  23. PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
  24. PPHYSICAL_MEMORY_RANGE MmPhysicalMemoryRange;
  25. ULONG MemoryBlockSize;
  26. PFN_NUMBER NumberOfPages;
  27. ULONG NumberOfRuns;
  28. ULONG Run;
  29.  
  30.     //
  31.     // PHYSICAL_MEMORY_DESCRIPTOR isn’t exported into KDDEBUGGER_DATA64
  32.     // NT 5.0 and below. But MmGetPhysicalMemoryRanges() computes
  33.     // PHYSICAL_MEMORY_RANGE with PHYSICAL_MEMORY_DESCRIPTOR. Then,
  34.     // We can easily rewrite PHYSICAL_MEMORY_DESCRIPTOR.
  35.     //
  36.     MmPhysicalMemoryRange = MmGetPhysicalMemoryRanges ( );
  37.  
  38.     //
  39.     // Invalid ?
  40.     //
  41.     if (MmPhysicalMemoryRange == NULL ) return NULL;
  42.  
  43.     //
  44.     // Compute the number of runs and the number of pages
  45.     //
  46.     NumberOfRuns = 0;
  47.     NumberOfPages = 0;
  48.     while ( (MmPhysicalMemoryRange [NumberOfRuns ]. BaseAddress. QuadPart != 0 ) &&
  49.             (MmPhysicalMemoryRange [NumberOfRuns ]. NumberOfBytes. QuadPart != 0 ) )
  50.     {
  51.         NumberOfRuns++;
  52.         NumberOfPages += (PFN_NUMBER )BYTES_TO_PAGES (
  53.             MmPhysicalMemoryRange [NumberOfRuns ]. NumberOfBytes. QuadPart );
  54.     }
  55.  
  56.     //
  57.     // Invalid ?
  58.     //
  59.     if (NumberOfRuns == 0 ) return NULL;
  60.  
  61.     //
  62.     // Compute the size of the pool to allocate and then allocate
  63.     //
  64.     MemoryBlockSize = sizeof (ULONG ) +
  65.         sizeof (PFN_NUMBER ) +
  66.         sizeof (PHYSICAL_MEMORY_RUN ) * NumberOfRuns;
  67.  
  68.     MmPhysicalMemoryBlock = ExAllocatePoolWithTag (NonPagedPool,
  69.                                                   MemoryBlockSize,
  70.                                                   ‘  mM’ );
  71.  
  72.     //
  73.     // Define PHYSICAL_MEMORY_DESCRIPTOR Header.=
  74.     //
  75.     MmPhysicalMemoryBlock->NumberOfRuns = NumberOfRuns;
  76.     MmPhysicalMemoryBlock->NumberOfPages = NumberOfPages;
  77.  
  78.     for (Run = 0; Run < NumberOfRuns; Run++ )
  79.     {
  80.         //
  81.         // BasePage
  82.         //
  83.         MmPhysicalMemoryBlock->Run [Run ]. BasePage =
  84.             (PFN_NUMBER )MI_CONVERT_PHYSICAL_TO_PFN (
  85.             MmPhysicalMemoryRange [NumberOfRuns ]. BaseAddress. QuadPart
  86.  
  87.             );
  88.  
  89.         //
  90.         // PageCount
  91.         //
  92.         MmPhysicalMemoryBlock->Run [Run ]. PageCount =
  93.             (PFN_NUMBER )BYTES_TO_PAGES (
  94.             MmPhysicalMemoryRange [Run ]. NumberOfBytes. QuadPart
  95.             );
  96.     }
  97.  
  98.     return MmPhysicalMemoryBlock;
  99. }
babyos2(11)—— physical memory manage, buddy system 由于babyos2采用了类似于linux的获取current进程指针的方法,这要求process_t的内存按8K对齐,继续采用boot阶段m_start_mem递增的方式就很笨拙了,而要实现后续的vma,虚拟内存管理等功能,一个好用的物理页分配函数是必须的,所以实现了一个buddy system来管理物理内存。 #define MAX_ORDER 6 #define ... 阅读详情

相关推荐

驱动 ReadPhysicalMemory 读写 物理内存 参考代码 win7 64

#pragma warning( disable: 4100 4103 4146 4213)NTSTATUS ReadPhysicalMemory(char *startaddress, UINT_PTR bytestoread, void *output);UINT_PTR KnownPageTableBase = 0;void VirtualAddressToIndexes(QWORD add...

编程论坛 6322

在应用层调试驱动程序 vgk.sys

***以下记录如何在应用层调试驱动程序vgk.sys,以及调试过程中获得的一些数据。 1,如何让vgk.sys 在应用层跑起来? vgk.sys 是某游戏反作弊程序的一部分,是一个驱动文件;本文调试的vgk.sys 版本是1.0.0.3,64位。正常情况下,驱动程序需要在ring0环境中运行。但是vgk.sys 经过混淆虚拟化处理了,windbg双机调试/交互会很慢。之前在其他论坛上有人提起:可以在ring3调试驱动文件。于是,我就试了试。 首先,看一下驱动程序和普通程序文件之间的相同点与不同点(大.

pureman_mega的博客 2760

x64内核实验3-页机制的研究(1)

在白皮书的第三卷2.5章对控制寄存器有详细的介绍,下面是白皮书中CR寄存器的结构图(这里要说明一下cr4的第12位是由被使用的这个位在2.5章的后半部分有介绍是控制是否开启5级分页的位否则是四级分页)首先是smep和smap两个位,这部分因为之前的实验会用到所以已经在段机制的部分介绍过了,这里就不再赘述其余一些位置的功能后面用到了会继续介绍,这边有个结构的概念就可以了。

qq_43147121的博客 733

从Blue Pill、硬件虚拟化谈安全防护完备性上的一个小原则

原文地址http://blogs.360.cn/360safe/2013/09/30/from-bluepill-vmx-to-a-simple-defence-principle/ 多年没写博客了,就先捡点剩菜剩饭炒炒,没啥营养,同学们可以随便看看。另外就是文笔真心烂,阅读的同学们需要点耐心。 这篇博客说说一个安全防护系统完备性上所需的一个小原则:防护系统与被防护对象所用资源的完全隔

XboxMicro 1628

Windows 核心编程研究系列之二:读取指定物理内存地址中的内容

[原创/讨论] Windows 核心编程研究系列之二: 读取指定物理内存地址中的内容 关键字:windows内核,物理内存   大家知道在windows NT中,如果已知虚拟地址可以通过 进程页表或者内核提供的MmGetPhysicalAddress来取得对应的 物理地址。 现在我们反过来看一下,如果已知一个物理内存地 址 (假设地址有效),如何取得物理地

享受开发,颠倒银河 8945

2.设置Salesforce开发环境

Salesforce DX:salesforce Developer Experience (salesforce开发人员体验)LWC:Lightning Web Component(注意首字母是大写的,是一个概念,小写的话有组件本身的含义)CLI:Command Line Interface(命令行界面)version control system (VCS):版本控制系统。

nihaixiao的博客 2199

《Windows NT File System Internals》学习笔记之物理内存管理简介

页帧和页帧数据库NT VMM必须管理系统内可用的物理内存。VMM使用的方法和现代商用操作系统中使用的方法类似。 NT VMM将可用的RAM划分为固定尺寸的页帧。页帧的大小可以从4K~64K。在Intel X86结构上,页尺寸为4K。每一个页桢都在页帧数据库(PFN Database)中有相应的入口项。页帧数据库在非分页内存池中,它是一个页帧入口数组。PFN数据库为每一个页帧维护以下信息

不论你在什么时候开始,重要的是开始之后就不要停止。 2231

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用

CTF逆向-[GWCTF 2019]babyvm-WP-虚机模拟流程反向编码和z3约束求解器解方程工具的使用 来源:https://buuoj.cn/ 内容: 附件:https://pan.baidu.com/s/1FKkXN6JDI0QkGw-UE2crNA?pwd=grb0 提取码:grb0 答案:Y0u_hav3_r3v3rs3_1t! 总体思路 发现是虚机模拟 形成每个指令的逆向 找到加密值位置(有可能不止一个位置,该题就给了一个误导的) 找到命令执行的流程(也是不止一个) 逆向编写反向加密得到f

serfend's blog 978

windbg抓一个windows蓝屏分析

设备一直以来挺稳定,但还是小概率事件意外出现某设备突然蓝屏了。查看windows事件查看器提示计算机已经从检测错误后重新启动。检测错误: 0x0000009f (0x0000000000000003, 0xffffad0f4edc7570, 0xfffff8046a09ec20, 0xffffad0f4ef318a0)。已将转储的数据保存在: C:\Windows\MEMORY.DMP。

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 1万+

Windows下构建ImGui.Net

工具 Visual Studio 2017 操作 下载项目 git clone https://github.com/mellinoe/ImGui.NET.git 编译 右键以下两个项目并调试: ImGui.NET.SampleProgram ImGui.NET.SampleProgram.XNA Error fix 中间遇到一些问题: SDK版本不对 去微软官网下载安装对应版本 由于设置了代理被远程服务器拒绝连接 关闭代理(也许在环境变量中) nuget源无对应资源,404 NOT FOUN

jojozym的博客 1489

U8 API接口开发踩过的坑

U8 API接口开发踩过的坑

haiyang5233233的专栏 1657

最近学习了一下PHYSICAL_MEMORY对象,总结之

最近学习了一下Windows的内存管理方面的知识,包括了PTE的修改和PHYSICAL_MEMORY的内核对象。从网上得到了一段杀伤力很强的代码(似乎是Zwell以前写的) ,就是通过设置物理内存对象的可读写,再加上映射PTE的方式从而在Ring3环境下读取内核数据。这正是我想要,于是乎严重地学习了一下,前面已经有人总结过关键步骤了,如下:1、用ZwOpenSection打开PHYSICA

一花一世界 1788

PMD相位偏折术实战:如何用Python处理条纹图,让金属外壳的划痕无处遁形

本文详细介绍了PMD相位偏折术在金属外壳划痕检测中的应用,通过Python实现条纹图处理和局部特征增强技术,显著提升微小缺陷的检出率。文章涵盖从四步相移条纹图采集到形状图局部增强的完整流程,特别适合工业质检场景,帮助实现高精度、高效率的自动化检测。

weixin_29291573的博客 511

内存填零杀进程

内存填零杀进程效果:可以杀掉360的傀儡进程zhudongfangyun.exe但杀360tray.exe时会卡死系统,不知道360tray做了如何保护...c代码:PHYSICAL_ADDRESS g_physicalPage;VOID DestoryProess(ULONG eproc){ ULONG ulEndAddress = (ULONG)MmSystemRangeStart; PHYS

小驹的专栏 4599

AD9361功能介绍和使用

AD9361使用分数分频锁相环(PLL)来产生发射机和接收机本地振荡器(LO)频率和BB PLL。BB PLL 可用于数据转换、数字滤波器和 |/O 端口。PLL的参考时钟可以由外部振荡器或外部晶体(XO)和数字可编程片内可变电容提供,电容微调产生参考时钟频率,XO和微调电容的组合统称为DCXO。有多个天线输入的分集系统。接收链数据首先经过低噪声放大器(LNA),然后是同相(1)和正交(Q)放大器,混频器和频带整形滤波器,可将接收到的信号下变频为基带以进行数字化。时分双工(TDD)和频分双工(FDD)。。。

wangjie36的博客 1万+

(14-3)值分布式算法:QR-DQN (Quantile Regression DQN)算法

QR-DQN(Quantile Regression DQN)是一种强化学习算法,它是深度 Q-网络(Deep Q-Network,DQN)的一个变种,旨在更好地处理值函数的不确定性。QR-DQN的实现步骤与传统的DQN类似,但在目标分布计算和损失函数方面有一些不同之处,这使得它能够更好地处理值函数的不确定性。QR-DQN(Quantile Regression DQN)算法的核心思想是将值函数表示为一个分布,而不是传统的单一值估计。在下面的内容中,将讲解一个使用QR-DQN算法的例子。

码农三叔 2053

驱动开发:内核解析内存四级页表

9-9-9-9-12的分页模式是一种常见的分页方案,其中物理地址被分成四级页表:PXE(Page Directory Pointer Table Entry)、PPE(Page Directory Entry)、PDE(Page Table Entry)和PTE(Page Table Entry)。这段代码完整版如下所示,代码可动态定位到PTE的内存地址,然后将其取出;运行如上代码可动态获取到当前系统的PTE地址,然后将PTE填入到。即可解析,如下所示,当前地址0位置处的PTE基址是。

2301_78287784的博客 573

YOLOv11改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 4977

WINDOWS2k内存管理

1、内存布局Virtual Memory Layout on the PAE x86 is:                 +------------------------------------+        00000000 |                                    |                 |                          

老裴 2018

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

19.x64下算出PTE

X64下用的是9-9-9-9-12的分页模式,PML4E-PDPTE-PDE-PTE-偏移,线性地址的前16位是作符号扩展,后48位是分页模式. 1.PTE是直接指向物理内存的,X86下有个固定的页目录表0xc0000000可得到所有地址信息,X64下为了安全起见,页目录表随机了,文章末有分析如何得到。 一、PTE的算法: 1.已一个线性地址为例0xfffffa801a628b30,下面先拆分 PML4E:1111 1010 1 1F5 PDPTE:000 000...

qq_35129925的博客 1868

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Windows XP内核变量

本文是根据网上的两篇文章《Finding some non-exported kernel variables in windows xp》和《Getting Kernel Variables from KdVersionBLOCK, Part 2》得出的结果,作的总结。_KPCR   +0x000 NtTib            : _NT_TIB   +0x01c SelfP

misterliwei的专栏 4478

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

获取操作系统的内核基地址

操作系统的内核模块根据处理器的个数和是否支持PAE(Physical Address Extension物理地址扩展)分为以下四种 ntoskrnl.exe ---Uniprocessor单处理器,不支持PAE ntkrnlpa.exe ---Uniprocessor单处理器,支持PAE ntkrnlmp.exe ---Multiprocess...

weixin_33724046的博客 653

drv experiment : 从内核API代码定位函数地址或结构指针地址

用WinDbg看已经导出的内核API代码, 如果看到需要的未导出函数调用或想直接从汇编代码中定位那个API地址, 可以定位 CALL指令中未导出函数地址. 未导出函数地址 = 已经导出的内核API首地址 + 计算出的 硬编码偏移. 得到已经导出的内核API地址 PVOID GetKernelApiAddress(wchar_t * pcApiName) { UN

博客标题不能为空 2376

memory block - Linux内存管理(5)

日期 内核版本 架构 作者 GitHub 优快云 2017-07-017 Linux-4.12 X86 lwhuq LinuxMemoryStudy Linux内存管理 1 Introduction   在Linux内核早期启动阶段,在Linux的内存管理模块还没有初始化完成之前,内

lwhuq的博客 2514
上一篇: SMM Rootkit limitations.
下一篇: 用 Junction 绕过数字签名检测
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值