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

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

            之前搞復雜了,其實可以很簡單

            有個要點:
            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.

            作為一個全局或跨進程的鉤子,鉤子的實現函數必須在DLL中實現,不然目標程序觸發到鉤子時就會掛掉

            DLL實現

            //?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加載時,調用多一次,LoadLibrary的目的,是為了增加引用計數,這樣即使我們的程序關掉了,系統也不會卸載掉DLL,DLL還在內存中(所以通常情況下 LoadLibrary 和 FreeLibrary 要成對調用, 具體可以了解下 Windows 的內存管理機制)

            調用代碼:
            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);
            }


            按下按鈕,使用工具查看,目標程序的加載模塊列表中已經有了 DLLInject.dll ,注入成功!
            久久久久久夜精品精品免费啦| 久久久久久久久无码精品亚洲日韩 | 久久久久久久免费视频| 亚洲国产成人久久综合区| 国产Av激情久久无码天堂| 亚洲级αV无码毛片久久精品| 久久久久国产视频电影| 麻豆成人久久精品二区三区免费| 久久性精品| 国产真实乱对白精彩久久| 色综合久久久久网| 久久精品国产福利国产秒| 亚洲综合精品香蕉久久网| 久久婷婷人人澡人人爽人人爱| 日批日出水久久亚洲精品tv| 久久久网中文字幕| 色综合久久中文字幕综合网| 久久久精品久久久久久| 国产一区二区三精品久久久无广告| 久久久久久久尹人综合网亚洲| 国产成人综合久久综合 | 国产精品99久久久久久www| 久久99国产精品一区二区| 大伊人青草狠狠久久| 51久久夜色精品国产| 国产三级精品久久| 日本久久中文字幕| 久久免费看黄a级毛片| 日韩精品久久久肉伦网站| WWW婷婷AV久久久影片| 久久久久久久99精品免费观看| 精品人妻伦一二三区久久| 亚洲精品NV久久久久久久久久| 色青青草原桃花久久综合| 久久精品国产亚洲AV无码娇色 | 亚洲国产精品成人AV无码久久综合影院| 久久精品18| A级毛片无码久久精品免费| 国产精品9999久久久久| 久久久久国产精品麻豆AR影院 | 久久精品国产2020|