0

全て

API をフックするグローバル Windows フックをMessageBox()実装しました。フックは dll に実装されています。win32 コンソール アプリケーション (dll が読み込まれている) で Windows フックをセットアップして呼び出すMessageBox()と、API が正常にフックされます。簡潔にするために、この win32 アプリケーションに EXE1 という名前を付けます。

MessageBox()グローバルフックを設定したので、他のアプリケーションからの呼び出しもフックしたいです。したがって、別の win32 コンソール アプリケーションを実行します -- EXE2 (EXE1 を同時に実行) はMessageBox()、3 回呼び出します。ただし、最初の呼び出しはフックされません。どうしてか分かりません。(コードは ansi 形式です。) コードは次のとおりです。

-----------------------dll-------------------------- ------------------

#pragma once

#ifndef _WIN32_WINNT        // Allow use of features specific to Windows XP or later.                   
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif                      

//for the getaddrinfo test
#include <WS2tcpip.h>
#pragma comment(lib, "ws2_32")

#include <windows.h>
#include <stdio.h>
#include "mhook.h"

//=========================================================================
// Define _MessageBox so we can dynamically bind to the function
typedef int (WINAPI* _MessageBox) (HWND, LPCTSTR, LPCTSTR, UINT);

//=========================================================================
// Get the current (original) address to the functions to be hooked
//
_MessageBox TrueMessageBox = (_MessageBox)GetProcAddress(GetModuleHandle(L"user32"), "MessageBoxW");


//=========================================================================
// This is the function that will replace MessageBox once the hook
// is in place
MMRESULT WINAPI HookMessageBoxW(HWND hWnd, LPCTSTR  lpText, LPCTSTR  lpCaption, UINT uType){
    printf("***** Call to MessageBox\n");
    lpText = L"hooked MessageBox";
    // Call the original waveInOpen function
    MMRESULT nResult = TrueMessageBox(hWnd, lpText, lpCaption, uType);
    return nResult;
}


///////////////////////////////////////////////////////////////////////////
#pragma comment(linker, "/SECTION:YCIShared,RWS")
#pragma data_seg("YCIShared")
HHOOK g_hHook = NULL;
#pragma data_seg()

HMODULE hInstance = 0;

static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) 
{   printf("=======\n");
    //Mhook_SetHook((PVOID*)&TrueMessageBox, HookMessageBoxW);
    return ::CallNextHookEx(g_hHook, code, wParam, lParam);
}

BOOL WINAPI SetSysHook(BOOL bInstall, DWORD dwThreadId)
{
    BOOL bOk;
    if(bInstall) 
    {
        g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, 
                        hInstance, dwThreadId);
        bOk = (g_hHook != NULL);
    } 
    else 
    {
        bOk = ::UnhookWindowsHookEx(g_hHook);
        g_hHook = NULL;
    }
    return bOk;
}




BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        hInstance = (HINSTANCE) hModule;
        printf("dll loaded!============================\n");
        if(Mhook_SetHook((PVOID*)&TrueMessageBox, HookMessageBoxW)) //hook
            printf("MessageBox Hook Succeeded!\n");
        else
            printf("MessageBox Hook Failed");


        break;
    case DLL_PROCESS_DETACH:
        Mhook_Unhook((PVOID*)&TrueMessageBox);
        break;
    }
    return TRUE;
}

------------------------------- dll の最後 ---------------- ----------------------------- mhookからの自己実装関数Mhook_SetHook()および を呼び出すため、この dll をビルドできません。DLL ファイルの名前はmhook-2.3-dll.dllです。Mhook_Unhook()

------------------------------EXE1------------------- --------------------------------

#pragma once

#ifndef _WIN32_WINNT        // Allow use of features specific to Windows XP or later.                   
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif                      

#include <windows.h>
#include <stdio.h>

#pragma comment(lib, "mhook-2.3-dll.lib")

extern "C"  _declspec(dllimport) BOOL WINAPI SetSysHook(BOOL bInstall, DWORD dwThreadId);

int wmain(int argc, WCHAR* argv[])
{
    //HMODULE hModule = ::LoadLibrary(L"mhook-2.3-dll.dll");
    SetSysHook(TRUE, 0);
    MessageBoxW(NULL, (LPCTSTR)L"MessageBox", NULL, MB_OK);          //hooked
    SetSysHook(FALSE, 0);
    return 0;
}

------------------EXE1の終了--------------- --------------------------

--------------------------------EXE2----------------- ------------------------------- #include #include

int main(){

    MessageBox(NULL, (LPCTSTR)L"MessageBox1", NULL, MB_OK);      //not hooked
    MessageBox(NULL, (LPCTSTR)L"MessageBox2", NULL, MB_OK);      //hooked
    MessageBox(NULL, (LPCTSTR)L"MessageBox3", NULL, MB_OK);      //hooked
    return 0;
}

-------------------------------EXE2終了---------------- --------------------------

4

0 に答える 0