nt!MiRemovePageByColor函数分析之脱链和刷新颜色表
第0部分:背景
PFN_NUMBER
FASTCALL
MiRemoveZeroPage (
IN ULONG Color
)
{
ASSERT (Color < MmSecondaryColors);
Page = FreePagesByColor[Color].Flink;
if (Page != MM_EMPTY_LIST) {
//
// Remove the first entry on the zeroed by color list.
//
Page = MiRemovePageByColor (Page, Color);
第一部分:
1: kd> p
nt!MiRemoveZeroPage+0x11a:
80ac89b6 e825e4ffff call nt!MiRemovePageByColor (80ac6de0)
1: kd> t
nt!MiRemovePageByColor:
80ac6de0 55 push ebp
1: kd> kc
#
00 nt!MiRemovePageByColor
01 nt!MiRemoveZeroPage
02 nt!MiPfPutPagesInTransition
03 nt!MmPrefetchPages
04 nt!CcPfPrefetchSections
05 nt!CcPfBootWorker
06 nt!PspSystemThreadStartup
07 nt!KiThreadStartup
1: kd> dv
Page = 0x7b19b
Color = 0x1b
Next = 0
ListName = 0n-150603048 (No matching enumerant)
1: kd> dd 81000000+0x7b19b*18
81b8a688 0007b19a 001ec66c 0007b19c 00003000
81b8a698 0007b15b 03ffffff
第二部分:预分析1
+0x00c u3 : __unnamed
+0x000 e1 : _MMPFNENTRY
+0x000 Modified : Pos 0, 1 Bit
+0x000 ReadInProgress : Pos 1, 1 Bit
+0x000 WriteInProgress : Pos 2, 1 Bit
+0x000 PrototypePte : Pos 3, 1 Bit
+0x000 PageColor : Pos 4, 4 Bits 0000
+0x000 PageLocation : Pos 8, 3 Bits 000 ZeroedPageList (0)
1: kd> x nt!MmPageLocationList
80b14d04 nt!MmPageLocationList = struct _MMPFNLIST *[8]
1: kd> dx -r1 (*((ntkrnlmp!_MMPFNLIST * (*)[8])0x80b14d04))
(*((ntkrnlmp!_MMPFNLIST * (*)[8])0x80b14d04)) [Type: _MMPFNLIST * [8]]
[0] : 0x80b14c94 [Type: _MMPFNLIST *]
[1] : 0x80b14ca4 [Type: _MMPFNLIST *]
[2] : 0x80b14cb4 [Type: _MMPFNLIST *]
[3] : 0x80b14cc4 [Type: _MMPFNLIST *]
[4] : 0x80b14cd4 [Type: _MMPFNLIST *]
[5] : 0x80b14ce4 [Type: _MMPFNLIST *]
[6] : 0x0 [Type: _MMPFNLIST *]
[7] : 0x0 [Type: _MMPFNLIST *]
1: kd> dx -r1 ((ntkrnlmp!_MMPFNLIST *)0x80b14c94)
((ntkrnlmp!_MMPFNLIST *)0x80b14c94) : 0x80b14c94 [Type: _MMPFNLIST *]
[+0x000] Total : 0x70e85 [Type: unsigned long]
[+0x004] ListName : ZeroedPageList (0) [Type: _MMLISTS]
[+0x008] Flink : 0xed7 [Type: unsigned long]
[+0x00c] Blink : 0xa130 [Type: unsigned long]
第三部分:预分析2
1: kd> dd 81000000+0x7b19b*18
81b8a688 0007b19a 001ec66c 0007b19c 00003000
81b8a698 0007b15b 03ffffff
Next = Pfn1->u1.Flink; 0007b19a
Pfn1->u1.Flink = 0; // Assumes Flink width is >= WsIndex width
Previous = Pfn1->u2.Blink; 0007b19c
Pfn1->u2.Blink = 0;
第四部分:预分析3
#define MM_EMPTY_LIST ((ULONG)0xFFFFFFFF) //
ColorHead->Flink = (PFN_NUMBER) Pfn1->OriginalPte.u.Long;
if (ColorHead->Flink != MM_EMPTY_LIST) {
MI_PFN_ELEMENT (ColorHead->Flink)->u4.PteFrame = MM_EMPTY_LIST;
}
1: kd> dt _MMCOLOR_TABLES 0x81c00000+1b*c
nt!_MMCOLOR_TABLES
+0x000 Flink : 0x7b19b
+0x004 Blink : 0x810f2688 Void
+0x008 Count : 0x1c35
1: kd> dd 81000000+0007b15b*18
81b8a088 0007b15a 001ec56c 0007b15c 00003000
81b8a098 0007b11b 0007b19b
第五部分:调试
Pfn1 = MI_PFN_ELEMENT (Page);81b8a688
NodeColor = Pfn1->u3.e1.PageColor;
1: kd> p
nt!MiRemovePageByColor+0x48:
80ac6e28 8b7e0c mov edi,dword ptr [esi+0Ch]
1: kd> r
eax=001714d1 ebx=0000001b ecx=81000000 edx=0000001b esi=81b8a688
1: kd> dd 81b8a688
81b8a688 0007b19a 001ec66c 0007b19c 00003000
81b8a698 0007b15b 03ffffff
ListHead = MmPageLocationList[Pfn1->u3.e1.PageLocation]; 0
ListName = ListHead->ListName; ZeroedPageList (0)
1: kd> p
nt!MiRemovePageByColor+0x88:
80ac6e68 83e007 and eax,7
1: kd> p
nt!MiRemovePageByColor+0x8b:
80ac6e6b 8b0485044db180 mov eax,dword ptr nt!MmPageLocationList (80b14d04)[eax*4]
1: kd> r
eax=00000000
1: kd> x nt!MmPageLocationList
80b14d04 nt!MmPageLocationList = struct _MMPFNLIST *[8]
1: kd> dx -r1 (*((ntkrnlmp!_MMPFNLIST * (*)[8])0x80b14d04))
(*((ntkrnlmp!_MMPFNLIST * (*)[8])0x80b14d04)) [Type: _MMPFNLIST * [8]]
[0] : 0x80b14c94 [Type: _MMPFNLIST *]
[1] : 0x80b14ca4 [Type: _MMPFNLIST *]
[2] : 0x80b14cb4 [Type: _MMPFNLIST *]
[3] : 0x80b14cc4 [Type: _MMPFNLIST *]
[4] : 0x80b14cd4 [Type: _MMPFNLIST *]
[5] : 0x80b14ce4 [Type: _MMPFNLIST *]
[6] : 0x0 [Type: _MMPFNLIST *]
[7] : 0x0 [Type: _MMPFNLIST *]
1: kd> dx -r1 ((ntkrnlmp!_MMPFNLIST *)0x80b14c94)
((ntkrnlmp!_MMPFNLIST *)0x80b14c94) : 0x80b14c94 [Type: _MMPFNLIST *]
[+0x000] Total : 0x70e85 [Type: unsigned long]
[+0x004] ListName : ZeroedPageList (0) [Type: _MMLISTS]
[+0x008] Flink : 0xed7 [Type: unsigned long]
[+0x00c] Blink : 0xa130 [Type: unsigned long]
第六部分:
1: kd> p
nt!MiRemovePageByColor+0x95:
80ac6e75 ff08 dec dword ptr [eax]
1: kd> r
eax=80b14c94
ListHead->Total -= 1;
1: kd> dx -r1 ((ntkrnlmp!_MMPFNLIST *)0x80b14c94)
((ntkrnlmp!_MMPFNLIST *)0x80b14c94) : 0x80b14c94 [Type: _MMPFNLIST *]
[+0x000] Total : 0x70e84 [Type: unsigned long]
[+0x004] ListName : ZeroedPageList (0) [Type: _MMLISTS]
[+0x008] Flink : 0xed7 [Type: unsigned long]
[+0x00c] Blink : 0xa130 [Type: unsigned long]
第七部分:
Next = Pfn1->u1.Flink;
Pfn1->u1.Flink = 0; // Assumes Flink width is >= WsIndex width
Previous = Pfn1->u2.Blink;
Pfn1->u2.Blink = 0;
1: kd> dd 81b8a688
81b8a688 00000000 001ec66c 00000000 00003000
81b8a698 0007b15b 03ffffff
else {
Pfn2 = MI_PFN_ELEMENT(Next);
Pfn2->u2.Blink = Previous;
}
1: kd> dd 81000000+0x7b19a*18
81b8a670 0007b199 001ec668 0007b19b 00003000
81b8a680 0007b15a 0007b1da
else {
Pfn2 = MI_PFN_ELEMENT(Next);
Pfn2->u2.Blink = Previous;
}
1: kd> dd 81000000+0x7b19a*18
81b8a670 0007b199 001ec668 0007b19c 00003000
81b8a680 0007b15a 0007b1da
else {
Pfn2 = MI_PFN_ELEMENT(Previous);
Pfn2->u1.Flink = Next;
}
1: kd> dd 81000000+0x7b19c*18
81b8a6a0 0007b19a 001ec670 0007b19d 00003000
81b8a6b0 0007b15c 0007b1dc
u1和u2脱链完成。
第八部分:
Pfn1->u3.e2.ShortFlags = 0;
Pfn1->u3.e1.PageColor = NodeColor;
Pfn1->u3.e1.CacheAttribute = MiNotMapped;
typedef enum _MI_PFN_CACHE_ATTRIBUTE {
MiNonCached, 0
MiCached, 1
MiWriteCombined, 2
MiNotMapped 3
} MI_PFN_CACHE_ATTRIBUTE, *PMI_PFN_CACHE_ATTRIBUTE;
1: kd> dd 81000000+0x7b19b*18
81b8a688 00000000 001ec66c 00000000 00003000
81b8a698 0007b15b 03ffffff
+0x00c u3 : __unnamed
+0x000 e1 : _MMPFNENTRY
+0x000 Modified : Pos 0, 1 Bit
+0x000 ReadInProgress : Pos 1, 1 Bit
+0x000 WriteInProgress : Pos 2, 1 Bit
+0x000 PrototypePte : Pos 3, 1 Bit
+0x000 PageColor : Pos 4, 4 Bits
+0x000 PageLocation : Pos 8, 3 Bits
+0x000 RemovalRequested : Pos 11, 1 Bit
+0x000 CacheAttribute : Pos 12, 2 Bits 11=3
第九部分:
//
// Update the color lists.
//
ASSERT (Color < MmSecondaryColors);
ColorHead = &MmFreePagesByColor[ListName][Color];
ASSERT (ColorHead->Count >= 1);
ColorHead->Flink = (PFN_NUMBER) Pfn1->OriginalPte.u.Long;
if (ColorHead->Flink != MM_EMPTY_LIST) {
MI_PFN_ELEMENT (ColorHead->Flink)->u4.PteFrame = MM_EMPTY_LIST;
}
1: kd> dt _MMCOLOR_TABLES 0x81c00000+1b*c
nt!_MMCOLOR_TABLES
+0x000 Flink : 0x7b19b
+0x004 Blink : 0x810f2688 Void
+0x008 Count : 0x1c35
1: kd> p
nt!MiRemovePageByColor+0x181:
80ac6f61 8d3c81 lea edi,[ecx+eax*4]
1: kd> pr
eax=00000051 ebx=0000001b ecx=81c00000 edx=81000000 esi=81b8a688 edi=81c00144
1: kd> dd 0x81c00000+1b*c
81c00144 0007b19b 810f2688 00001c35
ColorHead->Flink = (PFN_NUMBER) Pfn1->OriginalPte.u.Long; =0007b15b
1: kd> dd 81000000+0x7b19b*18
81b8a688 00000000 001ec66c 00000000 00003000
81b8a698 0007b15b 03ffffff
1: kd> dt _MMCOLOR_TABLES 0x81c00000+1b*c
nt!_MMCOLOR_TABLES
+0x000 Flink : 0x7b15b
+0x004 Blink : 0x810f2688 Void
+0x008 Count : 0x1c35
1: kd> dd 81000000+0x7b15b*18
81b8a088 0007b15a 001ec56c 0007b15c 00003000
81b8a098 0007b11b 0007b19b
if (ColorHead->Flink != MM_EMPTY_LIST) {
MI_PFN_ELEMENT (ColorHead->Flink)->u4.PteFrame = MM_EMPTY_LIST;
}
1: kd> dd 81000000+0x7b15b*18
81b8a088 0007b15a 001ec56c 0007b15c 00003000
81b8a098 0007b11b 03ffffff
第十部分:
ColorHead->Count -= 1;
1: kd> dt _MMCOLOR_TABLES 0x81c00000+1b*c
nt!_MMCOLOR_TABLES
+0x000 Flink : 0x7b15b
+0x004 Blink : 0x810f2688 Void
+0x008 Count : 0x1c34
第十一部分:
1: kd> p
nt!MiRemovePageByColor+0x213:
80ac6ff3 c9 leave
1: kd> r
eax=0007b19b
1: kd> dd 81000000+0x7b19b*18
81b8a688 00000000 001ec66c 00000000 00003000
81b8a698 0007b15b 03ffffff
相关文章:
nt!MiRemovePageByColor函数分析之脱链和刷新颜色表
第0部分:背景 PFN_NUMBER FASTCALL MiRemoveZeroPage ( IN ULONG Color ) { ASSERT (Color < MmSecondaryColors); Page FreePagesByColor[Color].Flink; if (Page ! MM_EMPTY_LIST) { // // Remove the first entry on the zeroe…...

【爬虫】12306自动化购票
上文: 【爬虫】12306查票-CSDN博客 下面是简单的自动化进行抢票,只写到预定票,没有写完登陆, 跳出登陆后与上述代码同理修改即可。 感觉xpath最简单,复制粘贴: 还有很多写法: 官网地址&#…...
不同消息队列保证高可用实现方案
消息队列的高可用性(High Availability, HA)是分布式系统中的核心需求,不同消息队列通过多种技术手段实现高可用。以下是主流消息队列的高可用实现方案及对比: 一、Apache Kafka 副本机制(Replication) 每个…...

【Django系统】Python+Django携程酒店评论情感分析系统
Python Django携程酒店评论情感分析系统 项目概述 这是一个基于 Django 框架开发的酒店评论情感分析系统。系统使用机器学习技术对酒店评论进行情感分析,帮助酒店管理者了解客户反馈,提升服务质量。 主要功能 评论数据导入:支持导入酒店…...

spring cloud alibaba-Geteway详解
spring cloud alibaba-Gateway详解 Gateway介绍 在 Spring Cloud Alibaba 生态系统中,Gateway 是一个非常重要的组件,用于构建微服务架构中的网关服务。它基于 Spring Cloud Gateway 进行扩展和优化,提供了更强大的功能和更好的性能。 Gat…...

c#中添加visionpro控件(联合编程)
vs添加vp控件 创建窗体应用 右键选择项 点击确定 加载CogAcqfifoTool工具拍照 设置参数保存.vpp 保存为QuickBuild或者job, ToolBlock 加载保存的acq工具 实例化相机工具类 //引入命名空间 using Cognex.VisionPro; //实例化一个相机工具类 CogAcqFifoTool cogAcqFifoTool n…...

性能测试-mysql监控
mysql常用监控指标 慢查询sql 慢查询:指执行速度低于设置的阀值的sql语句 作用:帮助定位查询速度较慢的sql语句,方便更好的优化数据库系统的性能 开启mysql慢查询日志 参数说明: slow_query_log:慢查询日志开启状态【on…...

游戏引擎学习第301天:使用精灵边界进行排序
回顾并为今天的内容做准备 昨天,我们解决了一些关于排序的问题,这对我们清理长期存在的Z轴排序问题很有帮助。这个问题我们一直想在开始常规游戏代码之前解决。虽然不确定是否完全解决了问题,但我们提出了一个看起来合理的排序标准。 有两点…...
CSS attr() 函数详解
attr() 是 CSS 中的一个函数,用于获取 HTML 元素的属性值并在样式中使用。虽然功能强大,但它的应用有一些限制和注意事项。 基本语法 element::pseudo-element {property: attr(attribute-name); } 可用场景 1. 在伪元素的 content 属性中使用&#…...

【AI生成PPT】使用ChatGPT+Overleaf自动生成学术论文PPT演示文稿
【AI生成PPT】使用ChatGPTOverleaf自动生成学术论文PPT演示文稿 文章摘要:使用ChatGPTBeamer自动生成学术论文PPT演示文稿Beamer是什么Overleaf编辑工具ChatGPT生成Beamer Latex代码论文获取prompt设计 生成结果 文章摘要: 本文介绍了一种高效利…...
流复备机断档处理
文章目录 环境症状问题原因解决方案 环境 系统平台:UOS(海光),UOS (飞腾),UOS(鲲鹏),UOS(龙芯),UOS (申威),银河麒麟svs(X86_64&…...
Linux 安装 pytorch+cuda+gpu 大模型开发环境过程记录
Linux 安装 pytorchcudagpu 大模型开发环境过程记录 2025-05-17 本文可用于生产环境,用于大模型训练开发运行。 1. 确定 OS 架构 # cat /etc/os-release NAME"Ubuntu" VERSION"20.04.6 LTS (Focal Fossa)" # uname -m x86_642. 查看磁盘空间…...

局部放大maya的视图HUD文字大小的方法
一、问题描述: 有网友问:有办法局部放大maya的字体吗比如hud中currenttime打开之后画面右下角有个frame 想放大一下能做到吗? 在 Maya 中,可以通过自定义 HUD(Heads-Up Display)元素的字体大小来局部放大特…...
数学复习笔记 16
前言 例题真是经典。 background music 《青春不一样》 2.28 算一个行列式,算出来行列式不等于零,这表示矩阵式可逆的。但是这个算的秩是复合的,感觉没啥好办法了,我直接硬算了,之后再看解析积累好的方法。算矩阵…...

初识Linux · NAT 内网穿透 内网打洞 代理
目录 前言: 内网穿透和打洞 NAPT表 内网穿透 内网打洞 正向/反向代理 前言: 本文算是网络原理的最后一点补充,为什么说是补充呢,因为我们在前面第一次介绍NAT的时候详细介绍的是报文从子网到公网,却没有介绍报文…...

STM32接收红外遥控器的遥控信号
经过几天早晨的学习,终于把遥控器的红外信号给搞通了,特此记录一下;其实说白了,红外遥控就是高低电平的信号,用时间来区分是二进制的0还是1;然后把这些0或1,在组装成一个32位的数基本就算是完事…...

Redis从入门到实战 - 高级篇(下)
一、Redis键值设计 1. 优雅的key结构 Redis的Key虽然可以自定义,但最好遵循下面几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过44字节不包含特殊字符 例如:我们的登录业务,保存用户信息&…...
NGINX常用功能—笔记
NGINX 是一款高性能的开源 Web 服务器和反向代理服务器,常用于处理高并发场景,其功能丰富且灵活。以下是 NGINX 的常用功能及详细说明: 一、静态资源服务器 功能说明:直接处理 HTML、CSS、JavaScript、图片、视频等静态文件请求&a…...
JVM 性能问题排查实战10连击
🗂️ 目录 前言:理论掌握只是起点,定位能力才是核心全局排查模型:三步法1️⃣Full GC 频繁触发:老年代压力过大2️⃣ OOM 爆炸:元空间泄漏 or 缓存未清理3️⃣ CPU 飙升却不是 GC:线程阻塞或热方…...
【jvm第8集】jvm调优工具(图形化工具)
文章目录 一、JVM 调优图形化工具分类二、JDK 自带工具JConsoleVisualVM 三、第三方工具MAT(Memory Analyzer Tool)JProfiler(商业工具)YourKit(商业工具) 四、APM工具全链路监控与智能运维(AIO…...
Python测试单例模式
单例模式的核心思想 单例模式确保一个类只有一个实例,并提供一个全局访问点。这在需要控制资源访问(如配置文件、数据库连接等)时非常有用。 一个简单的示例: import threading import timeclass Singleton:instance Nonelock…...
多技术栈 iOS 项目的性能调试实战:从 Flutter 到 Unity(含 KeyMob 工具实测)
多技术栈 iOS 项目的性能调试实战:从 Flutter 到 Unity 随着移动端开发日趋多元化,iOS 项目中纯 Objective-C/Swift 已不再是唯一选择。越来越多团队采用 Flutter、React Native、Unity、WebView 混合等方案构建 App。这种“技术栈混合”带来灵活性的同…...
STM32简易计算机设计
运用 A0上拉按钮和 A1 A2下拉按钮设计按键功能 加上独特的算法检测设计,先计算()内在计算乘除在计算加减的值在计算乘除优先级最后计算加减优先级 #include "stm32f10x.h" #include <stdio.h> #include <stdlib.h>…...

GUI实验
题目: 编程包含一个标签和一个按钮,单击按钮时,标签的内容在"你好"和"再见"之间切换。 分析: 导入所需的Java库:程序使用了 javax.swing 包中的一些类来创建图形用户界面。 创建一个 JFrame 对象…...

量子计算 | 量子密码学的挑战和机遇
量子计算在密码学中的应用现主要体现在对现有加密算法的威胁上。最著名的例子是Shor算法,该算法能够在多项式时间内分解大整数,从而威胁到基于大数分解的加密算法,如RSA加密。此外,量子计算还可以加速某些类型的密码分析ÿ…...
linux系统查看硬盘序列号
Linux系统查看硬盘信息指南 方法一:hdparm工具 sudo hdparm -i /dev/sda输出示例:在返回信息中查找"SerialNo"字段为序列号,"Model"字段为硬盘型号注意:必须使用root权限,普通用户需在命令前加s…...

分享一些多模态文档解析思路
多模态文档解析思路小记 作者:Arlene 原文:https://zhuanlan.zhihu.com/p/1905635679293122466 多模态文档解析内容涉及:文本、表格和图片 解析思路v1 基于mineru框架对pdf文件进行初解析 其具备较完整的布局识别和内容识别,并将…...
CSS 选择器入门
一、CSS 选择器基础:快速掌握核心概念 什么是选择器? CSS 选择器就像 “网页元素的遥控器”,用于定位 HTML 中的特定元素并应用样式。 /* 结构:选择器 { 属性: 值; } */ p { color: red; } /* 选择所有<p>元素,…...
【Django】Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景)
📦 Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景) 在使用 Django REST Framework(DRF)时,很多人习惯了用 GenericAPIView 或 ViewSet 自动帮我们处理分页。但在某些场景中…...

AI知识梳理——RAG、Agent、ReAct、LangChain、LangGraph、MCP、Function Calling、JSON-RPC
AI技术I AI技术II RAG 📌 高度凝练表达 RAG (检索增强生成)是一种结合信息检索与生成式人工智能的技术框架,旨在提升大型语言模型(LLM)的输出准确性和实用性。通过在生成响应前引入外部知识库的信息&#…...