Dll注入技術之消息鉤子

轉自:黑客反病毒

DLL注入技術之消息鉤子注入

    消息鉤子注入原理是利用Windows 系統中SetWindowsHookEx()這個API,他可以攔截目標進程的消息到指定的DLL中導出的函數,利用這個特性,我們可以將DLL注入到指定進程中。主要流程如下圖所示


1.準備階段
    需要編寫一個DLL,並且顯式導出MyMessageProc()函數,主要代碼如下:

LRESULT WINAPI MyMessageProc(int code,WPARAM wParam,LPARAM lParam)
{
    return CallNextHookEx(NULL, code, wParam, lParam);
}

顯示導出某個函數需要在.def文件中的EXPORTS填寫MyMessageProc(),如下圖所示:

2.HOOK階段      
    使用SetWindowsHookEx()之前首先需要將HOOK的DLL 加載到本身的進程中,以此得到DLL的模塊句柄,再使用GetProcAddress()得到DLL中顯示導出的函數MyMessageProc()的函數地址,最後遍歷出待注入進程的線程ID,這樣SetWindowsHookEx()就可以利用這些參數進行HOOK了。主要代碼如下圖所示:

    //加載DLL到本身進程
    hMod = LoadLibrary(pDllName);
    if(!hMod) return FALSE;
    //得到顯示函數的地址
    lpFunc = (DWORD)GetProcAddress(hMod, "MyMessageProc");
    if(!lpFunc)
    {
        if(hMod) FreeLibrary(hMod);
        return FALSE;
    }
    //得到待注入EXE的進程ID
    dwProcessId = GetProcessId(pExeName);
    if(!dwProcessId)
    {
        if(hMod) FreeLibrary(hMod);
        return FALSE;
    }
    //得到待注入EXE的線程ID
    dwThreadId = GetThreadId(dwProcessId);
    if(!dwThreadId)
    {
        if(hMod) FreeLibrary(hMod);
        return FALSE;
    }
    //利用HOOK進行注入
    hhook = SetWindowsHookEx(
        WH_GETMESSAGE,//WH_KEYBOARD,//WH_CALLWNDPROC,
        (HOOKPROC)lpFunc,
        hMod,
        dwThreadId);

3.釋放階段
    利用LoadLibrary()得到的模塊句柄把本身進程的DLL釋放掉,代碼如下所示:
if(hMod) FreeLibrary(hMod);
消息鉤子注入只需要對SetWindowsHookEx()和DLL導出函數有深刻的認識就可以很容編寫,所以代碼簡單,比較容易實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章