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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83964.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83964.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83964.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DEBUG:Lombok 失效

DEBUG&#xff1a;Lombok 失效 問題描述 基于 Spring Boot 的項目中&#xff0c;編譯時顯示找不到 log 屬性。查看對應的 class 類&#xff0c;Lombok 正常在編譯時生成 log 屬性。 同時存在另一個問題&#xff0c;使用Getter注解&#xff0c;但實際使用中該注解并沒有生效&…

3D幾何建模引擎3D ACIS Modeler核心功能深度解讀

3D ACIS Modeler是一款由Spatial Corporation&#xff08;現為Dassault Systmes旗下&#xff09;開發的工業級三維幾何建模內核&#xff0c;為CAD/CAM/CAE、建筑、制造、測量及三維動畫等領域提供底層建模能力。本文將從基本定位、核心功能及行業案例三方面&#xff0c;系統介紹…

Flutter - 集成三方庫:數據庫(sqflite)

數據庫 $ flutter pub add sqlite $ flutter pub get$ flutter run運行失敗&#xff0c;看是編譯報錯,打開Xcode工程 ? B 編譯 對比 GSYGithubAppFlutter 的Xcode工程Build Phases > [CP] Embed Pods Frameworks 有sqfite.framework。本地默認的Flutter工程默認未生成Pod…

Android 中 權限分類及申請方式

在 Android 中,權限被分為幾個不同的類別,每個類別有不同的申請和管理方式。 一、 普通權限(Normal Permissions) 普通權限通常不會對用戶隱私或設備安全造成太大風險。這些權限在應用安裝時自動授予,無需用戶在運行時手動授權。 android.permission.INTERNETandroid.pe…

目標檢測指標計算

mAP&#xff08;mean Average Precision&#xff09; 概述 預備參數&#xff1a;類別數&#xff0c;IoU閾值&#xff0c;maxDets值&#xff08;每張測試圖像最多保留maxDets個預測框&#xff0c;通常是根據置信度得分排序后取前maxDets個&#xff09;&#xff1b; Q: 假如某張…

聯合索引失效情況分析

一.模擬表結構&#xff1a; 背景&#xff1a; MySQL版本——8.0.37 表結構DDL&#xff1a; CREATE TABLE unite_index_table (id bigint NOT NULL AUTO_INCREMENT COMMENT 主鍵,clomn_first varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMEN…

軟件架構之-論分布式架構設計及其實現

論分布式架構設計及其實現 摘要正文摘要 2023年2月,本人所在集團公司承接了長三角地區某省漁船圖紙電子化審查項目開發,該項目旨在為長三角地區漁船建造設計院、漁船審圖機構提供一個便捷化的服務平臺。在次項目中,我作為項目成員參與了整個項目的建設工作,全權負責項目需求…

Pydantic數據驗證實戰指南:讓Python應用更健壯與智能

導讀&#xff1a;在日益復雜的數據驅動開發環境中&#xff0c;如何高效、安全地處理和驗證數據成為每位Python開發者面臨的關鍵挑戰。本文全面解析了Pydantic這一革命性數據驗證庫&#xff0c;展示了它如何通過聲明式API和類型提示系統&#xff0c;徹底改變Python數據處理模式。…

3、ubantu系統 | 通過vscode遠程安裝并配置anaconda

1、vscode登錄 登錄后通過pwd可以發現目前位于wangqinag賬號下&#xff0c;左側為屬于該賬號的文件夾及文件。 通過cd ..可以回到上一級目錄&#xff0c;通過ls可以查看當前目錄下的文件夾及文件。 2、安裝 2.1、下載anaconda 通過wget和curl下載未成功&#xff0c;使用手動…

Python 與 Java 在 Web 開發中的深度對比:從語言特性到生態選型

在 Web 開發領域&#xff0c;Python 和 Java 作為兩大主流技術棧&#xff0c;始終是開發者技術選型時的核心考量。本文將從語言本質、框架生態、性能工程、工程實踐等多個維度展開深度對比&#xff0c;結合具體技術場景解析兩者的適用邊界與融合方案&#xff0c;為開發者提供系…

