国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

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

這篇具有很好參考價(jià)值的文章主要介紹了記一次 .NET某防偽驗(yàn)證系統(tǒng) 崩潰分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一:背景

1. 講故事

昨晚給訓(xùn)練營(yíng)里面的一位朋友分析了一個(gè)程序崩潰的故障,因?yàn)榭葱』镒幼蛱煸谌豪飭?wèn)了一天也沒(méi)搞定,干脆自己親自上陣吧,抓取的dump也是我極力推薦的用 procdump 注冊(cè) AEDebug 的方式,省去了很多溝通成本。

二:WinDbg分析

1. 為什么會(huì)崩潰

windbg有一個(gè)非常強(qiáng)大的點(diǎn)就是當(dāng)你雙擊打開后,會(huì)自動(dòng)幫你切換到崩潰的線程以及崩潰處的匯編代碼,省去了 !analyze -v 命令的龜速輸出,參考信息如下:


................................................................
...................................................
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 -v
eax=00000000 ebx=00000000 ecx=00000040 edx=00000000 esi=004c1b98 edi=07a8ed4c
eip=7008508f esp=07a8ec74 ebp=07a8ec80 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
clr!Thread::GetSafelyRedirectableThreadContext+0x7c:
7008508f 8038eb          cmp     byte ptr [eax],0EBh        ds:002b:00000000=??
...

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


0:009> .ecxr;k 9
eax=00000000 ebx=00000000 ecx=00000040 edx=00000000 esi=004c1b98 edi=07a8ed4c
eip=7008508f esp=07a8ec74 ebp=07a8ec80 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00010246
clr!Thread::GetSafelyRedirectableThreadContext+0x7c:
7008508f 8038eb          cmp     byte ptr [eax],0EBh        ds:002b:00000000=??
 # ChildEBP RetAddr      
00 07a8ec80 6fe7f6cd     clr!Thread::GetSafelyRedirectableThreadContext+0x7c
01 07a8f030 6fe7f2f3     clr!Thread::HandledJITCase+0x31
02 07a8f0a4 6fee23da     clr!Thread::SuspendRuntime+0x260
03 07a8f184 6fedf72d     clr!WKS::GCHeap::SuspendEE+0x1fe
04 07a8f1b0 6fe309ca     clr!WKS::GCHeap::GarbageCollectGeneration+0x168
05 07a8f1c0 6fe30a2e     clr!WKS::GCHeap::GarbageCollectTry+0x56
06 07a8f1e4 6fe30a90     clr!WKS::GCHeap::GarbageCollect+0xa5
07 07a8f230 6f058b01     clr!GCInterface::Collect+0x5d
08 07a8f26c 055fa4b1     mscorlib_ni+0x3b8b01

從卦中信息看,尼瑪,真無(wú)語(yǔ)了 GCInterface::Collect 說(shuō)明有人用 GC.Collect() 手工觸發(fā)GC,不知道為什么要這么做來(lái)污染GC內(nèi)部的統(tǒng)計(jì)信息,不管怎么說(shuō)這個(gè)肯定不是崩潰的原因。

2. GC正在干什么

我們繼續(xù)觀察線程棧,可以看到它的邏輯大概是這樣的,通過(guò) SuspendRuntime 把所有的托管線程進(jìn)行邏輯上暫停,在暫停其中的一個(gè)線程時(shí)拋出了異常。

稍微提醒一下,這個(gè) HandledJITCase 方法是用 ip 劫持技術(shù)將代碼引入到 coreclr 中進(jìn)行 GC完成等待,這種神操作有些殺毒軟件會(huì)認(rèn)為是病毒?。?!

有些朋友肯定會(huì)說(shuō),有沒(méi)有代碼支撐。。。這里我就找一下 coreclr 的源碼貼一下吧。


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

結(jié)合源碼分析思路就非常清晰了,這里的 thread->HandledJITCase() 中的 thread 到底是哪一個(gè)線程? 可以觀察 kb 輸出然后用 !t 去做比對(duì)。

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

從卦中看,當(dāng)前 GC 正在 Suspend 主線程,并且還看到了主線程有一個(gè) System.AccessViolationException 異常,無(wú)語(yǔ)了。。。

