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

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

記一次 .NET某防偽驗(yàn)證系統(tǒng)崩潰分析

來源: 責(zé)編: 時間:2024-03-28 17:49:15 246觀看
導(dǎo)讀一、背景1. 講故事昨晚給訓(xùn)練營里面的一位朋友分析了一個程序崩潰的故障,因?yàn)榭葱』镒幼蛱煸谌豪飭柫艘惶煲矝]搞定,干脆自己親自上陣吧,抓取的dump也是我極力推薦的用 procdump 注冊 AEDebug 的方式,省去了很多溝通成本。

一、背景

1. 講故事

昨晚給訓(xùn)練營里面的一位朋友分析了一個程序崩潰的故障,因?yàn)榭葱』镒幼蛱煸谌豪飭柫艘惶煲矝]搞定,干脆自己親自上陣吧,抓取的dump也是我極力推薦的用 procdump 注冊 AEDebug 的方式,省去了很多溝通成本。5Ug28資訊網(wǎng)——每日最新資訊28at.com

二、WinDbg分析

1. 為什么會崩潰

windbg有一個非常強(qiáng)大的點(diǎn)就是當(dāng)你雙擊打開后,會自動幫你切換到崩潰的線程以及崩潰處的匯編代碼,省去了 !analyze -v 命令的龜速輸出,參考信息如下:5Ug28資訊網(wǎng)——每日最新資訊28at.com

...................................................................................................................This dump file has an exception of interest stored in it.The stored exception information can be accessed via .ecxr.(10f4.f58): Access violation - code c0000005 (first/second chance not available)For analysis of this file, run !analyze -veax=00000000 ebx=00000000 ecx=00000040 edx=00000000 esi=004c1b98 edi=07a8ed4ceip=7008508f esp=07a8ec74 ebp=07a8ec80 iopl=0         nv up ei pl zr na pe nccs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246clr!Thread::GetSafelyRedirectableThreadContext+0x7c:7008508f 8038eb          cmp     byte ptr [eax],0EBh        ds:002b:00000000=??...

從卦中可以看到,當(dāng)前崩潰是因?yàn)?eax=0 導(dǎo)致的,那為什么 eax 等于 0 呢?要想尋找這個答案,需要觀察崩潰前的線程棧上下文,可以使用命令 .ecxr;k 9 即可。5Ug28資訊網(wǎng)——每日最新資訊28at.com

0:009> .ecxr;k 9eax=00000000 ebx=00000000 ecx=00000040 edx=00000000 esi=004c1b98 edi=07a8ed4ceip=7008508f esp=07a8ec74 ebp=07a8ec80 iopl=0         nv up ei pl zr na pe nccs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246clr!Thread::GetSafelyRedirectableThreadContext+0x7c:7008508f 8038eb          cmp     byte ptr [eax],0EBh        ds:002b:00000000=?? # ChildEBP RetAddr      00 07a8ec80 6fe7f6cd     clr!Thread::GetSafelyRedirectableThreadContext+0x7c01 07a8f030 6fe7f2f3     clr!Thread::HandledJITCase+0x3102 07a8f0a4 6fee23da     clr!Thread::SuspendRuntime+0x26003 07a8f184 6fedf72d     clr!WKS::GCHeap::SuspendEE+0x1fe04 07a8f1b0 6fe309ca     clr!WKS::GCHeap::GarbageCollectGeneration+0x16805 07a8f1c0 6fe30a2e     clr!WKS::GCHeap::GarbageCollectTry+0x5606 07a8f1e4 6fe30a90     clr!WKS::GCHeap::GarbageCollect+0xa507 07a8f230 6f058b01     clr!GCInterface::Collect+0x5d08 07a8f26c 055fa4b1     mscorlib_ni+0x3b8b01

從卦中信息看,尼瑪,真無語了 GCInterface::Collect 說明有人用 GC.Collect() 手工觸發(fā)GC,不知道為什么要這么做來污染GC內(nèi)部的統(tǒng)計信息,不管怎么說這個肯定不是崩潰的原因。5Ug28資訊網(wǎng)——每日最新資訊28at.com

