日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

聊一聊 .NET高級調試 內核模式堆泄露

來源: 責編: 時間:2023-12-14 16:37:45 258觀看
導讀一:背景1. 講故事前幾天有位朋友找到我,說他的機器內存在不斷的上漲,但在任務管理器中查不出是哪個進程吃的內存,特別奇怪,截圖如下:圖片在我的分析旅程中都是用戶態模式的內存泄漏,像上圖中的異常征兆已經明確告訴你了,不是

一:背景

1. 講故事

前幾天有位朋友找到我,說他的機器內存在不斷的上漲,但在任務管理器中查不出是哪個進程吃的內存,特別奇怪,截圖如下:WXc28資訊網——每日最新資訊28at.com

圖片圖片WXc28資訊網——每日最新資訊28at.com

在我的分析旅程中都是用戶態模式的內存泄漏,像上圖中的異常征兆已經明確告訴你了,不是用戶態程序吃的內存,那就是內核態程序吃的,比如:WXc28資訊網——每日最新資訊28at.com

  • 某些驅動程序
  • 操作系統

從概率上來說一般都是某些第三方程序內存泄露導致的,這一篇我們就來聊一聊這種問題該如何解決。WXc28資訊網——每日最新資訊28at.com

二:內核模式堆泄露分析

1. 驅動程序是如何分配內存的

相信有很多朋友都知道,用戶態的程序是直接或者間接的調用 VirtualAlloc 方法來向操作系統要內存,包括 C# 的 GC 堆也是一樣,它的方法簽名如下:WXc28資訊網——每日最新資訊28at.com

LPVOID VirtualAlloc(  [in, optional] LPVOID lpAddress,  [in]           SIZE_T dwSize,  [in]           DWORD  flAllocationType,  [in]           DWORD  flProtect);

那內核中的驅動程序是如何向操作系統要內存的呢?一般都是調用 ExAllocatePool2 方法來要內存的,簽名如下:WXc28資訊網——每日最新資訊28at.com

DECLSPEC_RESTRICT PVOID ExAllocatePool2(  POOL_FLAGS Flags,  SIZE_T     NumberOfBytes,  ULONG      Tag);

上面有兩個參數要詳細解釋一下:WXc28資訊網——每日最新資訊28at.com

  • Flags 參數

一般用的多的就是 POOL_FLAG_NON_PAGED 和 POOL_FLAG_PAGED 兩種,前者表示分配的內存是需要永久駐留內存,不可以交換到硬盤的。后者分配的內存是可以交換到硬盤的。WXc28資訊網——每日最新資訊28at.com

  • Tag 參數

這個參數的本意就是方便日后洞察內存泄露的,它強行讓一塊內存和這個 Tag(4byte的ascii 字符串) 做了強綁定,到時候通過這個 tag 就知道是誰分配的內存。WXc28資訊網——每日最新資訊28at.com

2. 制造內核模式堆泄露

為了能夠讓驅動程序泄露,可以使用微軟提供的 NotMyFault 工具,這個工具利用 myfault.sys 驅動不斷的向操作系統分配內存。官方網址為:https://learn.microsoft.com/zh-cn/sysinternals/downloads/notmyfaultWXc28資訊網——每日最新資訊28at.com

打開 myfault 工具然后輸入 40M/s 的泄露,并分配在非換頁池中,同時配置下內核態轉儲dump, 代碼和截圖參考如下:WXc28資訊網——每日最新資訊28at.com

ExAllocatePool2(POOL_FLAG_NON_PAGED,40*1024*1024,"Leak");

圖片圖片WXc28資訊網——每日最新資訊28at.com

在泄露的過程中,通過 Process Explorer 很明顯的發現提交了 6.7G 的內存,其中有 4.9G 是在 NonPaged 中,即通過上圖中的 POOL_FLAG_NON_PAGED 標記分配的,截圖如下:WXc28資訊網——每日最新資訊28at.com

圖片圖片WXc28資訊網——每日最新資訊28at.com

接下來在 MyFault 上切換到 Crash 選項卡,強行讓操作系統藍屏來生成 dump 文件。WXc28資訊網——每日最新資訊28at.com

3. dump 分析

