はじめに
前回「Detours」のインストールとビルド方法について書きました。
Hookライブラリ「Detours」のインストールとビルド方法
https://gazee.net/develop/detours-winapi-hook-library-install/
今回はその続きで、実際に使用する方法を書いていきたいと思います。
前提
- Windows 10
- Microsoft Visual Studio 2015 Community
- x86
プロジェクトの作成
VisualStudioを起動してプロジェクトを作成します。メニューのファイルからプロジェクト(P)を選択します。

新しいプロジェクトというウインドウが開くので、左側のペインからVisual C++を選び、右側のペインからWin32 コンソール アプリケーションを選択して、OKボタンを押します。

ウィザードが表示されるので、最初のページは次へ >を押します。次のページでは、追加のオプションを以下のように設定します。
-
空のプロジェクト(チェックを入れる) -
Security Development Lifecycle (SDL) チェック(チェックを外す)
最後に完了ボタンを押すと、プロジェクトが作成されます。
インクルードディレクトリとライブラリディレクトリの設定

ソリューションエクスプローラのプロジェクト名の部分を右クリックし、プロパティを選択します。開いたウインドウの左側のペインからVC++ ディレクトリを選択し、インクルードディレクトリを選択し、編集をクリックします。
新規ボタンを押して、Detoursをインストールしたフォルダのincludeフォルダを指定します。

今度は、ライブラリ ディレクトリを選択し、編集をクリックします。
新規ボタンを押して、Detoursをインストールしたフォルダのlib.X86フォルダを指定します。
最後にOKボタンをクリックすれば完了です。
テストプログラムの入力と実行
以下のプログラムを入力します。
#include <Windows.h>
#include <detours.h>
#pragma comment(lib, "detours.lib")
using Type = decltype(::MessageBoxA);
Type* PureMessageBoxA = &::MessageBoxA;
int WINAPI HookMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
return PureMessageBoxA(hWnd, "Hooked!!", lpCaption, uType);
}
void main()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)PureMessageBoxA, HookMessageBoxA);
if (DetourTransactionCommit() == NO_ERROR)
OutputDebugStringA("MessageBoxA() detoured successfully");
::MessageBoxA(0, "test", "title", MB_OK);
return;
}
メニューのローカル Windows デバッガーをクリックするとプログラムが実行されます。画面上にHooked!!というメッセージボックスが表示されれば成功です。
おわりに
以上でDetoursを利用する環境が整いました。後は、DLLInjectionなどで対象のプログラムにDLLを注入してあげれば、任意の関数呼び出しを書き換えることができます。その方法については、機会があれば紹介したいと思います。
