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

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

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

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

一、背景

1. 講故事

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

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

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

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

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

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

二、挖 GdiSharedHandleTable

1. 測試代碼

為了方便測試,我來造一個 DC句柄 的泄露。5wb28資訊網——每日最新資訊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++ 實現代碼。5wb28資訊網——每日最新資訊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 格式的呢?我推薦兩種方式。5wb28資訊網——每日最新資訊28at.com

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

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

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

2. 分析 GdiSharedHandleTable

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

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

接下來使用 !address 找到這個 GdiSharedHandleTable 的首末地址。5wb28資訊網——每日最新資訊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,輸出如下:5wb28資訊網——每日最新資訊28at.com

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

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

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

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

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

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

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

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

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

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

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

3. 腳本處理

如果大家通讀會發現這些都是固定步驟,完全可以寫成比如 C++ 和 Javascript 的格式腳本,在 StackOverflow 上還真有這樣的腳本。5wb28資訊網——每日最新資訊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)

最后我們用腳本跑一下,哈哈,是不是非常清楚。5wb28資訊網——每日最新資訊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 句柄泄露類型,這是一篇很好的參考資料,相信能從另一個角度給你提供一些靈感。5wb28資訊網——每日最新資訊28at.com

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

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

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

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

標簽:
  • 熱門焦點
  • Mate60手機殼曝光 致敬自己的經典設計

    8月3日消息,今天下午博主數碼閑聊站帶來了華為Mate60的第三方手機殼圖,可以讓我們在真機發布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • 俄羅斯:將審查iPhone等外國公司設備 保數據安全

    iPhone和特斯拉都屬于在各自領域領頭羊的品牌,推出的產品也也都是數一數二的,但對于一些國家而言,它們的產品可靠性和安全性還是在限制范圍內。近日,俄羅斯聯邦通信、信息技術
  • Redmi Pad評測:紅米充滿野心的一次嘗試

    從Note系列到K系列,從藍牙耳機到筆記本電腦,紅米不知不覺之間也已經形成了自己頗有競爭力的產品體系,在中端和次旗艦市場上甚至要比小米新機的表現來得更好,正所謂“大丈夫生居
  • 天貓精靈Sound Pro體驗:智能音箱沒有音質?來聽聽我的

    這幾年除了手機作為智能生活終端最主要的核心之外,第二個可以成為中心點的產品是什么?——是智能音箱。 手機在執行命令的時候有兩種操作方式,手和智能語音助手,而智能音箱只
  • 一年經驗在二線城市面試后端的經驗分享

    忠告這篇文章只適合2年內工作經驗、甚至沒有工作經驗的朋友閱讀。如果你是2年以上工作經驗,請果斷劃走,對你沒啥幫助~主人公這篇文章內容來自 「升職加薪」星球星友 的投稿,坐
  • 三分鐘白話RocketMQ系列—— 如何發送消息

    我們知道RocketMQ主要分為消息 生產、存儲(消息堆積)、消費 三大塊領域。那接下來,我們白話一下,RocketMQ是如何發送消息的,揭秘消息生產全過程。注意,如果白話中不小心提到相關代
  • 中國家電海外掘金正當時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態LT(ID:LingTai_LT)2023年,出海市場戰況空前,中國創業者在海外紛紛摩拳擦掌,以期能夠把中國的商業模式、創業理念、戰略打法輸出海外,他們依
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • 電博會上海爾智家模擬500平大平層,還原生活空間沉浸式體驗

    電博會為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗。程傳
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美日韩在线视频一区| 久久噜噜噜精品国产亚洲综合| 亚洲免费av观看| 99国产精品| 性欧美大战久久久久久久免费观看| 久久黄色小说| 欧美成人乱码一区二区三区| 欧美日韩免费| 国产日韩精品一区二区浪潮av| 一色屋精品视频在线看| 一本大道久久精品懂色aⅴ| 亚洲视频电影在线| 久久久xxx| 欧美日韩黄色大片| 国产亚洲精品一区二555| 亚洲日本成人| 欧美在线视频一区二区| 欧美精品少妇一区二区三区| 国产日韩精品视频一区| 亚洲精品三级| 久久爱www久久做| 欧美日韩蜜桃| 永久91嫩草亚洲精品人人| 在线综合亚洲欧美在线视频| 久久久噜噜噜久久狠狠50岁| 欧美性猛交视频| 精品成人国产| 亚洲欧美日韩综合国产aⅴ| 欧美福利视频在线观看| 国产亚洲精品美女| 中文在线一区| 欧美成人在线影院| 国产一区久久| 亚洲在线中文字幕| 欧美精品首页| 亚洲大胆女人| 久久成人18免费网站| 欧美日韩视频在线| 亚洲国产精品久久精品怡红院| 香蕉亚洲视频| 欧美日韩在线第一页| 在线观看一区视频| 久久99在线观看| 国产精品久久久久久妇女6080| 亚洲三级免费电影| 麻豆精品精品国产自在97香蕉| 国产视频在线观看一区二区三区| 中文欧美日韩| 欧美人与性动交α欧美精品济南到| 国产一区二三区| 午夜亚洲激情| 国产精品久久久久久久午夜片| 亚洲精选成人| 免费在线成人av| 黄色一区二区在线| 欧美综合国产| 国产欧美日本一区视频| 亚洲一二三区精品| 欧美日韩视频一区二区三区| 最新国产乱人伦偷精品免费网站| 久久久一区二区三区| 国产中文一区二区| 久久黄色级2电影| 国产欧美在线观看一区| 亚洲欧美日韩国产成人精品影院| 欧美视频在线观看一区| 日韩午夜在线| 欧美精品一区二区三区蜜桃 | 欧美主播一区二区三区| 国产精品女人毛片| 亚洲综合色在线| 国产精品久久久久久久免费软件 | 久久频这里精品99香蕉| 国产一区二区av| 欧美一区二区精品久久911| 国产精品自拍网站| 午夜免费在线观看精品视频| 国产精品视频男人的天堂| 亚洲欧美日韩精品久久| 国产精品网曝门| 性色av香蕉一区二区| 国产精品永久免费| 欧美影院午夜播放| 国内精品久久久久影院色| 久久www免费人成看片高清 | 亚洲在线国产日韩欧美| 国产精品一区二区三区四区| 午夜精品视频一区| 国产一区二区三区四区三区四| 久久激情综合| 一区福利视频| 欧美大片免费看| 99国产一区| 国产精品久久久久影院亚瑟| 午夜国产精品视频| 国模吧视频一区| 美女露胸一区二区三区| 亚洲精品欧美日韩| 国产精品www994| 欧美一区二区三区免费观看| 激情一区二区三区| 欧美福利在线| 亚洲图片欧洲图片av| 国产日本欧美一区二区| 久久中文精品| 99国内精品久久| 国产精品永久入口久久久| 久久久免费精品视频| 亚洲精品免费在线| 国产精品区免费视频| 久久久久国色av免费看影院| 亚洲激情专区| 国产精品国产自产拍高清av| 久久狠狠久久综合桃花| 亚洲人午夜精品| 国产精品久久久久久久久果冻传媒 | 伊人激情综合| 欧美—级a级欧美特级ar全黄| 一区二区三区国产在线| 国产深夜精品福利| 欧美成人精品1314www| 9l国产精品久久久久麻豆| 国产精品一国产精品k频道56| 久久人人爽爽爽人久久久| 99日韩精品| 国产一区二区按摩在线观看| 欧美大胆人体视频| 午夜精品免费在线| 亚洲经典在线| 国产精品综合久久久| 免费欧美日韩国产三级电影| 亚洲午夜精品17c| 激情视频一区二区| 欧美视频不卡中文| 久久人人爽爽爽人久久久| 一区二区欧美视频| 激情综合网激情| 国产精品videosex极品| 久久这里只有| 亚洲欧美综合网| 亚洲欧洲免费视频| 国产乱码精品| 欧美精品在线免费观看| 久久黄色网页| 亚洲调教视频在线观看| 亚洲东热激情| 国产女人aaa级久久久级| 欧美激情国产精品| 久久成人在线| 亚洲天堂网在线观看| 亚洲二区在线| 国产欧美日韩综合| 欧美揉bbbbb揉bbbbb| 久久综合网络一区二区| 午夜欧美电影在线观看| 日韩视频在线一区| 一色屋精品视频在线观看网站| 国产精品久久久久久久久免费| 欧美成人黑人xx视频免费观看| 欧美一区二区在线免费观看| 99视频有精品| 亚洲国产美国国产综合一区二区| 国产日韩欧美在线看| 欧美午夜理伦三级在线观看| 欧美肥婆在线| 久久久久九九视频| 欧美一区二区三区婷婷月色| 在线亚洲精品| 亚洲欧洲日本mm| 一区二区亚洲精品| 国产亚洲激情| 国产精品亚洲精品| 国产精品v欧美精品∨日韩| 欧美激情精品久久久久久免费印度| 久久久久久网址| 欧美一区二区三区视频在线| 亚洲一二三区视频在线观看| 亚洲精品国精品久久99热| 在线欧美福利| 黄色欧美成人| 黑人一区二区三区四区五区| 国产欧美日韩伦理| 国产精品视频免费一区| 欧美日韩一级黄| 欧美日韩国产成人在线| 欧美高清视频在线| 欧美成人a视频| 麻豆久久婷婷| 久久亚洲欧美| 久久久蜜桃一区二区人| 久久久成人网| 久久国内精品自在自线400部| 亚洲欧美制服中文字幕| 亚洲欧美清纯在线制服| 亚洲一二三区在线| 亚洲一区精品电影| 亚洲一区欧美激情| 亚洲综合社区| 先锋a资源在线看亚洲| 午夜日韩激情| 欧美在线视频免费观看| 久久精品女人天堂| 久久亚洲综合| 免费观看久久久4p|