成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 前端
在過往的dump分析中都是用戶態程序的泄露,內核態模式堆的的泄露還是第一次分析,不是朋友提供的這次機會,真的就沒緣分啦!在這次dump分析過程中,也讓大家看到了 windbg 是多么的強大!

一、背景

1. 講故事

前幾天有位朋友找到我,說他的機器內存在不斷的上漲,但在任務管理器中查不出是哪個進程吃的內存,特別奇怪,截圖如下:

圖片圖片

在我的分析旅程中都是用戶態模式的內存泄漏,像上圖中的異常征兆已經明確告訴你了,不是用戶態程序吃的內存,那就是內核態程序吃的,比如:

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

從概率上來說一般都是某些第三方程序內存泄露導致的,這一篇我們就來聊一聊這種問題該如何解決。

二、內核模式堆泄露分析

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

相信有很多朋友都知道,用戶態的程序是直接或者間接的調用 VirtualAlloc 方法來向操作系統要內存,包括 C# 的 GC 堆也是一樣,它的方法簽名如下:

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

那內核中的驅動程序是如何向操作系統要內存的呢?一般都是調用 ExAllocatePool2 方法來要內存的,簽名如下:

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

上面有兩個參數要詳細解釋一下:

  • Flags 參數

一般用的多的就是 POOL_FLAG_NON_PAGED 和 POOL_FLAG_PAGED 兩種,前者表示分配的內存是需要永久駐留內存,不可以交換到硬盤的。后者分配的內存是可以交換到硬盤的。

  • Tag 參數

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

2. 制造內核模式堆泄露

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

打開 myfault 工具然后輸入 40M/s 的泄露,并分配在非換頁池中,同時配置下內核態轉儲dump, 代碼和截圖參考如下:

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

圖片圖片

在泄露的過程中,通過 Process Explorer 很明顯的發現提交了 6.7G 的內存,其中有 4.9G 是在 NonPaged 中,即通過上圖中的 POOL_FLAG_NON_PAGED 標記分配的,截圖如下:

圖片圖片

接下來在 MyFault 上切換到 Crash 選項卡,強行讓操作系統藍屏來生成 dump 文件。

3. dump 分析

拿到dump后,先通過 !vm 觀察下操作系統級的虛擬內存的分布情況。

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 的內存頁。

接下來就是要深挖下 非換頁池 ,看看到底都是什么 Tag 分配的,可以使用 !poolused 2 命令。

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 的內存分配。

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

3: kd> lm
start             end                 module name
ffffc25c`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.sys
fffff807`31550000 fffff807`31560000   dump_storport.sys
fffff807`315a0000 fffff807`315d3000   dump_storahci.sys
fffff807`31000000 fffff807`3101e000   dump_dumpfve.sys
fffff807`26b80000 fffff807`26bac000   luafv.sys
fffff807`26b20000 fffff807`26b30000   dump_storport.sys
fffff807`26b70000 fffff807`26ba3000   dump_storahci.sys
fffff807`26bd0000 fffff807`26bee000   dump_dumpfve.sys
fffff807`28130000 fffff807`2814c000   dam.sys 
fffff807`24200000 fffff807`2420a000   360elam64.sys
fffff807`25230000 fffff807`25241000   hwpolicy.sys

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

3: kd> lmvm myfault
Browse full module list
start             end                 module name
fffff807`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`47f50000
Evaluate expression: 36864 = 00000000`00009000

3: 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 是多么的強大!

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2021-01-04 08:09:07

Linux內核Watchdog

2022-11-26 00:00:06

裝飾者模式Component

2022-11-01 08:46:20

責任鏈模式對象

2023-05-15 08:38:58

模板方法模式

2021-08-04 09:32:05

Typescript 技巧Partial

2021-07-16 11:48:26

模型 .NET微軟

2024-10-28 21:02:36

消息框應用程序

2018-06-07 13:17:12

契約測試單元測試API測試

2023-09-22 17:36:37

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2023-02-09 10:39:15

gRPC通信模式

2022-09-26 08:03:25

VMware虛擬機

2023-03-03 12:37:50

JavaJVM內存溢出

2023-04-19 20:51:45

2020-08-12 08:34:16

開發安全We

2021-01-01 09:01:05

前端組件化設計

2020-06-28 09:30:37

Linux內存操作系統

2022-10-08 11:33:56

邊緣計算云計算

2018-01-10 14:13:04

測試矩陣API測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美四虎| 亚洲资源在线 | chinese中国真实乱对白 | 国产1区2区在线观看 | 国产欧美日韩一区 | 欧美日韩亚 | 国产国拍亚洲精品av | 91精品久久| 中文字幕 亚洲一区 | 久久久久亚洲视频 | 久草高清视频 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 日批日韩在线观看 | 亚洲高清视频在线 | 国产精品国产亚洲精品看不卡15 | 精品日韩欧美一区二区 | 亚洲一区二区三区在线 | 久久精品国产99国产精品亚洲 | 亚洲精品视频网站在线观看 | 亚洲国产精品成人 | 欧美精品一区二区三区一线天视频 | 91视频在线看 | 综合五月 | 91精品国产一区二区三区香蕉 | 91精品国产色综合久久 | www国产成人免费观看视频,深夜成人网 | 亚洲成人中文字幕 | 免费一区二区在线观看 | 亚洲狠狠爱一区二区三区 | 一区二区三区中文 | 蜜桃视频在线观看免费视频网站www | 99色视频| 一级毛片视频 | 中文字幕亚洲视频 | 亚洲一区二区av | 日韩一区av | 亚洲国产精品久久久久婷婷老年 | 久久久高清 | 色婷婷av久久久久久久 | 成人免费视频在线观看 | 亚洲免费视频一区二区 |