2. GC正在干什么

我們繼續(xù)觀察線程棧,可以看到它的邏輯大概是這樣的,通過 SuspendRuntime 把所有的托管線程進(jìn)行邏輯上暫停,在暫停其中的一個線程時拋出了異常。5Ug28資訊網(wǎng)——每日最新資訊28at.com

稍微提醒一下,這個 HandledJITCase 方法是用 ip 劫持技術(shù)將代碼引入到 coreclr 中進(jìn)行 GC完成等待,這種神操作有些殺毒軟件會認(rèn)為是病毒!!!5Ug28資訊網(wǎng)——每日最新資訊28at.com

有些朋友肯定會說,有沒有代碼支撐。。。這里我就找一下 coreclr 的源碼貼一下吧。5Ug28資訊網(wǎng)——每日最新資訊28at.com

void ThreadSuspend::SuspendRuntime(ThreadSuspend::SUSPEND_REASON reason){ while ((thread = ThreadStore::GetThreadList(thread)) != NULL) {  ...  if (workingOnThreadContext.Acquired() && thread->HandledJITCase())  {   ...  }  ... }}

結(jié)合源碼分析思路就非常清晰了,這里的 thread->HandledJITCase() 中的 thread 到底是哪一個線程?可以觀察 kb 輸出然后用 !t 去做比對。5Ug28資訊網(wǎng)——每日最新資訊28at.com

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

從卦中看,當(dāng)前 GC 正在 Suspend 主線程,并且還看到了主線程有一個 System.AccessViolationException 異常,無語了。。。5Ug28資訊網(wǎng)——每日最新資訊28at.com

3. 主線程到底怎么了

主線程進(jìn)入到視野之后,那就重點(diǎn)關(guān)注一下它,可以用 k 看一下輸出。5Ug28資訊網(wǎng)——每日最新資訊28at.com

0:009> ~0seax=00000000 ebx=0029ea50 ecx=0029ea90 edx=00000000 esi=7efdb800 edi=000d0000eip=00000000 esp=0029ea4c ebp=75146381 iopl=0         nv up ei pl nz na po nccs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=0021020200000000 ??              ???0:000> k00 75146381 7efdb800     0x001 75146381 7517fa04     0x7efdb80002 0029ea80 7736013a     user32!__fnHkINLPKBDLLHOOKSTRUCT+0x2803 0029eae4 7514908d     ntdll!KiUserCallbackDispatcher+0x2e04 0029eae4 076e3912     user32!CallNextHookEx+0x8405 0029eb28 076e3064     0x76e391206 0029eb5c 0011d48f     xxx!xxx.ScanerHook.KeyboardHookProc+0xe407 0029eb8c 75146381     0x11d48f08 0029eba8 7517fa04     user32!DispatchHookW+0x3809 0029ebd8 7736013a     user32!__fnHkINLPKBDLLHOOKSTRUCT+0x280a 0029ec3c 751406eb     ntdll!KiUserCallbackDispatcher+0x2e0b 0029ec3c 75140751     user32!_PeekMessage+0x880c 0029ec68 6d8af3bf     user32!PeekMessageW+0x108...

從卦象看,這卦非常奇怪,有如下兩點(diǎn)信息:5Ug28資訊網(wǎng)——每日最新資訊28at.com

  • eip=00000000,這個很無語,線程已經(jīng)瘋了
  • KeyboardHookProc ,居然有鍵盤鉤子

熟悉 eip 的朋友應(yīng)該知道,它相當(dāng)于一輛車的方向盤,一輛高速行駛的車突然沒了方向盤,真的太可怕了,最后必然車毀人亡。5Ug28資訊網(wǎng)——每日最新資訊28at.com

4. 是 eip=0 導(dǎo)致的崩潰嗎

