• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            利用WH_DEBUG消息進行反HOOK

            Posted on 2010-01-10 16:48 S.l.e!ep.¢% 閱讀(1196) 評論(2)  編輯 收藏 引用 所屬分類: RootKit
            【原創(chuàng)】利用WH_DEBUG消息進行反HOOK
            ningkai 當(dāng)前離線

            標 題: 【原創(chuàng)】利用WH_DEBUG消息進行反HOOK
            作 者: ningkai
            時 間: 2007-10-09,19:14
            鏈 接: http://bbs.pediy.com/showthread.php?t=53016

            以前在學(xué)習(xí)鉤子的時候?qū)τ赪H_DEBUG這個類型很是不解釋,不知道它是做什么用的,在網(wǎng)上找了一找,發(fā)現(xiàn)也沒有什么有價值的文章。在逆向分析“熱血江湖”突然發(fā)現(xiàn)WH_DEBUG竟被用來進行反鍵盤記錄(這是老版本,現(xiàn)在的版本已經(jīng)用了最新的技術(shù),原理沒弄明白,哪位要是弄明白了,希望可以指點一下)。仔細研究了一下,弄明白了其中的原理,現(xiàn)在就介紹給一下。
            首先要將WH_DEBUG介紹一下。WH_DEBUG為調(diào)試鉤子,用來給鉤子函數(shù)除錯。在系統(tǒng)調(diào)用系統(tǒng)中與其他Hook關(guān)聯(lián)的Hook鉤子例程之前,系統(tǒng)會調(diào)用WH_DEBUG?Hook鉤子例程。你可以使用這個Hook來決定是否允許系統(tǒng)調(diào)用與其他Hook關(guān)聯(lián)的Hook鉤子例程。WH_DEBUG調(diào)用DebugProc鉤子例程。
            DebugProc語法:
            LRESULT?CALLBACK?DebugProc(
            ??int?nCode,
            ????WPARAM?wParam,
            ????LPARAM?lParam
            )
            nCode傳遞到鉤子例程的鉤子代碼。
            wParam指示當(dāng)前即將被調(diào)用的鉤子的類型,如WH_MOUSE,WH_KEYBOARD?參數(shù)。
            lParam?指向DEBUGHOOKINFO?結(jié)構(gòu)。
            typedef?struct?
            {
            ????DWORD?idThread;
            ????DWORD?idThreadInstaller;
            ????LPARAM?lParam;
            ????WPARAM?wParam;
            ????int?code;
            }?DEBUGHOOKINFO,?*PDEBUGHOOKINFO;
            idThread?安裝WH_DEBUG鉤子的線程ID。
            idThreadInstaller?當(dāng)前即將被調(diào)用的鉤子所在的線程ID。
            lParam?當(dāng)前即將被調(diào)用的鉤子的lParam參數(shù)。
            wParam?當(dāng)前即將被調(diào)用的鉤子的wParam參數(shù)。
            Code?當(dāng)前即將被調(diào)用的鉤子的nCode參數(shù)。

            返回值:當(dāng)你已經(jīng)處理了該鉤子并且不希望即將被調(diào)用的鉤子繼續(xù)執(zhí)行,則必須返回非0值?否則請返回CallNextHookEx的值。

            進行反HOOK時只要知道判斷idThread和idThreadInstaller是否相等就可了。如果相等,說明即將被調(diào)用的鉤子是自己線程中鉤子;如果不等,說明是其它線程中的鉤子,只要返回非0值就可以了,這時即將被調(diào)用的鉤子就不會執(zhí)行了。
            程序編寫:
            新建DLL工程,寫入以下代碼,然后調(diào)用InstallHook()安裝WH_DEBUG鉤子,調(diào)用UnInstallHook()卸載WH_DEBUG鉤子。
            #ifndef?MYLIBAPI
            #define?MYLIBAPI?extern?"C"?__declspec(dllimport)
            #endif

            HHOOK?DEBUG_hhook;
            HINSTANCE?handle;

            MYLIBAPI?bool?WINAPI?InstallHook();
            MYLIBAPI?bool?WINAPI?UnInstallHook();

            LRESULT?CALLBACK?DebugProc(int?nCode,?WPARAM?wParam,?LPARAM?lParam)?//WH_DEBUG鉤子例程
            {
            ??DEBUGHOOKINFO?*debug=(DEBUGHOOKINFO?*)lParam;
            //如果要編寫反鍵盤記錄代碼,可以改成
            //?if(debug->idThread!=debug->idThreadInstaller?&&?wParam==?WH_KEYBOARD)
            //{
            //?return?1;
            //}
            ??if(debug->idThread!=debug->idThreadInstaller)???//是否相等,如果不等則不執(zhí)行
            ??{
            ????return?1;
            ??}
            ??return?::CallNextHookEx(DEBUG_hhook,?nCode,?wParam?,lParam);
            }

            BOOL?APIENTRY?DllMain(?HINSTANCE?hModule,?
            ???????????????????????DWORD??ul_reason_for_call,?
            ???????????????????????LPVOID?lpReserved
            ???????????)
            {
            ??handle=hModule;
            ????return?TRUE;
            }

            bool?WINAPI?InstallHook()??//安裝WH_DEBUG鉤子
            {
            DEBUG_hhook=::SetWindowsHookEx(WH_DEBUG,(HOOKPROC)DebugProc,handle,?NULL);
            If(DEBUG_hhook==NULL)
            Return?false;
            ??return?true;
            }

            bool?WINAPI?UnInstallHook()//卸載WH_DEBUG鉤子
            {
            ??UnhookWindowsHookEx(DEBUG_hhook);
            ??return?true;
            }
            當(dāng)然,破解這種方法的辦法也很簡單。比如你要用HOOK進行鍵盤攔截時,在安裝WH_KEYBOARD時,同時安裝一個WH_DEBUG鉤子。這時你自己的WH_DEBUG鉤子將攔截到你自己的WH_KEYBOARD,DEBUGHOOKINFO?結(jié)構(gòu)中的lParam存放的是WH_KEYBOARD的lParam,wParam存放的是WH_KEYBOARD的wParam,只要在這里處理WH_KEYBOARD就可以了。因為HOOK鏈是按照后進先出的順序執(zhí)行的,所以你只要在反HOOK的WH_DEBUG之后安裝WH_DEBUG,就可以在它之前進行處理了。
            我只用這種方法進行過反鍵盤和鼠標,其它的鉤子,我還沒有試過,如果有什么不對的地方,還請大家指點!!!

            ????很久以前寫的文章,一直沒發(fā)布,突然想起來了,發(fā)出來共大家參考,本來是有源碼的,可是權(quán)限不夠,不能發(fā)附件,所以請大家海涵

            Feedback

            # re: 利用WH_DEBUG消息進行反HOOK   回復(fù)  更多評論   

            2010-02-23 16:50 by Pencil.C++
            debug->idThread!=debug->idThreadInstaller

            這個等式永遠成立,在2000/xp之后的系統(tǒng)中。因為idThreadInstaller始終是0

            # re: 利用WH_DEBUG消息進行反HOOK   回復(fù)  更多評論   

            2010-02-23 20:24 by S.l.e!ep.¢%
            那2K/XP 后沒法判斷?
            亚洲色欲久久久综合网东京热| 久久精品夜色噜噜亚洲A∨| 久久成人国产精品免费软件| 亚洲伊人久久大香线蕉综合图片| 久久美女人爽女人爽| 久久强奷乱码老熟女网站| 伊人久久大香线蕉亚洲| 精品国产婷婷久久久| 伊人久久大香线焦AV综合影院| 久久香蕉综合色一综合色88| 一本一道久久综合狠狠老| 久久成人精品| 久久精品中文字幕久久| 日日躁夜夜躁狠狠久久AV| 久久嫩草影院免费看夜色| 精品久久香蕉国产线看观看亚洲| 性做久久久久久久久| 91精品国产综合久久香蕉| 亚洲国产精品无码久久久蜜芽| 久久青青草原精品国产软件| 青青青伊人色综合久久| 久久棈精品久久久久久噜噜| 伊人色综合久久天天网| 国产日韩久久免费影院| 伊人丁香狠狠色综合久久| 99久久99这里只有免费的精品| 天堂久久天堂AV色综合| 亚洲AV无码久久精品蜜桃| 成人午夜精品无码区久久| 久久久国产打桩机| 久久久久久精品免费免费自慰| 免费一级欧美大片久久网| 久久久亚洲精品蜜桃臀| 欧美粉嫩小泬久久久久久久 | 久久亚洲国产精品成人AV秋霞 | 人人狠狠综合久久88成人| 色婷婷噜噜久久国产精品12p | 午夜福利91久久福利| 中文字幕精品无码久久久久久3D日动漫| 亚洲欧美日韩精品久久| 国内精品久久久久影院网站|