SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

「SEXYHOOK」 とある関数の接合部

SEXYHOOKで始めるテスト
とある関数の接合部(1)

既存のソースコードに手を加えず、自由に接合部を作成

ダウンロード sexyhook0.8 (80.0 KB)

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」 とある関数の接合部連載記事一覧
この記事の著者

rti(あーるてぃーあい)

働いたら負けだと思っていた元ニートのプログラマ歌って踊れてさくらたんにもハァハァできます。love:C++,アセンブラ,PHP,javascript好きのOO厨房低レイヤープログラムやネットワークサーバからサーバサイドプログラム、ソフトウェア設計、インフラ設計運用までと幅広くやってます。多分設計信者。 あんまり得意ではないけど 人工知能(学習エンジン)とかシステム...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4882 2010/02/23 13:15

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー