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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

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

來源: 責(zé)編: 時(shí)間:2023-08-05 11:45:59 5027觀看
導(dǎo)讀一、背景1. 講故事上個(gè)月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當(dāng)時(shí)用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反饋兩個(gè)問題:GDIView 統(tǒng)計(jì)不準(zhǔn)怎么辦?我只有 D

一、背景

1. 講故事

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

  • GDIView 統(tǒng)計(jì)不準(zhǔn)怎么辦?
  • 我只有 Dump 可以統(tǒng)計(jì)嗎?

其實(shí)那篇文章也聊過,在 x64 或者 wow64 的程序里,在用戶態(tài)內(nèi)存段中有一個(gè) GDI Shared Handle Table 句柄表,這個(gè)表中就統(tǒng)計(jì)了各自句柄類型的數(shù)量,如果能統(tǒng)計(jì)出來也就回答了上面的問題,對(duì)吧。ZMX28資訊網(wǎng)——每日最新資訊28at.com

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

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

有了這些前置基礎(chǔ),接下來就可以開挖了。ZMX28資訊網(wǎng)——每日最新資訊28at.com

二、挖 GdiSharedHandleTable

1. 測(cè)試代碼

為了方便測(cè)試,我來造一個(gè) DC句柄 的泄露。ZMX28資訊網(wǎng)——每日最新資訊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++ 實(shí)現(xiàn)代碼。ZMX28資訊網(wǎng)——每日最新資訊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的程序那沒有關(guān)系,但如果你是 32bit 的程序一定要生成一個(gè) Wow64 格式的 Dump,千萬不要抓它的 32bit dump,否則拿不到 GdiSharedHandleTable 字段也就無法后續(xù)分析了,那如何生成 Wow64 格式的呢?我推薦兩種方式。ZMX28資訊網(wǎng)——每日最新資訊28at.com

  • 使用64bit任務(wù)管理器(系統(tǒng)默認(rèn))生成
  • 使用 procdump -64 -ma QQ.exe 中的 -64 參數(shù)

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

圖片圖片ZMX28資訊網(wǎng)——每日最新資訊28at.com

2. 分析 GdiSharedHandleTable

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

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

接下來使用 !address 找到這個(gè) GdiSharedHandleTable 的首末地址。ZMX28資訊網(wǎng)——每日最新資訊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

上一篇我們聊過每新增一個(gè)GDI句柄都會(huì)在這個(gè)表中增加一條 GDICell,輸出如下:ZMX28資訊網(wǎng)——每日最新資訊28at.com

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

這個(gè) GDICell 有兩個(gè)信息比較重要。ZMX28資訊網(wǎng)——每日最新資訊28at.com

  • wProcessId 表示進(jìn)程 ID
  • wType 表示句柄類型。

理想情況下是對(duì) 句柄類型 進(jìn)行分組統(tǒng)計(jì)就能知道是哪里的泄露,接下來的問題是如何找呢?可以仔細(xì)觀察結(jié)構(gòu)體, wProcessId 和 wType 的偏移是 3USHORT=6byte,我們?cè)趦?nèi)存中找相對(duì)偏移不就可以了嗎?接下來在內(nèi)存中搜索這塊ZMX28資訊網(wǎng)——每日最新資訊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  ................

圖片圖片ZMX28資訊網(wǎng)——每日最新資訊28at.com

從卦中可以看到,當(dāng)前有1029個(gè) GDICell 結(jié)構(gòu)體,接下來怎么鑒別每一條記錄上都是什么類型呢?其實(shí)這里是有枚舉的。ZMX28資訊網(wǎng)——每日最新資訊28at.com

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

即 GDIView 中的 紅色一列 。ZMX28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片ZMX28資訊網(wǎng)——每日最新資訊28at.com

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

圖片圖片ZMX28資訊網(wǎng)——每日最新資訊28at.com

3. 腳本處理

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

最后我們用腳本跑一下,哈哈,是不是非常清楚。ZMX28資訊網(wǎng)——每日最新資訊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