在匯編中是因?yàn)閑ax=0導(dǎo)致,而這里eip恰好也等于0,仿佛冥冥之中自有牽連,帶著強(qiáng)烈的好奇心我們來反匯編下 GetSafelyRedirectableThreadContext 方法邏輯,簡化后如下:5Ug28資訊網(wǎng)——每日最新資訊28at.com

0:000> uf 7008508fclr!Thread::GetSafelyRedirectableThreadContext:6fe7f60e 55              push    ebp6fe7f60f 8bec            mov     ebp,esp6fe7f611 53              push    ebx6fe7f612 56              push    esi6fe7f613 57              push    edi6fe7f614 8bf1            mov     esi,ecx...7008506d ffe9            jmp     rcx7008506f fd              std70085070 c1daff          rcr     edx,0FFh70085073 f6450801        test    byte ptr [ebp+8],170085077 0f84efa5dfff    je      clr!Thread::GetSafelyRedirectableThreadContext+0xcc (6fe7f66c)7008507d 8b8604010000    mov     eax,dword ptr [esi+104h]70085083 3987b8000000    cmp     dword ptr [edi+0B8h],eax70085089 0f85dda5dfff    jne     clr!Thread::GetSafelyRedirectableThreadContext+0xcc (6fe7f66c)7008508f 8038eb          cmp     byte ptr [eax],0EBh

從上面的匯編代碼看eax的取值鏈條是: eax <- esi+104h <- ecx ,很顯然這里的 ecx 是 thiscall 協(xié)議中的 Thread=004c1b98 參數(shù),可以用 dp 驗(yàn)證下。5Ug28資訊網(wǎng)——每日最新資訊28at.com

0:000> dp 004c1b98+0x104 L1004c1c9c  00000000

從卦中看果然是 0,有些朋友好奇這個 104 偏移到底是個什么東西,參考 coreclr 源碼其實(shí)就是 m_LastRedirectIP 字段,參考如下:5Ug28資訊網(wǎng)——每日最新資訊28at.com

BOOL Thread::GetSafelyRedirectableThreadContext(DWORD dwOptions, CONTEXT* pCtx, REGDISPLAY* pRD){    if (!EEGetThreadContext(this, pCtx))    {        return FALSE;    }    ...  if (GetIP(pCtx) == m_LastRedirectIP) {  const BYTE short_jmp = 0xeb;  const BYTE self = 0xfe;  BYTE* ip = (BYTE*)m_LastRedirectIP;  if (ip[0] == short_jmp && ip[1] == self)   m_LastRedirectIP = 0;  return FALSE; }}

結(jié)合匯編代碼其實(shí)我們崩潰在 ip[0] == short_jmp 這一句上,仔細(xì)分析上面的C++代碼會發(fā)現(xiàn)一個很奇怪的信息,那就是為什么 GetIP(pCtx)= 0,接下來用 dt 觀察下寄存器上下文。5Ug28資訊網(wǎng)——每日最新資訊28at.com

0:009> kb 2 # ChildEBP RetAddr      Args to Child              00 07a8ec80 6fe7f6cd     00000003 07a8ed4c 07a8ecf0 clr!Thread::GetSafelyRedirectableThreadContext+0x7c01 07a8f030 6fe7f2f3     004c1b98 0b367326 76a016a1 clr!Thread::HandledJITCase+0x310:009> dt _CONTEXT 07a8ed4cntdll!_CONTEXT   +0x000 ContextFlags     : 0x10007   ...   +0x01c FloatSave        : _FLOATING_SAVE_AREA   +0x08c SegGs            : 0x2b   +0x090 SegFs            : 0x53   +0x094 SegEs            : 0x2b   +0x098 SegDs            : 0x2b   +0x09c Edi              : 0xd0000   +0x0a0 Esi              : 0x7efdb800   +0x0a4 Ebx              : 0x29ea50   +0x0a8 Edx              : 0   +0x0ac Ecx              : 0x29ea90   +0x0b0 Eax              : 0   +0x0b4 Ebp              : 0x75146381   +0x0b8 Eip              : 0   +0x0bc SegCs            : 0x23   +0x0c0 EFlags           : 0x210202   +0x0c4 Esp              : 0x29ea4c   ...

