• <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 ,注入成功!
            国产激情久久久久影院老熟女免费| 国产精品美女久久久久| 国产午夜精品久久久久九九电影| 色偷偷88欧美精品久久久| 伊人色综合久久天天人手人婷| 国产精品久久成人影院| 99精品国产综合久久久久五月天 | 香蕉aa三级久久毛片| 性做久久久久久免费观看 | 99re久久精品国产首页2020| 国产欧美久久一区二区| 亚洲精品综合久久| 91亚洲国产成人久久精品网址| 午夜天堂av天堂久久久| 久久精品国产亚洲AV久| 久久笫一福利免费导航| 久久青青草原亚洲av无码| 国产精品成人无码久久久久久| 狠狠色丁香久久婷婷综合蜜芽五月| 精品国产综合区久久久久久 | 亚洲国产成人久久一区久久| 99久久成人国产精品免费 | 久久久无码精品午夜| 国产午夜精品久久久久免费视 | 色偷偷久久一区二区三区| 久久99九九国产免费看小说| 久久综合久久久| 久久国产香蕉一区精品| 久久精品国产亚洲一区二区三区 | 久久精品国产一区二区三区 | 亚洲人成无码网站久久99热国产 | 久久亚洲精品成人AV| 久久人人爽人人爽人人片AV麻烦| 国产精品成人99久久久久| 久久国产精品久久精品国产| 国产精品久久久久无码av| 国产精品无码久久综合| 国产精品一区二区久久国产| 久久91精品国产91久久麻豆| 久久免费高清视频| 狠狠色综合久久久久尤物|