• <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.¢%

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

            之前搞復(fù)雜了,其實(shí)可以很簡(jiǎn)單

            有個(gè)要點(diǎn):
            The global hooks are a shared resource, and installing one affects all applications in the same desktop as the calling thread. All global hook functions must be in libraries. Global hooks should be restricted to special-purpose applications or to use as a development aid during application debugging. Libraries that no longer need a hook should remove its hook procedure.

            作為一個(gè)全局或跨進(jìn)程的鉤子,鉤子的實(shí)現(xiàn)函數(shù)必須在DLL中實(shí)現(xiàn),不然目標(biāo)程序觸發(fā)到鉤子時(shí)就會(huì)掛掉

            DLL實(shí)現(xiàn)

            //?DLLInject.cpp?:?Defines?the?entry?point?for?the?DLL?application.
            //

            #include?
            "stdafx.h"
            #include?
            <stdio.h>

            LRESULT?CALLBACK?CallWndProc(
            int?code,?WPARAM?wParam,?LPARAM?lParam)
            {?
            ????
            return?CallNextHookEx?(NULL,?code,?wParam,?lParam);
            }

            BOOL?APIENTRY?DllMain(?HANDLE?hModule,?
            ??????????????????????DWORD??ul_reason_for_call,?
            ??????????????????????LPVOID?lpReserved
            ??????????????????????)
            {
            ????
            switch?(?ul_reason_for_call?)
            ????{
            ????
            case?DLL_PROCESS_ATTACH:
            ????????{
            ????????????
            char?szDllName[MAX_PATH]={0};
            ????????????GetModuleFileName((HMODULE)hModule,?szDllName,?MAX_PATH);
            ????????????LoadLibrary(szDllName);????????
            ????????????
            break;
            ????????}
            ????
            case?DLL_PROCESS_DETACH:
            ????????{
            ????????}
            ????????
            break;
            ????}
            ????
            ????
            return?TRUE;
            ????
            }

            在DLL加載時(shí),調(diào)用多一次,LoadLibrary的目的,是為了增加引用計(jì)數(shù),這樣即使我們的程序關(guān)掉了,系統(tǒng)也不會(huì)卸載掉DLL,DLL還在內(nèi)存中(所以通常情況下 LoadLibrary 和 FreeLibrary 要成對(duì)調(diào)用, 具體可以了解下 Windows 的內(nèi)存管理機(jī)制)

            調(diào)用代碼:
            HHOOK?g_hHook?=?NULL;
            UINT??g_nHOOKMsg?
            =?0;

            //---------------------------------------------------------------------------
            //?ModuleFromAddress
            //
            //?Returns?the?HMODULE?that?contains?the?specified?memory?address
            //---------------------------------------------------------------------------
            static?HMODULE?ModuleFromAddress(PVOID?pv)?
            {
            ????MEMORY_BASIC_INFORMATION?mbi;
            ????
            ????
            return?((::VirtualQuery(pv,?&mbi,?sizeof(mbi))?!=?0)???(HMODULE)?mbi.AllocationBase?:?NULL);
            }

            void?CDLLInjectBySetHookDlg::OnButton1()?
            {????
            ????HMODULE?hModule?
            =?::LoadLibrary("DLLInject.dll");
            ????
            if?(?hModule?==?NULL?)
            ????{
            ????????AfxMessageBox(
            "Failed?to?LoadLibrary!");
            ????????
            return?;
            ????}

            ????typedef?LRESULT?(CALLBACK?
            *CallWndProc)(int?code,?WPARAM?wParam,?LPARAM?lParam);
            ????CallWndProc?pfnCallWndProc?
            =?(CallWndProc)::GetProcAddress(hModule,?"CallWndProc");

            ????
            if?(?pfnCallWndProc?==?NULL?)
            ????{
            ????????AfxMessageBox(
            "Failed?to?GetProcAddress!");
            ????????
            return?;
            ????}

            ????HWND?hWnd?
            =?::FindWindow(NULL,?"testHooked");
            ????
            if?(hWnd?==?NULL)
            ????{
            ????????AfxMessageBox(
            "Failed?to?Find?Window!");
            ????????
            return?;
            ????}

            ????DWORD?dwThreadID?
            =?::GetWindowThreadProcessId(hWnd,?NULL);
            ????
            if?(?dwThreadID?==?0?)
            ????{
            ????????AfxMessageBox(
            "Failed?to?Get?Window?Thread?Process?ID");
            ????????
            return?;
            ????}

            ????g_hHook?
            =?::SetWindowsHookEx(WH_CALLWNDPROC,?(HOOKPROC)(pfnCallWndProc),?ModuleFromAddress(pfnCallWndProc),?dwThreadID);

            ????
            if?(?g_hHook?==?NULL?)
            ????{
            ????????AfxMessageBox(
            "Failed?to?Set?Windows?Hook");
            ????????
            return?;
            ????}

            ????::SendMessage(::FindWindow(NULL,?
            "testHooked"),?WM_USER,?0,?0);
            ????::UnhookWindowsHookEx(g_hHook);
            }


            按下按鈕,使用工具查看,目標(biāo)程序的加載模塊列表中已經(jīng)有了 DLLInject.dll ,注入成功!
            久久精品国产亚洲AV嫖农村妇女| 青青草原综合久久大伊人精品| 久久精品国产亚洲5555| 久久精品亚洲乱码伦伦中文| 色综合合久久天天给综看| 久久成人小视频| 99国产精品久久| 超级碰碰碰碰97久久久久| 久久久精品国产sm调教网站| 久久综合狠狠综合久久97色| 国产成人无码久久久精品一| 三级片免费观看久久| 91精品国产高清久久久久久io| 欧美久久综合性欧美| 国产A级毛片久久久精品毛片| 亚洲一本综合久久| 久久久久99精品成人片欧美| 中文国产成人精品久久亚洲精品AⅤ无码精品| 亚洲AV无码久久寂寞少妇| 青青草原综合久久大伊人导航| 69久久夜色精品国产69| 亚洲人成网亚洲欧洲无码久久 | 亚洲国产成人久久一区WWW| 潮喷大喷水系列无码久久精品| 国产精品一区二区久久精品涩爱| 999久久久国产精品| 久久精品人人做人人爽电影| 婷婷五月深深久久精品| 99精品国产免费久久久久久下载| 久久婷婷五月综合97色直播| 久久精品无码一区二区三区免费| 99久久亚洲综合精品网站| 2022年国产精品久久久久| 久久婷婷五月综合97色| 亚洲AV无码1区2区久久| 婷婷综合久久中文字幕蜜桃三电影| 亚洲精品tv久久久久| 中文字幕无码久久人妻| 久久综合九色综合网站| 久久久久人妻精品一区| 国产精品久久久久久久|