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