windows內核研究(內存管理-線性地址的管理)

內存管理


線性地址的管理

進程空間的地址劃分

分區x86 32位Windows
空指針賦值區0x00000000 - 0x0000FFFF
用戶模式區0x00010000 - 0x7FFEFFFF
64KB禁入區0x7FFF0000 - 0x7FFFFFFF
內核0x80000000 - 0xFFFFFFFF

線性地址有4GB,但是并不是所有的地方都能訪問(這里的不能訪問只是默認情況下,一但給這些區域掛上物理頁還是可以訪問的),所以需要記錄哪些地方分配了

在內核空間是通過一個鏈表把所有未分配的空間鏈在一起
但是在用戶空間,這樣管理的效率太低,而是通過收索二叉樹來管理

在_EPROCESS結構體當中有一個成員VadRoot,這個成員就是這個二叉樹的入口點

在這里插入圖片描述
由于我是用64位windbg分析32位的系統,版本等原因導致VadRoot的地址未被正常解析出來,所以我們直接加上偏移來解析這個地址

dt _RTL_AVL_TREE (ac110040 + 310)  // 進程地址ac110040 + 偏移310 VadRoot處

在這里插入圖片描述
得到地址:0xbb925678

VadRoot通常每一個節點都是_MMVAD結構,但是現在的windows對VadRoot進行了優化,并不直接指向_MMVAD,而是通過AVL 樹/紅黑樹的結構來進行優化訪問和存儲可以使用以下命令直接遍歷VadRoot

!vad 地址 // 遍歷vad

在這里插入圖片描述

字段示例值含義
VAD 節點地址bb923260該 VAD 節點在內核中的內存地址(_MMVAD 結構地址)
Level8該節點在 VAD 樹中的深度(層級)
Start580內存區域的起始頁號(需轉換為虛擬地址:Start << PAGE_SHIFT,32位系統 PAGE_SHIFT=12,即 0x580000
End5a7內存區域的結束頁號(0x5A7000
Commit5已提交的物理頁數量(單位:頁,每頁通常 4KB)
TypeMapped內存類型:
? Private(私有內存,如堆/棧)
? Mapped(映射文件或共享內存)
SubtypeExe子類型(僅適用于 Mapped 類型):
? Exe(可執行文件映射)
? Image(鏡像文件)
? 其他(如 Pagefile
ProtectionEXECUTE_WRITECOPY內存保護標志:
? READONLY/READWRITE
? EXECUTE/EXECUTE_WRITECOPY
? PAGE_GUARD(保護頁)
File/Desc\Users\...\x32dbg.exe如果是文件映射,顯示文件路徑;如果是共享內存,顯示描述信息(如 Pagefile section

Private Memory

申請內存的兩種方式:

  1. 通過VirtualAlloc/VirtualAllocEx申請的:Private Memory(當前的進程獨享內存)
  2. 通過CreateFileMapping映射的:Mapped Memory

我們來通過代碼來看一下VirtualAlloc在沒有分配和分配后的線性地址

#include<iostream>
#include<windows.h>LPVOID lpAddr;int main() {printf("當前內存還未申請!");getchar();lpAddr = VirtualAlloc(NULL, 0x1000 * 2, MEM_COMMIT, PAGE_READWRITE);printf("申請的內存地址:0x%x", lpAddr);system("pasue");return 0;
}

在這里插入圖片描述
此時內存還未申請,我們用windbg查看一下當前進程的線程地址

在這里插入圖片描述
回到程序讓程序申請內存后我們再來看下
在這里插入圖片描述

在這里插入圖片描述
可以看到在我們沒有分配內存時,0xbc0位置是沒有分配的,可以看上面對應的屬性和我們申請時填寫的一致

堆與棧

那這個VirtualAlloc和我們在寫c/c++程序時,用到的molloc/new關鍵字有什么區別呢,c/c++使用的申請是在當中申請的它們的低層實現是HeapAlloc,它是由操作系統提前通過VirtualAlloc申請好的一塊內存空間,當使用molloc/new時,就會把申請好的地址給掛過去

代碼測試

#include<iostream>
#include<Windows.h>int num = 0x789;int main() {printf("申請內存之前!");getchar();// 在棧上分配內存int stack = 0x123;// 在堆上分配內存int* heap = new int(0x456);printf("棧空間的地址:0x%x\n",&stack);printf("堆空間的地址:0x%x\n",heap);printf("全局變量的地址:0x%x\n", &num);system("pause");return 0;
}

在這里插入圖片描述

在這里插入圖片描述

可以發現在我們程序中無論是全局變量,還是堆空間,棧空間中的內存在程序運行時就已經存在了

可以發現全局變量是在我們的程序中的一個位置寫死的


Mapped Memory

上面講到Private Memory是推私有的,而Mapped Memory是共享的,可以是文件共享或者是物理頁共享

在這里插入圖片描述
在上圖中,Mapped后面有對應文件路徑的就是文件共享,反之就是物理頁共享

代碼測試

#include<iostream>
#include<windows.h>int main(){// 第一個參數如果提供一個文件的句柄,那么創建出來的就是文件映射,否則就是內存映射。HANDLE g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,BUFSIZ,L"共享內存");// 將物理頁與線性地址進行關聯LPTSTR g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile,FILE_MAP_ALL_ACCESS,0,0,BUFSIZ);*(PDWORD)g_lpBuff = 0x12345678;printf("A進程寫入地址內容:%p - %x",g_lpBuff,*(PDWORD)g_lpBuff);system("pause");return 0;
}

在這里插入圖片描述
我們再到windbg中遍歷一下

在這里插入圖片描述
可以看到B30的位置已經分配好了物理頁,然后我們就可以在其他進程獲取到這個創建好的內存空間

代碼測試

#include <iostream>
#include <windows.h>int main() {HANDLE g_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, L"共享內存");// 將物理頁與線性地址進行映射LPTSTR g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFSIZ);printf("B進程讀取%x", *(PDWORD)g_lpBuff);system("pause");return 0;
}