3. 主線程到底怎么了

主線程進(jìn)入到視野之后,那就重點(diǎn)關(guān)注一下它,可以用 k 看一下輸出。


0:009> ~0s
eax=00000000 ebx=0029ea50 ecx=0029ea90 edx=00000000 esi=7efdb800 edi=000d0000
eip=00000000 esp=0029ea4c ebp=75146381 iopl=0         nv up ei pl nz na po nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00210202
00000000 ??              ???
0:000> k
00 75146381 7efdb800     0x0
01 75146381 7517fa04     0x7efdb800
02 0029ea80 7736013a     user32!__fnHkINLPKBDLLHOOKSTRUCT+0x28
03 0029eae4 7514908d     ntdll!KiUserCallbackDispatcher+0x2e
04 0029eae4 076e3912     user32!CallNextHookEx+0x84
05 0029eb28 076e3064     0x76e3912
06 0029eb5c 0011d48f     xxx!xxx.ScanerHook.KeyboardHookProc+0xe4
07 0029eb8c 75146381     0x11d48f
08 0029eba8 7517fa04     user32!DispatchHookW+0x38
09 0029ebd8 7736013a     user32!__fnHkINLPKBDLLHOOKSTRUCT+0x28
0a 0029ec3c 751406eb     ntdll!KiUserCallbackDispatcher+0x2e
0b 0029ec3c 75140751     user32!_PeekMessage+0x88
0c 0029ec68 6d8af3bf     user32!PeekMessageW+0x108
...

從卦象看,這卦非常奇怪,有如下兩點(diǎn)信息:

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

熟悉 eip 的朋友應(yīng)該知道,它相當(dāng)于一輛車的方向盤,一輛高速行駛的車突然沒(méi)了方向盤,真的太可怕了,最后必然車毀人亡。

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

在匯編中是因?yàn)?code>eax=0導(dǎo)致,而這里eip恰好也等于0,仿佛冥冥之中自有牽連,帶著強(qiáng)烈的好奇心我們來(lái)反匯編下 GetSafelyRedirectableThreadContext 方法邏輯,簡(jiǎn)化后如下:


0:000> uf 7008508f
clr!Thread::GetSafelyRedirectableThreadContext:
6fe7f60e 55              push    ebp
6fe7f60f 8bec            mov     ebp,esp
6fe7f611 53              push    ebx
6fe7f612 56              push    esi
6fe7f613 57              push    edi
6fe7f614 8bf1            mov     esi,ecx
...
7008506d ffe9            jmp     rcx
7008506f fd              std
70085070 c1daff          rcr     edx,0FFh
70085073 f6450801        test    byte ptr [ebp+8],1
70085077 0f84efa5dfff    je      clr!Thread::GetSafelyRedirectableThreadContext+0xcc (6fe7f66c)
7008507d 8b8604010000    mov     eax,dword ptr [esi+104h]
70085083 3987b8000000    cmp     dword ptr [edi+0B8h],eax
70085089 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)證下。


0:000> dp 004c1b98+0x104 L1
004c1c9c  00000000

從卦中看果然是 0,有些朋友好奇這個(gè) 104 偏移到底是個(gè)什么東西,參考 coreclr 源碼其實(shí)就是 m_LastRedirectIP 字段,參考如下:


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++代碼會(huì)發(fā)現(xiàn)一個(gè)很奇怪的信息,那就是為什么 GetIP(pCtx)= 0,接下來(lái)用 dt 觀察下寄存器上下文。


0:009> kb 2
 # ChildEBP RetAddr      Args to Child              
00 07a8ec80 6fe7f6cd     00000003 07a8ed4c 07a8ecf0 clr!Thread::GetSafelyRedirectableThreadContext+0x7c
01 07a8f030 6fe7f2f3     004c1b98 0b367326 76a016a1 clr!Thread::HandledJITCase+0x31

0:009> dt _CONTEXT 07a8ed4c
ntdll!_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,這是一個(gè)非常錯(cuò)誤的信息,還有一點(diǎn)就是 m_LastRedirectIP 字段一般用來(lái)處理一些比較詭異的兼容性問(wèn)題,所以這里兩個(gè)字段都是 0 導(dǎo)致崩潰的產(chǎn)生。