拿到dump后,先通過 !vm 觀察下操作系統級的虛擬內存的分布情況。WXc28資訊網——每日最新資訊28at.com

3: kd> !vm...Physical Memory:          2069421 (    8277684 Kb)Available Pages:           445015 (    1780060 Kb)ResAvail Pages:            707292 (    2829168 Kb)Locked IO Pages:                0 (          0 Kb)Free System PTEs:      4295052431 (17180209724 Kb)...Modified Pages:             11479 (      45916 Kb)Modified PF Pages:          11479 (      45916 Kb)Modified No Write Pages:        0 (          0 Kb)NonPagedPool Usage:       1219892 (    4879568 Kb)NonPagedPoolNx Usage:       24512 (      98048 Kb)NonPagedPool Max:      4294967296 (17179869184 Kb)PagedPool Usage:            32907 (     131628 Kb)PagedPool Maximum:     4294967296 (17179869184 Kb)...NonPagedPool Commit:      1246469 (    4985876 Kb)...Sum System Commit:        1409562 (    5638248 Kb)Total Private:             279673 (    1118692 Kb)********** Sum of individual system commit + Process commit exceeds overall commit by 1952 Kb ? ********Committed pages:          1688747 (    6754988 Kb)Commit limit:             4166573 (   16666292 Kb)

從卦中的 NonPagedPool Usage 指標可以看到,當前的 非換頁池 占用了 4.8G 內存,總計 121w 的內存頁。WXc28資訊網——每日最新資訊28at.com

接下來就是要深挖下 非換頁池 ,看看到底都是什么 Tag 分配的,可以使用 !poolused 2 命令。WXc28資訊網——每日最新資訊28at.com

3: kd> !poolused 2.... Sorting by NonPaged Pool Consumed               NonPaged                  Paged Tag     Allocs         Used     Allocs         Used Leak       119   4991221760          0            0 UNKNOWN pooltag 'Leak', please update pooltag.txt ConT       238     14499840          0            0 UNKNOWN pooltag 'ConT', please update pooltag.txt KETR     16410      8117664          0            0 UNKNOWN pooltag 'KETR', please update pooltag.txt EtwB       196      7565568          2       131072 Etw Buffer , Binary: nt!etw 2872         6      5660864          0            0 UNKNOWN pooltag '2872', please update pooltag.txt 287R      1026      4183040          0            0 UNKNOWN pooltag '287R', please update pooltag.txt File      9734      3877408          0            0 File objects  Thre      1257      3217920          0            0 Thread objects , Binary: nt!ps EtwR     12141      2672640          0            0 Etw KM RegEntry , Binary: nt!etw...

從卦中數據看,有一個神秘的 Tag=Leak 的內存分配,它分配了 119 次,總大小 4.99G。哈哈,其實就是剛才通過 MyFault 做的 40M/s 的內存分配。WXc28資訊網——每日最新資訊28at.com

接下來的問題是:這個 Leak 是哪一個驅動程序所為呢?最簡單的辦法就是在各個驅動的內存空間中做內存搜索,看看誰里面有 Leak 的asc硬編碼,對吧,有了這個思路,先用 lm 看看里面都有哪些 sys 。WXc28資訊網——每日最新資訊28at.com

3: kd> lmstart             end                 module nameffffc25c`891b0000 ffffc25c`89480000   win32kbase   (deferred)             ffffc25c`8a190000 ffffc25c`8a545000   win32kfull   (deferred)     ...                  fffff807`22600000 fffff807`23646000   nt         (pdb symbols) fffff807`23c00000 fffff807`23d16000   clipsp     (deferred)             fffff807`47f30000 fffff807`47f4b000   monitor    (deferred)             fffff807`47f50000 fffff807`47f59000   myfault    (deferred)             ...          Unloaded modules:fffff807`3c6e0000 fffff807`3c6ec000   360Sensor64.sysfffff807`31550000 fffff807`31560000   dump_storport.sysfffff807`315a0000 fffff807`315d3000   dump_storahci.sysfffff807`31000000 fffff807`3101e000   dump_dumpfve.sysfffff807`26b80000 fffff807`26bac000   luafv.sysfffff807`26b20000 fffff807`26b30000   dump_storport.sysfffff807`26b70000 fffff807`26ba3000   dump_storahci.sysfffff807`26bd0000 fffff807`26bee000   dump_dumpfve.sysfffff807`28130000 fffff807`2814c000   dam.sys fffff807`24200000 fffff807`2420a000   360elam64.sysfffff807`25230000 fffff807`25241000   hwpolicy.sys

