私は最近、回り道とそれに付随するすべてを使ってプログラミングしています。私は多くの異なる機能を迂回しました。thiscall、stdcall、cdecl、仮想関数など。しかし、私が管理していないことが 1 つあります (これは不可能かもしれません)。それは、基本クラスの仮想関数をフックすることです。例えば; 仮想関数 (empty) を宣言する Car クラスがありますDrive
。次に、 car を継承して を実装する他の 3 つの car クラスがありますDrive
。
Car の (基本クラス)Drive
関数を (単純な「jmp」フックを使用して) フックすると、基本関数を呼び出さない場合Car
、の子孫によってトリガーされますか?Drive
さらに徹底的に説明するには:
class Car
{
virtual void Drive(void) { } // Empty virtual function
}
class Lamborghini : public Car
{
void Drive(void) { // does lots of stuff, but does NOT call base function }
}
それで、基本メソッドが呼び出されたのか、それとも何らかの方法でフックできるのか疑問に思っていますか? 関数の実行は直接ジャンプしますか、それとも何らかの方法でクラスLamborghini::Drive
を通過するCar
ので、子孫が呼び出すたびに検出できますDrive
か?
編集:そして、基本クラス関数が空の場合、5 バイトのスペースが必要なので、それをフックすることさえ可能ですか?