從卦中看果然 eip=0,這是一個非常錯誤的信息,還有一點(diǎn)就是 m_LastRedirectIP 字段一般用來處理一些比較詭異的兼容性問題,所以這里兩個字段都是 0 導(dǎo)致崩潰的產(chǎn)生。5Ug28資訊網(wǎng)——每日最新資訊28at.com

有了上面的信息,我們就知道了前因后果,原來是主線程車毀人亡(eip=0),導(dǎo)致GC無法暫停它,在內(nèi)部拋出了代碼異常,你可以說是 CLR 的bug,也可以說是主線程的Bug,所以給到的解決方案就是:5Ug28資訊網(wǎng)——每日最新資訊28at.com

  1. 屏蔽掉 鍵盤鉤子 的業(yè)務(wù)邏輯,肯定是它造成的。
  2. 不去掉的話,要重點(diǎn)觀察 鍵盤盤子 ,是否是代碼改動引發(fā)的。

三、總結(jié)

說實(shí)話要想解釋這個程序?yàn)槭裁磿罎ⅲ枰治稣邔C的SuspendRuntime運(yùn)作邏輯有一定的了解,否則真抓瞎了,所以.NET調(diào)試訓(xùn)練營中的GC理論知識一定是分析這些 dump 的基石。5Ug28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-80192-0.html記一次 .NET某防偽驗(yàn)證系統(tǒng)崩潰分析

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

上一篇: 負(fù)載均衡原理最全詳解

