Hippomocksのような自由な機能コールを傍受する方法は?
-
02-01-2020 - |
質問
以下のコードに示すように、例えばexit
呼び出し機能を傍受するために何が起こるか疑問に思います。
MockRepository mocks;
mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
. 解決
傍受を行うコードはhippomocks.h
にあります。提供された機能ポインタのアドレスへの書き込みを許可するためにメモリ保護フラグを変更し、その関数の初期バイトの代わりにジャンプ命令を書き込みます。フックが不要になったら、元のバイトは復元されます。これは、例えば、 Microsoft Detours ライブラリによって使用されるのと同じアプローチです。
他のヒント
(この場合は単純な関数ポインタ)に渡された関数をchar *にキャストし、OSに書き込みを許可されるようにして(Windows上のunicesのMPROTECTとVirtualProtectを使用して)最初の5を修正します。無条件のジャンプ指示になるまでに14バイトまで。それは生成された(テンプレートを使用してテンプレートを使用)関数のアドレスをその場所に同じ署名で、効果的に機能を上書きします。
あなたが欲しいならば、あなたがSTACK上でクラスのオブジェクトを正しい引数でreplaceのオブジェクトを直接再利用することができます。コードをコピーすることもできます(32/64ビットx86、ARM、Thumbの両方がサポートされています)。それは200行目の周りにあり、それで比較的高いです。 horrible_castクラスと未保護クラスをコピーする必要があります。まず、メンバー関数ポインタを他のタイプ(REINTERPRETRET_CASTで不可能)をキャストし、2番目のタイプがOS固有の保護解除(および再設定)コールをラップします。
C ++ 11のコードをクリーンアップする際には、このサブセットも正確に抽出されているため、詳細/ replace.hファイルを使用してこれを行うコードだけを取得できます。直接リンクの場合は、 https://github.com / dascandy/hippomocks/blob/cpp11/hippomocks/detail/replace.h