接下來就是寫腳本在每個 sys 的 start ~ end 區間做 s 搜索,這個腳本我就不放了,非常簡單,最終就在 myfault.sys 中成功找到了 Leak 硬編碼,參考如下:WXc28資訊網——每日最新資訊28at.com

3: kd> lmvm myfaultBrowse full module liststart             end                 module namefffff807`47f50000 fffff807`47f59000   myfault    (deferred)                 Image path: /??/C:/Windows/system32/drivers/myfault.sys    Image name: myfault.sys    Browse all global symbols  functions  data    Timestamp:        Fri Sep 30 00:17:31 2022 (6335C51B)    CheckSum:         00010CED    ImageSize:        00009000    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4    Information from resource tables:    3: kd> ? fffff807`47f59000 - fffff807`47f50000Evaluate expression: 36864 = 00000000`000090003: kd> s -a fffff807`47f50000 L?0x9000  "Leak"fffff807`47f51559  4c 65 61 6b 0f 42 c1 41-8d 49 fd 8b d0 ff 15 0c  Leak.B.A.I......fffff807`47f515c7  4c 65 61 6b 0f 42 c1 33-c9 8b d0 ff 15 a0 1a 00  Leak.B.3........

三: 總結

在過往的dump分析中都是用戶態程序的泄露,內核態模式堆的的泄露還是第一次分析,不是朋友提供的這次機會,真的就沒緣分啦!在這次dump分析過程中,也讓大家看到了 windbg 是多么的強大!WXc28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-45491-0.html聊一聊 .NET高級調試 內核模式堆泄露

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 終于要改進東亞語言如中文的排版體驗了,CSS中引入四個新的國際功能

下一篇: JFrog董任遠:以端到端的平臺加速軟件開發,幫助企業更好地管理運維核心資產

標簽:
  • 熱門焦點
  • K60至尊版狂暴引擎2.0加持:超177萬跑分斬獲性能第一

    Redmi的后性能時代戰略發布會今天下午如期舉辦,在本次發布會上,Redmi公布了多項關于和聯發科的深度合作,以及新機K60 Ultra在軟件和硬件方面的特性,例如:“K60 至尊版,雙芯旗艦
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之“想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!”曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 消費結構調整丨巨頭低價博弈,拼多多還卷得動嗎?

    來源:征探財經作者:陳香羽隨著流量紅利的退潮,電商的存量博弈越來越明顯。曾經主攻中高端與品質的淘寶天貓、京東重拾“低價”口號。而過去與他們錯位競爭的拼多多,靠
  • 8月見!小米MIX Fold 3獲得3C認證:支持67W快充

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 華為HarmonyOS 4.0將于8月4日發布 或搭載AI大模型技術

    華為宣布HarmonyOS4.0將于8月4日正式發布。此前,華為已經針對開發者公布了HarmonyOS4.0,以便于開發者提前進行適配,也因此被曝光出了一些新系統的特性
  • 超級標準版旗艦!iQOO 11S全球首發iQOO超算獨顯芯片

    上半年已接近尾聲,截至目前各大品牌旗下的頂級旗艦都已悉數亮相,而下半年即將推出的頂級旗艦已經成為了數碼圈爆料的主流,其中就包括全新的iQOO 11S系
Top 主站蜘蛛池模板: 东海县| 永寿县| 南开区| 德令哈市| 泰安市| 黎城县| 新乡县| 维西| 黄骅市| 资源县| 邢台县| 呼玛县| 石嘴山市| 淮南市| 襄汾县| 东光县| 鸡西市| 吉安市| 陇西县| 临沂市| 乌兰察布市| 南丰县| 东台市| 石渠县| 泰兴市| 广水市| 长治县| 石嘴山市| 新余市| 博乐市| 江油市| 双牌县| 衡南县| 普安县| 滨州市| 社旗县| 黑山县| 通榆县| 柳河县| 黑河市| 灵台县|