위에 있는 링크로 가면 [그림 1-1]와 같은 메뉴를 볼 수 있는데, Download Source (v1.3.3)을 받는다.
[그림 1-2]
[그림 1-3]
파일을 받고, 압축을 푼 후, ...\build\VC14 디렉토리에 가서 MinHookVC14.sln을 실행한다. 실행하면 libMinHook, MinHook 프로젝트가 있다. libMinHook 프로젝트를 선택하고 [그림 1-2]처럼 자신이 원하는 것으로바꾼다. 위에 경우에는 Release, x64로 선택했다. [그림 1-3]을 보면 상단에 구성과 플랫폼이 있는데, 자신이 선택한 것으로 바꾼다. 왼쪽에 있는 libMinHook 프로젝트를 우클릭해서 속성 메뉴로 들어가고 [그림 1-3]처럼 런타임 라이브러리 설정을 바꾼다. 그 후 libMinHook 프로젝트를 우클릭하고 빌드한다. 그러면 출력창에 ..\libMinHook.x64.lib 파일이 생성됐다고 나올 것이다.
압축을 푼 디렉토리에 가면 ...\include 디렉토리가 있는데, 이 곳에 MinHook.h이란 헤더파일이 있을 것이다. 위에서 만든 lib 파일과 이 헤더파일을 자신이 원하는 디렉토리에 옮긴다.
만약 이 lib 파일과 같이 빌드할 프로젝트가 Debug로 빌드하면 런타임 라이브러리 설정은 크게 상관 없지만, 만약 Release로 빌드하려면 lib 파일과 프로젝트의 런타임 라이브러리를 맞춰야한다. 런타임 라이브러리에 대해 좀 더 자세히 보고 싶으면 다음 링크를 따라간다.
프로젝트를 우클릭한 후에 속성으로 들어가면 [그림 2-2]와 같이 나온다. 위에 구성과 플랫폼이 있는데 꼭 lib를 빌드했던과 똑같이 환경을 바꿔야한다. 예를 들어 lib를 빌드했을 때 Release, x64로 빌드했으면 똑같이 이곳에도 맞춰줘야 한다. 이 곳에서 수정해야할 것은 포함 디렉터리, 라이브러리 디렉터리이다. 위에서 빌드했던 lib파일과 헤더파일을 자신이 원하는 곳에 두고, 포함 디렉토리에 헤더파일이 있는 디렉토리를 추가하고, 라이브러리 디렉토리는 lib가 있는 디렉토리를 추가한다.
#include <Windows.h>
#include "MinHook.h"
#if defined _M_X64
#pragma comment(lib, "libMinHook.x64.lib")
#elif defined _M_IX86
#pragma comment(lib, "libMinHook.x86.lib")
#endif
template <typename T>
inline MH_STATUS MH_CreateHookEx(LPVOID pTarget, LPVOID pDetour, T** ppOriginal)
{
return MH_CreateHook(pTarget, pDetour, reinterpret_cast<LPVOID*>(ppOriginal));
}
template <typename T>
inline MH_STATUS MH_CreateHookApiEx(
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, T** ppOriginal)
{
return MH_CreateHookApi(
pszModule, pszProcName, pDetour, reinterpret_cast<LPVOID*>(ppOriginal));
}
typedef int (WINAPI *MESSAGEBOXW)(HWND, LPCWSTR, LPCWSTR, UINT);
// Pointer for calling original MessageBoxW.
MESSAGEBOXW fpMessageBoxW = NULL;
// Detour function which overrides MessageBoxW.
int WINAPI DetourMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
return fpMessageBoxW(hWnd, L"Hooked!", lpCaption, uType);
}
int main()
{
// Initialize MinHook.
if (MH_Initialize() != MH_OK)
{
return 1;
}
// Create a hook for MessageBoxW, in disabled state.
if (MH_CreateHookApiEx(L"user32", "MessageBoxW", &DetourMessageBoxW, &fpMessageBoxW) != MH_OK)
{
return 1;
}
// Enable the hook for MessageBoxW.
if (MH_EnableHook(&MessageBoxW) != MH_OK)
{
return 1;
}
// Expected to tell "Hooked!".
MessageBoxW(NULL, L"Not hooked...", L"MinHook Sample", MB_OK);
// Disable the hook for MessageBoxW.
if (MH_DisableHook(&MessageBoxW) != MH_OK)
{
return 1;
}
// Expected to tell "Not hooked...".
MessageBoxW(NULL, L"Not hooked...", L"MinHook Sample", MB_OK);
// Uninitialize MinHook.
if (MH_Uninitialize() != MH_OK)
{
return 1;
}
return 0;
}
위에 있는 소스를 복사하고 소스파일 폴더에 cpp파일을 생성한 후 붙여넣고 실행한다.
5번째줄과 7번째줄에 있는 파일이름은 위에서 만든 lib 파일 이름과 같아야한다.
64비트로 빌드하려면 5번째줄을 32비트로 빌드하려면 7번째 줄을 수정하면 된다.
[그림 2-3]
빌드에 이상없이 실행 됐으면 [그림 2-3]과 같은 화면이 뜰 것이다. 처음엔 Hooked! 메시지 박스가 뜨고 두번째는 Not hooked...라는 메시지 박스가 뜬다. 다음은 어떻게 원하는 함수를 후킹하는지 알아본다.