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

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

記一次 .NET某工控WPF程序被人惡搞的卡死分析

來源: 責編: 時間:2024-05-29 08:57:02 151觀看
導讀一、背景1. 講故事這一期程序故障除了做原理分析,還順帶吐槽一下,熟悉我的朋友都知道我分析dump是免費的,但免費不代表可以濫用我的寶貴時間,我不知道有些人故意惡搞卡死是想干嘛,不得而知,希望后面類似的事情越來越少吧!廢

一、背景

1. 講故事

這一期程序故障除了做原理分析,還順帶吐槽一下,熟悉我的朋友都知道我分析dump是免費的,但免費不代表可以濫用我的寶貴時間,我不知道有些人故意惡搞卡死是想干嘛,不得而知,希望后面類似的事情越來越少吧!廢話不多說,我們來看看是如何被惡搞的。TYm28資訊網——每日最新資訊28at.com

二、WinDbg 分析

1. 程序是如何卡死的

既然是窗體程序自然就是看主線程,我們使用 k 命令即可。TYm28資訊網——每日最新資訊28at.com

0:000> k  # Child-SP          RetAddr               Call Site00 00000036`e1f7da18 00007ffe`70bf30ce     ntdll!NtWaitForSingleObject+0x1401 00000036`e1f7da20 00007ffd`eff74910     KERNELBASE!WaitForSingleObjectEx+0x8e...05 (Inline Function) --------`--------     coreclr!CLREventBase::Wait+0x12 [D:/a/_work/1/s/src/coreclr/vm/synch.cpp @ 412] 06 00000036`e1f7db20 00007ffd`f00c9afa     coreclr!Thread::WaitSuspendEventsHelper+0xc8 [D:/a/_work/1/s/src/coreclr/vm/threadsuspend.cpp @ 4626] 07 (Inline Function) --------`--------     coreclr!Thread::WaitSuspendEvents+0x8 [D:/a/_work/1/s/src/coreclr/vm/threadsuspend.cpp @ 4663] 08 00000036`e1f7dbe0 00007ffd`f0009c80     coreclr!Thread::RareEnablePreemptiveGC+0x7d99a [D:/a/_work/1/s/src/coreclr/vm/threadsuspend.cpp @ 2414] 09 (Inline Function) --------`--------     coreclr!Thread::EnablePreemptiveGC+0x16 [D:/a/_work/1/s/src/coreclr/vm/threads.h @ 2044] 0a 00000036`e1f7dc20 00007ffd`f0075d10     coreclr!Thread::RareDisablePreemptiveGC+0xc8 [D:/a/_work/1/s/src/coreclr/vm/threadsuspend.cpp @ 2156] 0b 00000036`e1f7dca0 00007ffd`f0096a5f     coreclr!JIT_ReversePInvokeEnterRare2+0x18 [D:/a/_work/1/s/src/coreclr/vm/jithelpers.cpp @ 5462] 0c 00000036`e1f7dcd0 00007ffd`907afe09     coreclr!JIT_ReversePInvokeEnterTrackTransitions+0xaf [D:/a/_work/1/s/src/coreclr/vm/jithelpers.cpp @ 5509] 0d 00000036`e1f7dd00 00007ffe`72e0e858     0x00007ffd`907afe090e 00000036`e1f7dd80 00007ffe`72e0e3dc     user32!UserCallWinProcCheckWow+0x2f80f 00000036`e1f7df10 00007ffe`72e20c93     user32!DispatchClientMessage+0x9c10 00000036`e1f7df70 00007ffe`730f0e64     user32!_fnDWORD+0x3311 00000036`e1f7dfd0 00007ffe`70b31104     ntdll!KiUserCallbackDispatcherContinue12 00000036`e1f7e058 00007ffe`72e21c0e     win32u!NtUserGetMessage+0x1413 00000036`e1f7e060 00007ffe`711e28f2     user32!GetMessageW+0x2e...1d 00000036`e1f7e460 00007ffd`f009ba53     xxx!xxx.App.Main+0x5e...2a 00000036`e1f7f140 00007ffe`4cd4e1e6     hostfxr!execute_app+0x2fa [D:/a/_work/1/s/src/native/corehost/fxr/fx_muxer.cpp @ 145] ...34 00000036`e1f7f890 00000000`00000000     ntdll!RtlUserThreadStart+0x21

從卦中的調用棧可以看到,主線程通過 GetMessageW 從消息隊列中拿到了數據,在處理時被 coreclr 押解到 WaitSuspendEventsHelper 處等待一個event事件,接下來看下這個方法的源碼到底是怎么寫的?簡化后如下:TYm28資訊網——每日最新資訊28at.com

BOOL Thread::WaitSuspendEventsHelper(void){    if (m_State & TS_DebugSuspendPending)    {        ThreadState oldState = m_State;        while (oldState & TS_DebugSuspendPending)        {            ThreadState newState = (ThreadState)(oldState | TS_SyncSuspended);            if (InterlockedCompareExchange((LONG*)&m_State, newState, oldState) == (LONG)oldState)            {                result = m_DebugSuspendEvent.Wait(INFINITE, FALSE);                break;            }            oldState = m_State;        }    }    return result != WAIT_OBJECT_0;}

從上面的代碼可以明顯的看到當前Thread 處于 TS_DebugSuspendPending 狀態,從名字上看貌似和調試有關,接下來查下這個枚舉的注解。TYm28資訊網——每日最新資訊28at.com