【OpenGL學習】(一)創建窗口

文章目錄 【OpenGL學習】&#xff08;一&#xff09;創建窗口 【OpenGL學習】&#xff08;一&#xff09;創建窗口 GLFW OpenGL 本身只是一套圖形渲染 API&#xff0c;不提供窗口創建、上下文管理或輸入處理的功能。 GLFW 是一個支持創建窗口、處理鍵盤鼠標輸入和管理 OpenGL…

電腦閃屏可能的原因

1. 顯示器 / 屏幕故障 屏幕排線接觸不良&#xff1a;筆記本電腦屏幕排線&#xff08;屏線&#xff09;松動或磨損&#xff0c;導致信號傳輸不穩定&#xff0c;常見于頻繁開合屏幕的設備。屏幕面板損壞&#xff1a;液晶屏內部燈管老化、背光模塊故障或面板本身損壞&#xff0c;…

docker容器知識

一、docker與docker compose區別&#xff1a; 1、docker是創建和管理單個容器的工具&#xff0c;適合簡單的應用或服務&#xff1b; 2、docker compose是管理多容器應用的工具&#xff0c;適合復雜的、多服務的應用程序&#xff1b; 3、docker與docker compose對比&#xff…

什么是Rootfs

Rootfs (Root Filesystem) 詳解 buildroot工具構建了一個名為"rootfs.tar"的根文件系統壓縮包。 什么是rootfs Rootfs&#xff08;Root Filesystem&#xff0c;根文件系統&#xff09;是操作系統啟動后掛載的第一個文件系統&#xff0c;它包含系統正常運行所需的基…

關于NLP自然語言處理的簡單總結

參考&#xff1a; 什么是自然語言處理&#xff1f;看這篇文章就夠了&#xff01; - 知乎 (zhihu.com) 所謂自然語言理解&#xff0c;就是研究如何讓機器能夠理解我們人類的語言并給出一些回應。 自然語言處理&#xff08;Natural Language Processing&#xff0c;NLP&#xff0…

Linux下載國外軟件鏡像的加速方法(以下載Python-3.8.0.tgz為例)

0 前言 使用linux經常會通過國外服務器下載軟件鏡像&#xff0c;有些軟件的下載速度奇慢&#xff0c;本文介紹一種加速國外軟件鏡像下載速度的方法&#xff0c;需要準備下載工具&#xff1a;迅雷。 1 以下載Python-3.8.0.tgz為例 找到Python官網的Python-3.8.0.tgz鏡像下載地…

沒有公網ip怎么端口映射外網訪問?使用內網穿透可以解決

無公網IP時本地搭建的網絡端口服務怎么映射外網遠程訪問&#xff1f;較為簡單通用的方案就是使用nat123內網穿透&#xff0c;下面詳細內網映射外網實現教程。? 一、了解內網公網區別&#xff0c;及無公網IP外網訪問方案 內網IP默認只能在同局域網內連接互通&#xff0c;而公…

Word2Vec詳解

目錄 Word2Vec 一、Word2Vec 模型架構 &#xff08;一&#xff09;Word2Vec 的核心理念 &#xff08;二&#xff09;Word2Vec 的兩種架構 &#xff08;三&#xff09;負采樣與層次 Softmax &#xff08;四&#xff09;Word2Vec 的優勢與局限 二、Word2Vec 預訓練及數據集…

ShardingSphere:查詢報錯:Actual table `數據源名稱.表名` is not in table rule configuration

目錄 簡介異常信息排查原因解決 簡介 1、使用ShardingSphere框架&#xff0c;版本為5.2.1 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.2.1</version>…

MongoDB聚合查詢:從入門到精通

文章目錄 前言一、工具一般聚合查詢分為四步 二、使用步驟1.MongoDB Compass2.Studio 3T 二、舉個栗子總結 前言 Mongo 聚合查詢 一般用mongo做數據庫,涉及到關聯查詢情況不多,但是還有些情況要使用到,今天就講下如何通過工具做關聯查詢,最終聚合結果,得到最終的查詢結果集; …