Hookライブラリ「Detours」の使い方

目次

  1. 1. はじめに
  2. 2. 前提
  3. 3. プロジェクトの作成
  4. 4. インクルードディレクトリとライブラリディレクトリの設定
  5. 5. テストプログラムの入力と実行
  6. 6. おわりに

はじめに

前回「Detours」のインストールとビルド方法について書きました。

Hookライブラリ「Detours」のインストールとビルド方法

https://gazee.net/develop/detours-winapi-hook-library-install/

今回はその続きで、実際に使用する方法を書いていきたいと思います。

前提

プロジェクトの作成

VisualStudioを起動してプロジェクトを作成します。メニューのファイルからプロジェクト(P)を選択します。

プロジェクトの作成

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

プロジェクトの設定

ウィザードが表示されるので、最初のページは次へ >を押します。次のページでは、追加のオプションを以下のように設定します。

  • 空のプロジェクト (チェックを入れる)
  • Security Development Lifecycle (SDL) チェック (チェックを外す)

最後に完了ボタンを押すと、プロジェクトが作成されます。

インクルードディレクトリとライブラリディレクトリの設定

includeの追加

ソリューションエクスプローラのプロジェクト名の部分を右クリックし、プロパティを選択します。開いたウインドウの左側のペインからVC++ ディレクトリを選択し、インクルードディレクトリを選択し、編集をクリックします。

新規ボタンを押して、Detoursをインストールしたフォルダのincludeフォルダを指定します。

libの追加

今度は、ライブラリ ディレクトリを選択し、編集をクリックします。

新規ボタンを押して、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を注入してあげれば、任意の関数呼び出しを書き換えることができます。その方法については、機会があれば紹介したいと思います。