国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区

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

.NET 程序的 GDI 句柄泄露的再反思

來源: 責編: 時間:2023-08-05 11:45:59 4797觀看
導讀一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反饋兩個問題:GDIView 統計不準怎么辦?我只有 D

一、背景

1. 講故事

上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反饋兩個問題:Ox128資訊網——每日最新資訊28at.com

  • GDIView 統計不準怎么辦?
  • 我只有 Dump 可以統計嗎?

其實那篇文章也聊過,在 x64 或者 wow64 的程序里,在用戶態內存段中有一個 GDI Shared Handle Table 句柄表,這個表中就統計了各自句柄類型的數量,如果能統計出來也就回答了上面的問題,對吧。Ox128資訊網——每日最新資訊28at.com

32bit 程序的 GDI Shared Handle Table 段是沒有的,即 _PEB.GdiSharedHandleTable = NULL。Ox128資訊網——每日最新資訊28at.com

0:002> dt ntdll!_PEB GdiSharedHandleTable 01051000  +0x0f8 GdiSharedHandleTable : (null)Ox128資訊網——每日最新資訊28at.com

有了這些前置基礎,接下來就可以開挖了。Ox128資訊網——每日最新資訊28at.com

二、挖 GdiSharedHandleTable

1. 測試代碼

為了方便測試,我來造一個 DC句柄 的泄露。Ox128資訊網——每日最新資訊28at.com

internal class Program    {        [DllImport("Example_20_1_5", CallingConvention = CallingConvention.Cdecl)]        extern static void GDILeak();        static void Main(string[] args)        {            try            {                GDILeak();            }            catch (Exception ex)            {                Console.WriteLine(ex.Message);            }            Console.ReadLine();        }    }

然后就是 GDILeak 的 C++ 實現代碼。Ox128資訊網——每日最新資訊28at.com

extern "C"{ _declspec(dllexport) void GDILeak();}void GDILeak(){    while (true)    {        CreateDCW(L"DISPLAY", nullptr, nullptr, nullptr);        auto const gdiObjectsCount = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS);        std::cout << "GDI objects: " << gdiObjectsCount << std::endl;        Sleep(10);    }}

程序跑起來后,如果你是x64的程序那沒有關系,但如果你是 32bit 的程序一定要生成一個 Wow64 格式的 Dump,千萬不要抓它的 32bit dump,否則拿不到 GdiSharedHandleTable 字段也就無法后續分析了,那如何生成 Wow64 格式的呢?我推薦兩種方式。Ox128資訊網——每日最新資訊28at.com

  • 使用64bit任務管理器(系統默認)生成
  • 使用 procdump -64 -ma QQ.exe 中的 -64 參數

這里我們采用第一種方式,截圖如下:Ox128資訊網——每日最新資訊28at.com

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

2. 分析 GdiSharedHandleTable

使用偽寄存器變量提取出 GdiSharedHandleTable 字段,輸出如下:Ox128資訊網——每日最新資訊28at.com

0:000> dt ntdll!_PEB GdiSharedHandleTable @$peb   +0x0f8 GdiSharedHandleTable : 0x00000000`03560000 Void

接下來使用 !address 找到這個 GdiSharedHandleTable 的首末地址。Ox128資訊網——每日最新資訊28at.com

0:000> !address 0x00000000`03560000Usage:                  OtherBase Address:           00000000`03560000End Address:            00000000`036e1000Region Size:            00000000`00181000 (   1.504 MB)State:                  00001000          MEM_COMMITProtect:                00000002          PAGE_READONLYType:                   00040000          MEM_MAPPEDAllocation Base:        00000000`03560000Allocation Protect:     00000002          PAGE_READONLYAdditional info:        GDI Shared Handle TableContent source: 1 (target), length: 181000

上一篇我們聊過每新增一個GDI句柄都會在這個表中增加一條 GDICell,輸出如下:Ox128資訊網——每日最新資訊28at.com

typedef struct { PVOID64 pKernelAddress; USHORT wProcessId; USHORT wCount; USHORT wUpper; USHORT wType; PVOID64 pUserAddress;} GDICell;

這個 GDICell 有兩個信息比較重要。Ox128資訊網——每日最新資訊28at.com

  • wProcessId 表示進程 ID
  • wType 表示句柄類型。

理想情況下是對 句柄類型 進行分組統計就能知道是哪里的泄露,接下來的問題是如何找呢?可以仔細觀察結構體, wProcessId 和 wType 的偏移是 3USHORT=6byte,我們在內存中找相對偏移不就可以了嗎?接下來在內存中搜索這塊Ox128資訊網——每日最新資訊28at.com