在這里插入圖片描述
可以看到我們成功的讀取到了內容

共享文件

#include<iostream>
#include<windows.h>int main(){HANDLE g_hFile = CreateFile(L"newMemory.exe",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_READONLY, NULL);HANDLE g_hMapFile = CreateFileMapping(g_hFile,NULL,PAGE_READWRITE,0,BUFSIZ,NULL);LPTSTR g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUFSIZ);printf("地址:0x%x",g_lpBuff);system("pause");return 0;
}

在這里插入圖片描述

windbg中查看

在這里插入圖片描述

可以看到已經成功的映射到了我們的文件上


寫拷貝

可以看到這里的有一部分它的類型是EXECUTE_WRITECOPY,Mapped的后面還有一個Exe,這又是什么呢?
在這里插入圖片描述

代碼測試

#include<iostream>
#include<windows.h>int main(){LoadLibrary(L"C:\\Users\\win10x32\\Desktop\\gxnc.exe");system("pause");return 0;
}

在這里插入圖片描述

可以看到當我們以LoadLibrary載入一個PE文件時,它的屬性會被設置為EXECUTE_WRITECOPOY,所以我們看到的kernel32.dll,KernelBase.dll,其實都是操作系統用LoadLibrary一個個加載的,本質上沒有任何區別,設置為EXECUTE_WRITECOPOY是因為當前系統環境有很多進程都在使用,也都可以對該文件進行修改,那這樣以來,一但某一個進程修改了系統dll,那其他使用這個dll的進程就會出問題

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

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

相關文章

【問題解決】使用patch-package修改node-models中的源碼

