WindowsAPIをフックしたい場合
//APIフックのテスト
{
//HeapCreate API を失敗させてみる。
SEXYHOOK_API_HOOK_3_BEGIN("kernel32.dll",HANDLE,HeapCreate,HANDLE a1,DWORD a2,SIZE_T a3)
{
return NULL;
}
SEXYHOOK_API_END();
//必ず失敗する.
HANDLE h = HeapCreate(0,0,100);
SEXYHOOK_ASSERT(h == NULL);
}
この例では、 HeapCreate APIをフックし、必ず失敗NULLを返すように書き換えています。
書式は、次のようになります。
SEXYHOOK_API_HOOK_引数の数_BEGIN(インポートDLL名,戻り値,API名,引数....)
{
フックする処理
return 返却したい値;
}
SEXYHOOK_API_END();
インポートDLL名には、APIが定義されているDLL名を書きます。どのAPIがどのDLLに含まれるかは、MSDNなどをご覧ください。
フックのまとめ
//関数
SEXYHOOK_FUNC_HOOK_引数の数_BEGIN(戻り値,呼出規約,関数名,引数....)
{
フックする処理
return 返却したい値;
}
SEXYHOOK_FUNC_END();
//クラスメソッド
SEXYHOOK_CLASS_HOOK_引数の数_BEGIN(戻り値,メソッド名,引数....)
{
フックする処理
return 返却したい値;
}
SEXYHOOK_CLASS_END();
//クラスメソッド(仮想関数)
SEXYHOOK_CLASS_HOOK_引数の数_BEGIN(戻り値,メソッド名,引数....)
{
フックする処理
return 返却したい値;
}
SEXYHOOK_CLASS_END_VCALL(クラスインスタンス);
//WindowsAPI
SEXYHOOK_API_HOOK_引数の数_BEGIN(インポートDLL名,戻り値,API名,引数....)
{
フックする処理
return 返却したい値;
}
SEXYHOOK_API_END();
基本は、これら3つFUNC/CLASS/APIで行います。もっとたくさんのフックパターンが見たい方は、サンプルコード内のmain.cppファイルにテスト兼サンプルソースが載っているので、そちらをご覧ください。
FAQ
Q:リリースビルド(最適化)で動作しません
仕様です。SEXYHOOKはデバッグビルドのみで利用できます。
Q:どこがSEXY?
コードです。興味がある方は近日公開予定の連載第2回をご覧ください。よりセクシーになれます。
まとめ
SEXYHOOKを利用すれば、既存のソースコードに一切手を入れることなく、テスト用の接合部を作成できます。テストをより便利に楽に記述するツールになれれば幸いです。
参考資料
- SEXYHOOK
- Visual C++で使用した場合のLINEマクロのバグ:マイクロソフト サポート オンライン
- 呼出規約 :Wikipedia
- 『レガシーコード改善ガイド』 マイケル・C・フェザーズ著 ウルシステムズ株式会社監訳、株式会社翔泳社、2009年7月
- 『Working Effectively With Legacy Code』Michael Feathers著、Prentice Hall PTR、2004年10月
