| 169 | |
| 170 | |
| 171 | == とある関数の接合部 (スィーム) == |
| 172 | |
| 173 | sexyhook2 の使い方と実装について |
| 174 | |
| 175 | === イントロダクション === |
| 176 | |
| 177 | * テストを書いていると一時的に関数の挙動を書き換えたいことがある。 |
| 178 | * ex) システム時刻に依存して true しか返さないような関数が false を返す所を見たい。 |
| 179 | * → sexyhook を使えば、一時的に API や関数を置き換えることができる! |
| 180 | |
| 181 | === 使い方 === |
| 182 | |
| 183 | * http://code.google.com/p/sexyhook/ |
| 184 | * VS, gcc 対応 |
| 185 | * デバッグビルドのみ対象 |
| 186 | * さまざまなフック |
| 187 | * 関数 |
| 188 | {{{ |
| 189 | { |
| 190 | SEXYHOOK_BEGIN(time_t, SEXY_HOOK_CDECL, &time, (time_t * a) ) |
| 191 | { |
| 192 | return /* なんか別な値 */; |
| 193 | } |
| 194 | |
| 195 | /* フックした time を使う処理 */ |
| 196 | } |
| 197 | SEXYHOOK_END(); |
| 198 | /* ブロックを抜ければフックは無効 */ |
| 199 | }}} |
| 200 | * クラスメソッド |
| 201 | * &クラス名::メソッド名 |
| 202 | * 仮想関数はちょっと特殊: SEXYHOOK_END に this を渡す必要がある |
| 203 | * Win32 API |
| 204 | * SEXY_HOOK_STDCALL を使う |
| 205 | * フック中に this を使う |
| 206 | {{{ |
| 207 | SEXYHOOK_THIS(MyClass)->hoge(); |
| 208 | }}} |
| 209 | * |
| 210 | |
| 211 | === 実装方法 === |
| 212 | |
| 213 | * マクロ展開してるよ! |
| 214 | * なんかクラス内クラスができるよ。 |
| 215 | * アセンブリいじってるよ! |
| 216 | * スタック積む代わりに jmp ねじ込んでるよ!! |
| 217 | * 差し替える関数ってどうやって呼んでるの? |
| 218 | * 実体を見つけるのが結構大変だったよ!! とくに仮想関数…。 |
| 219 | * API フック |
| 220 | * DLL を読み込んだプログラム領域を直接書き換えちゃうよ! |
| 221 | * ↑大丈夫なの?? |
| 222 | * 見た感じ大丈夫っぽい |
| 223 | * NT カーネルに詳しい方いらっさいますか? w |
| 224 | |
| 225 | === 未来のセクシー === |
| 226 | |
| 227 | * private メソッドへの対応 |
| 228 | * Win32 は dbgutil がつかえる! |
| 229 | * でも何故か VS2010 で動かない… |
| 230 | * C++ でリフレクションができるかも… |
| 231 | |
| 232 | === 質疑応答 === |
| 233 | |
| 234 | * 多重継承は大丈夫? |
| 235 | * ダイヤモンド継承は無理。 |
| 236 | * 単に多重しているだけなら…多分…大丈夫…じゃないかな。 |
| 237 | * デバッグ&コンティニューは |
| 238 | * 想定外 |
| 239 | * 64 bits にも対応して~ |
| 240 | * マルチスレッド |
| 241 | * クラス内クラスだから多分大丈夫… |
| 242 | * #define private public じゃ駄目なの? |
| 243 | * ちょwwww |