文章目錄一、應用場景二、patch-package 和 postinstallpatch-packagepostinstall三、操作步驟1、使用yarn安裝patch-package和postinstall-postinstall2、修改package.json3、修改node-model中源碼、保存。4、找到修改文件對應的包名5、使用git將新增的patches文件同步到倉庫6…

當配置項只支持傳入數字,即無法指定單位為rem,需要rem轉px

您好&#xff01;針對您 Vue 3 Element Plus 的技術棧&#xff0c;要優雅且符合大廠規范地解決這個問題&#xff0c;最佳實踐是創建一個響應式的 Composition API (組合式函數)。 這個方法完全遵循 Vue 3 的設計哲學&#xff0c;具有高內聚、低耦合、可復用、類型安全&#xf…

谷歌搜索 sg_ss 逆向分析

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01;部分python代碼sg_ss cp.call(get_sg_…

一個“加鎖無效“的詭異現象

加鎖了還出問題&#xff1f;從"點擊過快"到"狀態可控"&#xff1a;多線程共享變量的并發陷阱與實戰對策詳情如下&#xff1a;在服務端開發中&#xff0c;多線程并發處理客戶端請求是提升系統吞吐量的常見手段。最近有位開發者朋友遇到了一個令人費解的問題…

液體泄漏識別誤報率↓76%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;禁止未經授權的轉載與篡改。一、行業痛點&#xff1a;液體泄漏識別的現實挑戰在化工生產、食品加工、倉儲物流等場景中&#xff0c;液體泄漏的實時監測是保障安全生產的關鍵…

Y9000P跑開源模型(未完成)

環境信息 1、Y9000筆記本 2、1T空白硬盤 3、ubunut24.04桌面版 一、環境初始化 第一部分&#xff1a;系統初始化 1、安裝基礎軟件 apt-get update apt-get -y install openssh-server openssh-client apt-utils freeipmi ipmitool sshpass ethtool zip unzip nano less git ne…

ARM體系結構

ARM體系結構 編程原理 從源代碼到CPU執行過程 #mermaid-svg-M4xemCxDjIQVNNnW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:14px;fill:#333;}#mermaid-svg-M4xemCxDjIQVNNnW .error-icon{fill:hsl(220.5882352941, 100%, 98.3333333333%);}#mer…

基于SpringBoot的高校社團管理系統的設計與實現(代碼+LW文檔+遠程運行)

&#x1f4af;博主&#xff1a;?全網擁有50W粉絲、博客專家、全棧領域優質創作者、平臺優質Java創作者、專注于Java技術領域和畢業項目實戰?&#x1f4af; &#x1f497;開發技術&#xff1a;SpringBoot、Vue、SSM、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、…

F5發布業界首創集成式應用交付與安全平臺,開啟ADC 3.0新時代

在數字化轉型加速與AI技術蓬勃發展的今天&#xff0c;企業對應用性能與安全的需求正經歷革命性變革。傳統應用架構已難以滿足現代混合多云環境與AI驅動型業務場景的嚴苛要求。全球領先的應用安全和交付服務提供商F5&#xff08;NASDAQ: FFIV&#xff09;&#xff0c;持續推動 F…

SELinux 入門指南

SELinux(Security-Enhanced Linux)是 Linux 內核的一個安全模塊&#xff0c;它提供了一種強制訪問控制&#xff08;Mandatory Access Control, MAC&#xff09;機制。與傳統的 Linux 自主訪問控制&#xff08;Discretionary Access Control, DAC&#xff09;不同&#xff0c;SE…

ARMv8 MMU頁表格式及地址轉換過程分析

1.簡介 CPU發出的虛擬地址經過MMU轉換后得到物理地址&#xff0c;然后使用物理地址訪問真實的硬件。虛擬地址和物理地址的映射關系保存在頁表中&#xff0c;MMU需要遍歷頁表&#xff0c;才能將虛擬地址轉換成物理地址。ARM64現在有兩種大小的頁表描述符&#xff0c;分別是ARMv8…

數據結構---二叉樹(概念、特點、分類、特性、讀取順序、例題)、gdb調試指令、時間復雜度(概念、大O符號法、分類)

一、二叉樹1、樹1&#xff09;概念 樹是 n(n > 0) 個結點的有限集合。若 n0 &#xff0c;為空樹。在任意一個非空樹中&#xff1a;&#xff08;1&#xff09;有且僅有一個特定的根結點&#xff1b;&#xff08;2&#xff09;當 n>1 時&#xff0c;其余結點可分為 …

安全基礎DAY1-安全概述

信息安全現狀及挑戰常見術語信息安全的脆弱性及常見攻擊網絡環境的開放性其實就是人人可以上網&#xff0c;網上零成本。協議棧自身的脆弱性及常見攻擊協議棧自身的脆弱性常見安全風險網絡的基本攻擊模式物理層--物理攻擊前置知識 1.打開Apache服務 cd /etc/init.d ./apache2 s…

Claude Code 的核心能力與架構解析

技術分析介紹&#xff1a;Claude Code 的核心能力與架構解析一、概述 Claude Code 是由 Anthropic 推出的面向開發者的智能編碼助手&#xff0c;它不僅僅是一個代碼生成工具&#xff0c;更是一個具備記憶、工具調用、自主規劃和環境感知能力的“智能代理”&#xff08;Agentic …

Mac 電腦放在環境變量中的通用腳本

mac電腦下放在環境變量中&#xff0c;方便提高效率執行 注&#xff1a;相關路徑需要根據實際情況進行更新 需要在 .bash_profile 文件中定義如下&#xff08;路徑需要做實際替換&#xff09;&#xff1a; source $HOME/software/scripts/base_profile.sh source $HOME/software…

UE藍圖節點Add Impulse和Add Torque in Radians

???????Add Impulse&#xff1a;對剛體施加一次性的線性脈沖&#xff08;瞬時改變量&#xff09;&#xff0c;改變速度&#xff08;與質量有關&#xff0c;除非你勾 bVelChange&#xff09;。Add Torque (in Radians)&#xff1a;對剛體施加轉矩/旋轉力&#xff08;向量…

大型語言模型幻覺檢測與緩解技術研究綜述

摘要 本文系統綜述了大型語言模型(LLMs)中的幻覺現象及其檢測與緩解技術。研究首先從認知機制角度分析了幻覺產生的理論根源&#xff0c;包括模型對語言先驗的過度依賴、訓練數據偏差以及推理過程中的信息衰減等問題。在技術層面&#xff0c;綜述將現有方法歸納為三類&#xff…

【數據結構初階】--二叉樹(二)

&#x1f618;個人主頁&#xff1a;Cx330? &#x1f440;個人簡介&#xff1a;一個正在努力奮斗逆天改命的二本覺悟生 &#x1f4d6;個人專欄&#xff1a;《C語言》《LeetCode刷題集》《數據結構-初階》 前言&#xff1a;上篇博客我們學習了有關樹的概念和相關術語的介紹&…

jmm 指令重排 緩存可見性 Volatile 內存屏障

CPU指令重排 CPU指令重排是指CPU為了提高指令執行效率&#xff0c;可能會對指令的執行順序進行優化&#xff0c;使得&#xff08;單線程下&#xff09;指令的實際執行順序與代碼中的順序不同&#xff0c;但結果是一致的。 這種優化是通過亂序執行和緩存讀寫重排來實現的。 亂序…

卡車手機遠程啟動一鍵啟動無鑰匙進入有哪些好處

隨著汽車科技的發展&#xff0c;卡車智能化升級已成為趨勢&#xff0c;其中手機控車、遠程啟動、無鑰匙進入及一鍵啟動等功能顯著提升了駕駛便捷性與安全性。以下從功能特點、技術原理、適用場景及改裝建議等方面展開說明。一、核心功能及技術特點1. 無鑰匙進入系統自動感應操作…