enum ThreadState{    TS_DebugSuspendPending = 0x00000008,    // Is the debugger suspending threads?}

從注解看是因為調試器阻塞了這個線程,我去,哪里來的調試器呢?這引起了我的巨大興趣。。。TYm28資訊網——每日最新資訊28at.com

2. 哪里來的調試器

我剛開始是抱有巨大的善意,我以為他的程序被人惡意注入導致卡死,但分析下來我還是太單純了,繼續往下看吧,既然有調試器,一般來說PEB.BeingDebugged=Yes狀態,命令的輸出結果也得到了證實。TYm28資訊網——每日最新資訊28at.com

0:000> !pebPEB at 00000036e1c11000    ...    BeingDebugged:            Yes    ...                    Base TimeStamp                     Module            7ff7f5230000 65310000 Oct 19 18:08:00 2023 G:/xxx/C#/Projects/NugetApplications/Applications/xxx/bin/Debug/net6.0-windows/xxx.exe            ...

我以為到這里就可以告訴朋友答案,你的程序可能被人惡意注入了,但眼尖的我發現了一點異常,他的 xxx.exe 啟動目錄怎么會有 /bin/Debug/net6.0-windows/ 呢?很明顯這是用 VS 直接跑起來的呀。。。。TYm28資訊網——每日最新資訊28at.com

3. 真的是 VS 跑起來的嗎

首先大家要知道 Visual Studio 是托管調試器,托管調試器在調試程序的時候會在 coreclr 層面設置一個全局變量 g_CORDebuggerControlFlags=0x0200,這也是 Debugger.IsAttached 的底層判斷依據,不相信的朋友可以看下這個方法的底層實現:TYm28資訊網——每日最新資訊28at.com

FCIMPL0(FC_BOOL_RET, DebugDebugger::IsDebuggerAttached){    CORDebuggerAttached();}inline bool CORDebuggerAttached(){    return (g_CORDebuggerControlFlags & DBCF_ATTACHED);}enum DebuggerControlFlag{    DBCF_ATTACHED                   = 0x0200,};

有了這些基礎知識之后,接下來就可以用 x 命令去驗證下。TYm28資訊網——每日最新資訊28at.com

看到上面的答案基本就可以實錘了,有些朋友可能還是不大相信,我們可以這樣看,VisualStudio 是 WPF 寫的,如果用 VS 來調試,那么線程棧里面應該會有很多類似的 VisualStudio 字符串。TYm28資訊網——每日最新資訊28at.com

從卦中看,你說正常發布的程序怎么可能會有 9 個 Microsoft.VisualStudio.DesignTools 字符串呢?TYm28資訊網——每日最新資訊28at.com

4. 這個dump是如何生成的

這個問題我相信可能有一些朋友會比較疑惑,其實沒什么疑惑的,Visual Studio 有生成Dump的功能,操作步驟為:Debug -> Save Dump As... , 接下來通過一個小例子觀察一下。TYm28資訊網——每日最新資訊28at.com

internal class Program    {        static void Main(string[] args)        {            Console.WriteLine($"托管調試器:{Debugger.IsAttached}");            Console.WriteLine($"非托管調試器:{IsDebuggerPresent()}");            Console.ReadLine();        }        [DllImport("kernel32.dll")]        static extern bool IsDebuggerPresent();    }

調試起來后,截圖如下:TYm28資訊網——每日最新資訊28at.com

最后打開生成好的 Dump 文件,使用 kc 觀察主線程的輸出:TYm28資訊網——每日最新資訊28at.com

0:000> kc # Call Site00 ntdll!NtWaitForSingleObject01 KERNELBASE!WaitForSingleObjectEx02 coreclr!CLREventWaitHelper203 coreclr!CLREventWaitHelper04 coreclr!CLREventBase::WaitEx05 coreclr!CLREventBase::Wait06 coreclr!Thread::WaitSuspendEventsHelper07 coreclr!Thread::WaitSuspendEvents08 coreclr!Thread::RareEnablePreemptiveGC09 coreclr!Thread::EnablePreemptiveGC0a coreclr!Thread::RareDisablePreemptiveGC0b coreclr!Thread::DisablePreemptiveGC...19 ConsoleApp4!ConsoleApp4.Program.Main...30 ntdll!RtlUserThreadStart

從卦中看,正是停留在 WaitSuspendEventsHelper 函數里,一摸一樣,徹底被360°無死角的證實......TYm28資訊網——每日最新資訊28at.com

三、總結

這是一次人為的故意惡搞,大概率就是想看下我到底是騾子是馬。我分析的結果對他和他所在的公司來說沒有任何價值,只能白白的浪費我的時間,真是分析多了,什么樣的人都能遇到,謹以此文告知后來者,免費但請不要濫用!TYm28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-91362-0.html記一次 .NET某工控WPF程序被人惡搞的卡死分析

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

上一篇: 每個前端開發人員都應該了解的軟件工程原理

下一篇: 面試官:你能實現一個 JavaScript 模板引擎嗎?

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 怀仁县| 石首市| 临西县| 宁安市| 友谊县| 利辛县| 吉林省| 逊克县| 禄丰县| 瑞昌市| 衡山县| 安西县| 江门市| 中西区| 莱芜市| 贺兰县| 扎兰屯市| 遵义县| 津南区| 田林县| 紫云| 宕昌县| 大洼县| 通许县| 陆川县| 华坪县| 台南县| 故城县| 太湖县| 平原县| 大同县| 紫阳县| 手机| 榆中县| 蓝田县| 越西县| 武陟县| 白城市| 简阳市| 瑞安市| 灵台县|