• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Error

            C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
              217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks

            // 本質(zhì)上來(lái)說(shuō)就是自己設(shè)置了UnhandleExceptionFilter后,C運(yùn)行庫(kù)或者其他什么別的函數(shù)也調(diào)用了,所以自己設(shè)置的就無(wú)效了,解決方案就是HOOK SET函數(shù),讓別人無(wú)法取代自己

            很多 C/C++ 程序會(huì)設(shè)置自己的 Unhandled Exception Filter 用于捕獲 Unhandled exceptions 并輸出一些信息(例如,創(chuàng)建 mini-dump 或者輸出調(diào)用棧到日志文件中)。

            從 VC++2005 開(kāi)始出于安全因素微軟改變了 CRT 的行為。在以下情況下 CRT 不會(huì)通知被注冊(cè)的 Unhandled Exception Filter:

            1. 調(diào)用了 abort() 并且設(shè)置 abort 的行為為 _CALL_REPORTFAULT(Release 版本默認(rèn)使用此設(shè)置)
            2. Security Checks 失敗時(shí),具體來(lái)說(shuō)就是檢查到一些會(huì)引發(fā)安全問(wèn)題的堆棧溢出時(shí)不會(huì)通知被注冊(cè)的 Unhandled Exception Filter,會(huì)引發(fā)安全問(wèn)題的堆棧溢出包括:覆蓋了函數(shù)的返回值,覆蓋了 Exception handler 的地址,覆蓋了某些類型的參數(shù)。關(guān)于編譯器的 Security Checks 的內(nèi)容,詳細(xì)參考:http://msdn.microsoft.com/en-us/library/Aa290051(注意,此文章談到的是 Visual Studio .NET 2003,其中 _set_security_error_handler 函數(shù)在 VC++2005 以及以上版本已經(jīng)無(wú)法使用)
            3. 如果沒(méi)有調(diào)用 _set_invalid_parameter_handler 設(shè)置 Invalid parameter handler 時(shí),檢查到了非法的參數(shù)

            CRT 是通過(guò)何種方式使得我們注冊(cè)的 Unhandled Exception Filter 不被調(diào)用的?答案在 CRT 的代碼中:

            1. /* 代碼來(lái)源于 gs_report.c */
            2. /* Make sure any filter already in place is deleted. */
            3. SetUnhandledExceptionFilter(NULL);
            4. UnhandledExceptionFilter(&ExceptionPointers);

            CRT 通過(guò)調(diào)用 SetUnhandledExceptionFilter 并傳遞參數(shù) NULL 來(lái)清除用戶注冊(cè)的 Unhandled Exception Filter。如果期望用戶注冊(cè)的 Unhandled Exception Filter 總是被調(diào)用那么應(yīng)該避免 CRT 中相關(guān)的清理代碼。做法之一就是修改 CRT 代碼并且編譯為靜態(tài)庫(kù)(微軟的 VC++ Libraries 開(kāi)發(fā) Lead Martyn Lovell 在 https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=101337&SiteID=210 談到過(guò)有關(guān)的問(wèn)題),這里并不建議使用此做法。另外一種做法則是改變 SetUnhandledExceptionFilter 的行為,使得 CRT 對(duì) SetUnhandledExceptionFilter 的調(diào)用不起任何作用(更加詳細(xì)的論述可以參考《Windows 核心編程》相關(guān)章節(jié))。

            1. // 無(wú)法得知此代碼來(lái)源于
            2. #ifndef _M_IX86
            3. #error "The following code only works for x86!"
            4. #endif
            5.  
            6. // 此函數(shù)一旦成功調(diào)用,之后對(duì) SetUnhandledExceptionFilter 的調(diào)用將無(wú)效
            7. void DisableSetUnhandledExceptionFilter()
            8. {
            9. void* addr = (void*)GetProcAddress(LoadLibrary("kernel32.dll"),
            10. "SetUnhandledExceptionFilter");
            11.  
            12. if (addr)
            13. {
            14. unsigned char code[16];
            15. int size = 0;
            16.  
            17. code[size++] = 0x33;
            18. code[size++] = 0xC0;
            19. code[size++] = 0xC2;
            20. code[size++] = 0x04;
            21. code[size++] = 0x00;
            22.  
            23. DWORD dwOldFlag, dwTempFlag;
            24. VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
            25. WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
            26. VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
            27. }
            28. }

            只需要在注冊(cè) Unhandled Exception Filter 之后調(diào)用 DisableSetUnhandledExceptionFilter() 函數(shù),那么之后所有對(duì) SetUnhandledExceptionFilter 的調(diào)用都將無(wú)效,自然 CRT 也無(wú)法通過(guò)調(diào)用 SetUnhandledExceptionFilter 來(lái)清除用戶注冊(cè)的 Unhandled Exception Filter。

            posted on 2015-05-15 02:17 Enic 閱讀(2643) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 從零開(kāi)始寫棋牌游戲平臺(tái)
            99久久国产亚洲综合精品| 亚洲精品国产美女久久久| 亚洲国产精品婷婷久久| 久久中文字幕视频、最近更新| 欧美精品九九99久久在观看| 久久经典免费视频| 久久精品国产亚洲AV大全| 精品久久久久久久久久久久久久久| 久久久高清免费视频| 国内精品久久久久| 精品多毛少妇人妻AV免费久久| 国产成人精品久久一区二区三区| 亚洲伊人久久成综合人影院 | 日本精品久久久久影院日本| 少妇高潮惨叫久久久久久| 国产精品综合久久第一页| 久久青青草原精品国产| 亚洲美日韩Av中文字幕无码久久久妻妇| 69SEX久久精品国产麻豆| 精品一二三区久久aaa片| 青青草国产97免久久费观看| 国产亚洲综合久久系列| 亚洲人成精品久久久久| 中文字幕无码久久久| 久久一区二区三区免费| 久久AAAA片一区二区| 亚洲综合婷婷久久| 国产V亚洲V天堂无码久久久| 久久久久人妻一区精品色| 777午夜精品久久av蜜臀| 狠狠综合久久AV一区二区三区| 亚洲人AV永久一区二区三区久久| 久久久久18| 内射无码专区久久亚洲| 亚洲国产成人久久精品99| 欧美精品丝袜久久久中文字幕 | 久久久久亚洲av无码专区| 亚洲AV无一区二区三区久久| 久久婷婷五月综合97色| 久久久久亚洲AV无码永不| 国产麻豆精品久久一二三|