0:000> ~..  0  Id: 101c.4310 Suspend: 0 Teb: 00000000`009bf000 Unfrozen      Start: Example_20_1_4_exe!wmainCRTStartup (00000000`00d4ffe0)      Priority: 0  Priority class: 32  Affinity: fff0:000> s-w 03560000 036e1000 101c00000000`03562060  101c 0000 af01 0401 0b00 0830 0000 0000  ..........0.....00000000`035782a0  101c ff1d ffff ffff 0000 0000 1d0f 010f  ................00000000`0357c688  101c 0000 3401 0401 0160 0847 0000 0000  .....4..`.G........00000000`035a5f98  101c 0000 0801 0401 0dc0 08a1 0000 0000  ................00000000`035a5fb0  101c 0000 0801 0401 0c60 08a1 0000 0000  ........`.......00000000`035a5fc8  101c 0000 0801 0401 0840 08a1 0000 0000  ........@.......00000000`035a5fe0  101c 0000 0801 0401 0b00 08a1 0000 0000  ................

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

從卦中可以看到,當前有1029個 GDICell 結構體,接下來怎么鑒別每一條記錄上都是什么類型呢?其實這里是有枚舉的。Ox128資訊網——每日最新資訊28at.com

  1. DC = 0x01
  2. Region = 0x04
  3. Bitmap = 0x05
  4. Palette =0x08
  5. Font =0x0a
  6. Brush = 0x10
  7. Pen = 0x30

即 GDIView 中的 紅色一列 。Ox128資訊網——每日最新資訊28at.com

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

到這里我們可以通過肉眼觀察 + F5 檢索,可以清晰的看到1029 個句柄對象,其中 1028 個是 DC 對象,其實這就是我們泄露的,截圖如下:Ox128資訊網——每日最新資訊28at.com

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

3. 腳本處理

如果大家通讀會發現這些都是固定步驟,完全可以寫成比如 C++ 和 Javascript 的格式腳本,在 StackOverflow 上還真有這樣的腳本。Ox128資訊網——每日最新資訊28at.com

$$ Run as: $$>a<DumpGdi.txt$$ Written by Alois Kraus 2016$$ uses pseudo registers r0-5 and r8-r14r @$t1=0r @$t8=0r @$t9=0r @$t10=0r @$t11=0r @$t12=0r @$t13=0r @$t14=0$$ Increment count is 1 byte until we find a matching field with the current pidr @$t4=1r @$t0=$peb$$ Get address of GDI handle table into t5.foreach /pS 3 /ps 1 ( @$GdiSharedHandleTable { dt ntdll!_PEB GdiSharedHandleTable @$t0 } ) { r @$t5 = @$GdiSharedHandleTable }$$ On first call !address produces more output. Do a warmup.foreach /pS 50 ( @$myStartAddress {!address  @$t5} ) {  }$$ Get start address of file mapping into t2.foreach /pS 4 /ps 40 ( @$myStartAddress {!address  @$t5} ) { r @$t2 = @$myStartAddress }$$ Get end address of file mapping into t3.foreach /pS 7 /ps 40 ( @$myEndAddress {!address  @$t5} ) { r @$t3 = @$myEndAddress }.printf "GDI Handle Table %p %p", @$t2, @$t3.for(; @$t2 < @$t3; r @$t2 = @$t2 + @$t4) {  $$ since we walk bytewise through potentially invalid memory we need first to check if it points to valid memory  .if($vvalid(@$t2,4) == 1 )   {     $$ Check if pid matches     .if (wo(@$t2) == @$tpid )      {         $$ increase handle count stored in $t1 and increase step size by 0x18 because we know the cell structure GDICell has a size of 0x18 bytes.        r @$t1 = @$t1+1        r @$t4 = 0x18        $$ Access wType of GDICELL and increment per GDI handle type        .if (by(@$t2+6) == 0x1 )  { r @$t8 =  @$t8+1  }        .if (by(@$t2+6) == 0x4 )  { r @$t9 =  @$t9+1  }        .if (by(@$t2+6) == 0x5 )  { r @$t10 = @$t10+1 }        .if (by(@$t2+6) == 0x8 )  { r @$t11 = @$t11+1 }        .if (by(@$t2+6) == 0xa )  { r @$t12 = @$t12+1 }        .if (by(@$t2+6) == 0x10 ) { r @$t13 = @$t13+1 }        .if (by(@$t2+6) == 0x30 ) { r @$t14 = @$t14+1 }     }   } }.printf "/nGDI Handle Count      %d", @$t1.printf "/n/tDeviceContexts: %d", @$t8.printf "/n/tRegions:        %d", @$t9.printf "/n/tBitmaps:        %d", @$t10.printf "/n/tPalettes:       %d", @$t11.printf "/n/tFonts:          %d", @$t12.printf "/n/tBrushes:        %d", @$t13.printf "/n/tPens:           %d", @$t14.printf "/n/tUncategorized:  %d/n", @$t1-(@$t14+@$t13+@$t12+@$t11+@$t10+@$t9+@$t8)

最后我們用腳本跑一下,哈哈,是不是非常清楚。Ox128資訊網——每日最新資訊28at.com

0:000> $$>a< "D:/testdump/DumpGdi.txt"GDI Handle Table 0000000003560000 00000000036e1000GDI Handle Count      1028 DeviceContexts: 1028 Regions:        0 Bitmaps:        0 Palettes:       0 Fonts:          0 Brushes:        0 Pens:           0 Uncategorized:  0

三、總結

如果大家想從 DUMP 文件中提取 GDI 句柄泄露類型,這是一篇很好的參考資料,相信能從另一個角度給你提供一些靈感。Ox128資訊網——每日最新資訊28at.com

本文鏈接:http://www.rrqrq.com/showinfo-26-140-0.html.NET 程序的 GDI 句柄泄露的再反思

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

上一篇: 這款新興工具平臺,讓你的電腦效率翻倍

下一篇: 虛擬鍵盤 API 的妙用

標簽:
  • 熱門焦點
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業務來說可快速實現自動化的上手工作。Selenium IDEKat
  • JVM優化:實戰OutOfMemoryError異常

    一、Java堆溢出堆內存中主要存放對象、數組等,只要不斷地創建這些對象,并且保證 GC Roots 到對象之間有可達路徑來避免垃 圾收集回收機制清除這些對象,當這些對象所占空間超過
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 品牌洞察丨服務本地,美團直播成效幾何?

    來源:17PR7月11日,美團App首頁推薦位出現&ldquo;美團直播&rdquo;的固定入口。在直播聚合頁面,外賣&ldquo;神槍手&rdquo;直播間、美團旅行直播間、美團買菜直播間等均已上線,同時
  • 首發天璣9200+ iQOO Neo8系列發布首銷售價2299元起

    2023年5月23日晚,iQOO Neo8系列正式發布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強悍登場,限時售價3099元起;價位段最強性能手機iQOO Neo8同期上市
  • 榮耀Magicbook V 14 2021曙光藍版本正式開售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍版本正式開售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤鍵程、
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
91精品国产乱码久久蜜臀| 亚洲成a人片在线不卡一二三区| 久久久精品黄色| 国产亚洲欧美一区在线观看| 国产精品一级黄| 欧美精品国产精品| 久久精品国产免费| 日本精品视频一区二区三区| 亚洲.国产.中文慕字在线| 99国产精品久久久久老师| 国产精品国产三级国产专播品爱网| 99精品热视频| 久久精品欧美日韩精品| 97久久精品人人澡人人爽| 欧美精品一区二| 91免费小视频| 精品国产亚洲在线| www.色综合.com| 26uuu色噜噜精品一区| 不卡一区二区在线| 久久女同性恋中文字幕| 97精品久久久久中文字幕 | 三级欧美韩日大片在线看| 亚洲综合二区| 舔着乳尖日韩一区| 91黄色免费观看| 精久久久久久久久久久| 7799精品视频| 国产91高潮流白浆在线麻豆| 精品日韩在线一区| 欧美在线影院| 国产精品麻豆一区二区| 久久99国产乱子伦精品免费| 日韩三级免费观看| 国产乱码精品一区二区三区av| 在线观看视频91| 国产在线麻豆精品观看| 欧美一二三区在线| 欧美精品一区二区视频| 中文字幕一区二区三区乱码在线| 粉嫩嫩av羞羞动漫久久久| 欧美一区二区三区思思人| 丁香啪啪综合成人亚洲小说 | 成人福利视频在线看| 久久久久久99精品| 亚洲国产日韩在线| 午夜日韩在线电影| 欧美精品久久天天躁| 粉嫩嫩av羞羞动漫久久久| 国产亚洲欧洲一区高清在线观看| 亚洲大胆视频| 日日摸夜夜添夜夜添亚洲女人| 欧美性色aⅴ视频一区日韩精品| 国产精品91xxx| 国产三级精品在线| 影音先锋久久久| 视频一区二区不卡| 日韩亚洲电影在线| 国产一区二区中文字幕免费看| 亚洲综合区在线| 欧美日韩一区精品| 欧美一站二站| 亚洲午夜久久久久中文字幕久| 欧美色成人综合| 欧美在线观看天堂一区二区三区| 亚洲精品欧美二区三区中文字幕| 在线观看亚洲精品| 97精品国产露脸对白| 亚洲最快最全在线视频| 欧美日韩一二三| 色综合久久综合| 亚洲国产美国国产综合一区二区| 毛片一区二区三区| 婷婷久久综合九色综合绿巨人| 亚洲国产成人午夜在线一区| 嫩草成人www欧美| 亚洲午夜一级| 久久精品久久久精品美女| 亚洲精品乱码久久久久久久久 | 日韩理论片在线| 亚洲一区二区精品在线| 国产真实乱偷精品视频免| 久久蜜臀中文字幕| 性欧美videos另类喷潮| 国产高清精品久久久久| 亚洲婷婷综合色高清在线| 91成人免费电影| 女同性一区二区三区人了人一| 亚洲成人激情综合网| 日韩一区二区免费在线电影| 亚洲激情在线| 国产精选一区二区三区| 亚洲美女屁股眼交3| 欧美性感一区二区三区| 欧美三级特黄| 久久超级碰视频| 亚洲欧洲色图综合| 欧美日韩精品一区视频| 伊伊综合在线| 国产v日产∨综合v精品视频| 亚洲一区二区三区四区五区中文| 日韩欧美的一区| 久久综合久久久| 国产在线成人| 国产乱色国产精品免费视频| 亚洲人妖av一区二区| 日韩视频永久免费| 久久久久久久欧美精品| 午夜日韩av| 韩国一区二区在线观看| 一区二区在线免费观看| 精品国产区一区| 在线亚洲免费视频| 91久久视频| 成人国产亚洲欧美成人综合网| 香蕉影视欧美成人| 国产精品人人做人人爽人人添 | 中文字幕一区二区三区在线观看| 欧美嫩在线观看| 另类图片国产| 好看的亚洲午夜视频在线| 国产成人午夜片在线观看高清观看| 亚洲午夜精品一区二区三区他趣| 国产日产欧美一区二区三区| 欧美午夜宅男影院| 国产亚洲精品久久飘花| 91女人视频在线观看| 国产乱子轮精品视频| 午夜精品福利视频网站 | 日韩电影在线观看网站| 亚洲精品中文字幕乱码三区| 国产调教视频一区| 日韩视频免费观看高清完整版| 久久在线视频| 国产欧美日本| 欧美激情自拍| 成人免费高清在线观看| 久久国内精品自在自线400部| 亚洲一区在线观看视频| 中文字幕免费不卡| 久久综合九色综合欧美亚洲| 欧美日高清视频| 色欧美片视频在线观看在线视频| 亚洲乱亚洲高清| 欧美成人一品| 99精品黄色片免费大全| 国产精品一区二区久久精品爱涩| 免费在线看成人av| 丝袜亚洲另类欧美| 亚洲一区二区三区中文字幕在线| 自拍偷自拍亚洲精品播放| 久久久精品黄色| 2020国产精品自拍| 欧美成人一区二区三区片免费 | 欧美日韩三级在线| 色哟哟亚洲精品| 国产伦理一区| 国产日韩综合| 99热免费精品在线观看| 亚洲天堂黄色| 国内精品**久久毛片app| 欧美成人综合一区| 91麻豆6部合集magnet| 97se狠狠狠综合亚洲狠狠| 国产aⅴ综合色| 丁香婷婷综合色啪| 从欧美一区二区三区| 成人一区二区三区视频在线观看| 国产伦理精品不卡| 国产精品白丝jk白祙喷水网站| 国产又黄又大久久| 国产一区二区毛片| 国产精品一区2区| 国产成人av网站| 成人美女视频在线观看18| 成人精品高清在线| a4yy欧美一区二区三区| 99久久国产综合精品麻豆| 91蝌蚪porny| 欧美二区在线| 国产精品初高中精品久久| 伊伊综合在线| 国产日韩欧美三级| 午夜在线a亚洲v天堂网2018| 免费在线亚洲| 欧美自拍偷拍午夜视频| 欧美精品久久99久久在免费线| 91精品国产91综合久久蜜臀| 欧美成人欧美edvon| 久久日韩精品一区二区五区| 国产欧美精品一区二区色综合| 国产精品高清亚洲| 亚洲一区二区三区三| 天天综合网天天综合色| 日本欧美在线看| 国产在线精品不卡| 播五月开心婷婷综合| 欧美日韩一区在线播放| 99www免费人成精品| 久久免费99精品久久久久久|