有了上面的信息,我們就知道了前因后果,原來(lái)是主線程車毀人亡(eip=0),導(dǎo)致GC無(wú)法暫停它,在內(nèi)部拋出了代碼異常,你可以說(shuō)是 CLR 的bug,也可以說(shuō)是主線程的Bug,所以給到的解決方案就是:

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

三:總結(jié)

說(shuō)實(shí)話要想解釋這個(gè)程序?yàn)槭裁磿?huì)崩潰,需要分析者對(duì)GC的SuspendRuntime運(yùn)作邏輯有一定的了解,否則真抓瞎了,所以.NET調(diào)試訓(xùn)練營(yíng)中的GC理論知識(shí)一定是分析這些 dump 的基石。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-844033.html

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

到了這里,關(guān)于記一次 .NET某防偽驗(yàn)證系統(tǒng) 崩潰分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 記一次 .NET 某旅行社審批系統(tǒng) 崩潰分析

    記一次 .NET 某旅行社審批系統(tǒng) 崩潰分析

    前些天有位朋友找到我,說(shuō)他的程序跑著跑著就崩潰了,讓我看下怎么回事,其實(shí)沒(méi)怎么回事,抓它的 crash dump 就好,具體怎么抓也是被問(wèn)到的一個(gè)高頻問(wèn)題,這里再補(bǔ)一下鏈接: [.NET程序崩潰了怎么抓 Dump ? 我總結(jié)了三種方案] https://www.cnblogs.com/huangxincheng/p/14811953.html ,采用

    2024年02月09日
    瀏覽(21)
  • 記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析

    記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析

    前幾天有位朋友微信上找到我,說(shuō)他的程序會(huì)偶發(fā)性崩潰,一直找不到原因,讓我?guī)兔匆幌略趺椿厥?,?duì)于這種崩潰類的程序,最好的辦法就是丟dump過(guò)來(lái)看一下便知,話不多說(shuō),上windbg說(shuō)話。 對(duì)于一個(gè)崩潰類的dump,尋找崩潰點(diǎn)非常重要,常用的命令就是 !analyze -v ,輸出如

    2024年02月08日
    瀏覽(26)
  • 記一次 .NET 某新能源材料檢測(cè)系統(tǒng) 崩潰分析

    記一次 .NET 某新能源材料檢測(cè)系統(tǒng) 崩潰分析

    上周有位朋友找到我,說(shuō)他的程序經(jīng)常會(huì)偶發(fā)性崩潰,一直沒(méi)找到原因,自己也抓了dump 也沒(méi)分析出個(gè)所以然,讓我?guī)兔聪略趺椿厥?,那既然?dump,那就開始分析唄。 一直跟蹤我這個(gè)系列的朋友應(yīng)該知道分析崩潰第一個(gè)命令就是 !analyze -v ,讓windbg幫我們自動(dòng)化異常分析。

    2024年02月05日
    瀏覽(19)
  • 記一次 .NET 某企業(yè)采購(gòu)平臺(tái) 崩潰分析

    記一次 .NET 某企業(yè)采購(gòu)平臺(tái) 崩潰分析

    前段時(shí)間有個(gè)朋友找到我,說(shuō)他們的程序有偶發(fā)崩潰的情況,讓我?guī)兔聪略趺椿厥拢槍?duì)這種 crash 的程序,用 AEDebug 的方式抓取一個(gè)便知,有了 dump 之后接下來(lái)就可以分析了。 既然是程序的崩潰,我們可以像看藍(lán)屏一下看dump文件,使用 !analyze -v 命令即可。 從上面的信息

    2024年02月11日
    瀏覽(24)
  • 記一次 .NET某股票交易軟件 靈異崩潰分析

    記一次 .NET某股票交易軟件 靈異崩潰分析

    在dump分析的旅程中也會(huì)碰到一些讓我無(wú)法解釋的靈異現(xiàn)象,追過(guò)這個(gè)系列的朋友應(yīng)該知道,上一篇我聊過(guò) 宇宙射線 導(dǎo)致的程序崩潰,后來(lái)我又發(fā)現(xiàn)了一例,而這一例恰恰是高鐵的 列控連鎖一體化 程序,所以更加讓我確定這是由于 電離輻射 干擾了計(jì)算機(jī)的 數(shù)字信號(hào) 導(dǎo)致程

    2024年02月04日
    瀏覽(24)
  • 記一次 .NET某工控 宇宙射線 導(dǎo)致程序崩潰分析

    記一次 .NET某工控 宇宙射線 導(dǎo)致程序崩潰分析

    為什么要提 宇宙射線 , 太陽(yáng)耀斑 導(dǎo)致的程序崩潰呢?主要是昨天在知乎上看了這篇文章:莫非我遇到了傳說(shuō)中的bug? ,由于 rip 中的0x41變成了0x61出現(xiàn)了bit位翻轉(zhuǎn)導(dǎo)致程序崩潰,截圖如下: 下面的評(píng)論大多是說(shuō)由于 宇宙射線 ,這個(gè)太玄乎了,說(shuō)實(shí)話看到這個(gè) 傳說(shuō)bug 的提法

    2024年02月04日
    瀏覽(30)
  • 記一次 騰訊會(huì)議 的意外崩潰分析

    記一次 騰訊會(huì)議 的意外崩潰分析

    前段時(shí)間在用 騰訊會(huì)議 直播的時(shí)候,居然意外崩潰了,還好不是在訓(xùn)練營(yíng)上課,不然又得重錄了,崩完之后發(fā)現(xiàn) 騰訊會(huì)議 的 bugreport 組件會(huì)自動(dòng)生成一個(gè) minidump,截圖如下: 作為一個(gè).NET高級(jí)調(diào)試的技術(shù)博主,非 .NET 的程序也得要研究研究哈??????,有了這個(gè)好奇心,也

    2023年04月20日
    瀏覽(23)
  • 記一次 .NET 某工控視覺(jué)系統(tǒng) 卡死分析

    記一次 .NET 某工控視覺(jué)系統(tǒng) 卡死分析

    前段時(shí)間有位朋友找到我,說(shuō)他們的工業(yè)視覺(jué)軟件僵死了,讓我?guī)兔聪碌降资鞘裁辞闆r,哈哈,其實(shí)卡死的問(wèn)題相對(duì)好定位,無(wú)非就是看主線程棧嘛,然后就是具體問(wèn)題具體分析,當(dāng)然難度大小就看運(yùn)氣了。 前幾天看一篇文章說(shuō)現(xiàn)在的 .NET程序員 不需要學(xué)習(xí) WinDbg ,理由就

    2024年02月12日
    瀏覽(21)
  • 記一次 .NET 某券商論壇系統(tǒng) 卡死分析

    記一次 .NET 某券商論壇系統(tǒng) 卡死分析

    前幾個(gè)月有位朋友找到我,說(shuō)他們的的web程序沒(méi)有響應(yīng)了,而且監(jiān)控發(fā)現(xiàn)線程數(shù)特別高,內(nèi)存也特別大,讓我?guī)兔匆幌略趺椿厥?,現(xiàn)在回過(guò)頭來(lái)幾經(jīng)波折,回味價(jià)值太濃了。 這個(gè)程序內(nèi)存高,線程高,無(wú)響應(yīng),尼瑪是一個(gè)復(fù)合態(tài)問(wèn)題,那怎么入手呢?按經(jīng)驗(yàn)推測(cè),大概率是

    2024年02月05日
    瀏覽(32)
  • 記一次 .NET 某電力系統(tǒng) 內(nèi)存暴漲分析

    記一次 .NET 某電力系統(tǒng) 內(nèi)存暴漲分析

    前些天有位朋友找到我,說(shuō)他生產(chǎn)上的程序有內(nèi)存暴漲情況,讓我?guī)兔聪略趺椿厥?,最?jiǎn)單粗暴的方法就是讓朋友在內(nèi)存暴漲的時(shí)候抓一個(gè)dump下來(lái),看一看大概就知道咋回事了。 這個(gè)問(wèn)題說(shuō)的再多也不為過(guò),一定要看清楚這個(gè)程序是如何個(gè)性化發(fā)展的,可以使用 !address

    2024年02月08日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包