下一篇: vivo 消息中間件測試環(huán)境項(xiàng)目多版本實(shí)踐

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品啊v在线| 日韩一级片网址| 麻豆91精品91久久久的内涵| 99精品视频网| 亚洲国产成人av在线| 国产午夜亚洲精品不卡| 欧美日韩一区二区视频在线| 欧美激情女人20p| 美日韩精品视频| 久久精品最新地址| 午夜久久电影网| 亚洲免费一在线| 一区二区三区国产| 亚洲精品九九| 亚洲韩国一区二区三区| 尤物yw午夜国产精品视频| 国产日韩免费| 国产精品欧美风情| 国产精品国产成人国产三级| 欧美日韩国产精品一区二区亚洲| 欧美va亚洲va香蕉在线| 可以免费看不卡的av网站| 欧美综合第一页| 欧美亚洲综合网| 欧美亚洲免费高清在线观看| 亚洲女同性videos| 在线综合亚洲欧美在线视频| 一区二区三区黄色| 在线视频日韩精品| 亚洲视频一二三| 亚洲免费影视| 午夜日韩在线| 校园春色综合网| 欧美一区二区三区日韩视频| 欧美一区深夜视频| 久久激情五月激情| 久久久精品五月天| 久久中文精品| 蜜臀久久99精品久久久画质超高清| 久久午夜精品| 免费观看成人| 欧美韩日精品| 欧美视频免费| 国产精品一区二区久久精品| 国产午夜亚洲精品羞羞网站| 国内一区二区三区| 欲色影视综合吧| 亚洲国产日韩欧美在线99| 亚洲精品一二区| 91久久在线视频| 99伊人成综合| 午夜久久电影网| 久久久一本精品99久久精品66| 免费成人av资源网| 欧美日韩成人激情| 国产精品视频观看| 禁断一区二区三区在线| 亚洲激情电影在线| 亚洲视频观看| 久久9热精品视频| 免费日韩av| 欧美三级资源在线| 国产欧美日韩专区发布| 精品成人一区| 99综合电影在线视频| 亚洲欧美日本伦理| 久久久久综合网| 欧美精品一区二区三区一线天视频| 欧美深夜福利| 狠狠操狠狠色综合网| 亚洲精品一二| 午夜欧美不卡精品aaaaa| 久热国产精品| 欧美亚洲不卡| 激情文学一区| 99国产精品国产精品毛片| 午夜精品亚洲| 欧美成人精品高清在线播放| 欧美午夜电影在线观看| 国产综合亚洲精品一区二| 1769国产精品| 亚洲一本大道在线| 久久一二三区| 国产精品久久网| 1769国产精品| 亚洲男女自偷自拍| 你懂的一区二区| 国产免费亚洲高清| 亚洲精品激情| 久久激情网站| 欧美午夜精品久久久久久孕妇| 禁久久精品乱码| 亚洲视频1区| 六月天综合网| 国产欧美日韩| 99亚洲精品| 欧美一区二区三区在线免费观看 | 久久精品盗摄| 欧美日韩国产综合新一区| 国产综合精品一区| 在线视频免费在线观看一区二区| 久久久亚洲国产天美传媒修理工 | 国产日韩欧美综合一区| 亚洲免费精品| 久久美女性网| 国产精品久久中文| 亚洲精品免费看| 久久免费黄色| 国产精品一区三区| 99日韩精品| 模特精品在线| 国产日韩欧美三级| 亚洲午夜av电影| 欧美黄色小视频| 狠狠色综合网| 欧美一二三视频| 欧美婷婷久久| 亚洲免费成人| 欧美.日韩.国产.一区.二区| 国产一区成人| 午夜一级在线看亚洲| 欧美色欧美亚洲高清在线视频| 亚洲高清在线视频| 久久精品一级爱片| 国产欧美日韩另类一区| 亚洲一区二区网站| 欧美日韩一区二区高清| 亚洲激情不卡| 牛牛国产精品| 在线国产精品一区| 久久久久久久久久久久久9999| 国产欧美 在线欧美| 亚洲亚洲精品在线观看| 欧美日本国产视频| 亚洲精品1区2区| 毛片av中文字幕一区二区| 国产在线麻豆精品观看| 性色一区二区| 国产乱码精品一区二区三区不卡| 正在播放欧美视频| 欧美三级电影一区| 在线亚洲免费| 欧美四级电影网站| 亚洲一区成人| 国产精品黄色| 亚洲欧美www| 国产精品推荐精品| 亚洲欧美一区二区三区久久| 欧美性色综合| 亚洲免费人成在线视频观看| 国产精品亚洲激情| 性色av一区二区三区红粉影视| 国产精品视频yy9099| 亚洲欧美日本视频在线观看| 国产精品久久午夜| 欧美一区二区女人| 国产日韩在线不卡| 久久精品日韩一区二区三区| 国外成人在线视频| 久久午夜影视| 亚洲大片免费看| 欧美国产亚洲视频| 亚洲精品影院| 国产精品va在线播放| 亚洲无玛一区| 国产视频精品va久久久久久| 久久久久国内| 亚洲国产毛片完整版| 欧美极品在线播放| 亚洲一区二区三区成人在线视频精品 | 亚洲一区高清| 国产精品视频精品| 欧美一区二区私人影院日本 | 一色屋精品视频免费看| 免费观看日韩av| 日韩视频一区二区| 欧美午夜国产| 一卡二卡3卡四卡高清精品视频| 国产精品大片wwwwww| 翔田千里一区二区| 影音先锋久久资源网| 欧美精品一区二区精品网| 一本久久综合亚洲鲁鲁| 国产精品美女久久久久av超清| 性做久久久久久免费观看欧美| 国产在线观看91精品一区| 麻豆国产精品777777在线| 99re66热这里只有精品4| 国产精品亚洲网站| 久久影院午夜论| 99日韩精品| 国产视频丨精品|在线观看| 欧美成年人视频网站| 亚洲一区尤物| 影音先锋中文字幕一区| 欧美日韩国产影片| 欧美在线视频在线播放完整版免费观看| 在线看欧美日韩| 欧美日韩亚洲一区二| 久久久xxx| 夜夜嗨av一区二区三区网站四季av| 国产精自产拍久久久久久蜜| 美日韩精品免费| 午夜精品电影|