三、總結(jié)

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

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

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

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

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

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 国产精品嫩草99av在线_一区在线视频观看_欧美高清一区_欧美 日韩 国产 一区_99精品欧美一区二区三区_久久大香伊蕉在人线观看热2_一色屋精品视频在线观看网站_在线亚洲国产精品网站_亚洲区一区二区三区_你懂的视频一区二区
不卡的av电影在线观看| 亚洲手机成人高清视频| 91麻豆国产自产在线观看| 一本色道久久综合亚洲精品按摩| 欧美韩日一区二区三区四区| 91在线国产福利| 国产午夜精品久久久久久免费视| 成人三级伦理片| 久久久精品tv| 欧美区国产区| 亚洲精品老司机| 性欧美videos另类喷潮| 日韩成人一级大片| 欧日韩精品视频| 国产精品白丝jk黑袜喷水| 制服丝袜国产精品| 91在线免费播放| 欧美高清在线精品一区| 国产一区导航| 激情国产一区二区| 欧美成人精品福利| 欧美视频四区| 日本伊人午夜精品| 久久精品人人做人人综合 | 色综合久久久久久久久| 国产一区二区三区久久悠悠色av| 精品国产自在久精品国产| 在线欧美三区| 激情亚洲综合在线| 亚洲欧美一区二区三区久本道91 | 国产精品久久久久久久第一福利| 亚洲一区黄色| 92精品国产成人观看免费 | 久久久精品日韩| 欧美色图麻豆| 国产精品一二二区| 亚洲图片另类小说| 欧美成人三级在线| 久热综合在线亚洲精品| 欧美日韩免费高清| 国产乱码精品一区二区三区五月婷| 免费高清不卡av| 亚洲人亚洲人成电影网站色| 欧美成人精品3d动漫h| 欧洲中文字幕精品| 国产精品一区毛片| 亚洲欧美综合国产精品一区| 蜜桃传媒麻豆第一区在线观看| 国产精品乱人伦中文| 精品播放一区二区| 日韩精品一区二区三区在线播放| 久久婷婷一区| 蜜桃av久久久亚洲精品| 亚洲精品社区| 一区二区三区我不卡| 一区免费在线| 亚洲精品视频啊美女在线直播| 欧美成人午夜| 国自产拍偷拍福利精品免费一| 欧美+日本+国产+在线a∨观看| 丁香一区二区三区| 337p亚洲精品色噜噜狠狠| 欧美日韩大陆在线| 欧美日韩国产乱码电影| 欧美一区二区三区四区在线观看 | 亚洲亚洲人成综合网络| 亚洲成人黄色影院| 免费一级欧美片在线观看| 国产一区二区按摩在线观看| 国产成人丝袜美腿| 91免费看片在线观看| 精品1区2区| 在线免费观看成人短视频| 91精品国产综合久久香蕉的特点 | 亚洲 欧美综合在线网络| 精品一区二区在线看| 国产一区91精品张津瑜| 99re热这里只有精品视频| 国产一区在线免费观看| 国产一区二区你懂的| 欧美午夜电影在线播放| 26uuu欧美| 亚洲伊人色欲综合网| 国产在线播放一区| 亚洲免费不卡| 91精品国产品国语在线不卡 | 在线播放91灌醉迷j高跟美女| 91精品国产品国语在线不卡| 中文欧美字幕免费| 美日韩一区二区三区| 欧美aa国产视频| 欧美久久一二三四区| 中文字幕一区二区三区蜜月| 国产在线一区二区| 中文精品一区二区三区| 欧美一区二区三区免费观看视频| 亚洲美女屁股眼交| 福利91精品一区二区三区| 老司机久久99久久精品播放免费| 久久av一区| 国产视频一区在线观看一区免费| 欧美r级电影在线观看| www.亚洲激情.com| 美日韩精品免费| 国产精品丝袜一区| 97成人超碰视| 精品久久人人做人人爰| 秋霞av亚洲一区二区三| 欧美日韩在线高清| 欧美一级欧美一级在线播放| 成人黄色综合网站| 欧美剧情电影在线观看完整版免费励志电影 | 欧美一区二区三区成人| 久久成人免费日本黄色| 91精彩视频在线观看| 一二三四社区欧美黄| 亚洲影视在线| 久久国产剧场电影| 欧美成人猛片aaaaaaa| 国产色产综合产在线视频| 91麻豆swag| 日日摸夜夜添夜夜添亚洲女人| 欧美老肥妇做.爰bbww| 福利一区福利二区| 中文字幕av资源一区| 国产精品乱子乱xxxx| 毛片av中文字幕一区二区| 久久精品水蜜桃av综合天堂| 色综合视频一区二区三区高清| 国产欧美日韩另类一区| 中日韩视频在线观看| 精久久久久久久久久久| 欧美日韩aaa| 成人免费高清在线观看| 亚洲三级久久久| 精品视频免费看| 亚洲激情亚洲| 国产一区视频导航| 中文字幕亚洲一区二区av在线 | 日韩一级成人av| 亚洲国产专区校园欧美| 国产呦精品一区二区三区网站| 中文字幕一区不卡| 在线免费观看视频一区| 黑丝一区二区三区| 国产成人高清在线| 亚洲欧洲av在线| 欧美日韩在线一区二区| 欧美阿v一级看视频| 亚洲成av人片一区二区梦乃| 欧美一区日本一区韩国一区| 亚洲黄色av| 91网站最新地址| 久久精品国产99国产| 亚洲欧美日韩在线| 欧美变态口味重另类| 色综合久久久久久久久| 欧美激情一区| 欧美日韩国产在线播放网站| 亚洲天堂激情| 99久久99精品久久久久久| 日本成人在线看| 亚洲精品视频在线看| 欧美国产禁国产网站cc| 日韩一级大片在线| 9191成人精品久久| 色激情天天射综合网| 亚洲在线观看| 日韩视频免费| 亚洲高清毛片| 激情综合网址| 狠狠色狠狠色综合人人| eeuss鲁一区二区三区| 成人激情电影免费在线观看| 久久99精品网久久| 日韩经典一区二区| 日本欧美久久久久免费播放网| 亚洲一区二区三区四区五区黄| 一区在线中文字幕| 亚洲色图制服丝袜| 亚洲无人区一区| 大尺度一区二区| 国产精品系列在线观看| 盗摄精品av一区二区三区| 国内精品久久久久影院色| 精品亚洲国产成人av制服丝袜| 久久精品国产亚洲高清剧情介绍| 日本视频一区二区三区| 国产黄色成人av| 不卡视频一二三四| 国产亚洲人成网站| 欧亚洲嫩模精品一区三区| 91精品国产品国语在线不卡| 在线综合+亚洲+欧美中文字幕| 欧美一级在线免费| 国产精品久久久久影院老司| 亚洲欧美一区二区三区极速播放| 亚洲第一二三四区| 久久电影网站中文字幕| a亚洲天堂av|