回り道を介して C++ メンバー メソッドをフックしました。
メソッドの宣言は、IDA のシンボル ファイル (*.pdb) から取得されます。
LPVOID __thiscall Foo(class UnknownClass, unsigned int, int)
以下は、実際の方法を置き換える私の方法です
// the first parameter of the method is an unknown class to me
// I don't know its implementation, don't know its size
// so I just declare a dummy class with a enough size
class UnknownClass { public: CHAR dummy[1024]; };
typedef LPVOID (__thiscall MyDummyClass::*PFN_Foo)( UnknownClass, unsigned int, int );
class MyDummyClass
{
public:
// The address of the real method
PFN_Foo m_pfnFoo;
// My method to replace the real one
LPVOID MyFoo( UnknownClass p1, unsigned int p2, int p3)
{
MyDummyClass * pThis = (MyDummyClass*)this;
// call the real one.
// and here the error happens
return (pThis->*m_pfnFoo)( p1, p2, p3 );
}
};
フックが機能しMyFoo
、実際のメソッドの代わりに呼び出されます。しかし、実際のメソッドを呼び出すとエラーが発生します:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
何か提案はありますか?パラメータの 1 つがオブジェクトとして渡されたときにこの種のフックを処理する方法ですが、その実装は私にはわかりません。