私は少しリバース エンジニアリングを行っています。プログラムがあり、その上にグローバルに定義されたクラス ポインターがあります。
#include <includesandsuch.h>
myclass* g_Class = NULL;
int WinMain( ... )
{
g_Class = new myclass(0);
}
私のクラスには、dllから呼び出したいメソッドがあります。機能する関数プロトタイプを試しました__thiscall
が、クラスthis
は0になり、メソッドがクラスメンバーデータに書き込むため、プログラムがクラッシュします。今、私はうまくいく解決策を思いつきました。これをSSCEまたはこの場合はSLCEと考えてください。
DWORD* g_Input = 0;
void* operator new(size_t sz)
{
cout << "mynew" << endl; //yes i'm using (using namespace std;) but please focus on the issue
g_Input = (DWORD*)::new char [sz];
return g_Input;
}
void *operator new [](size_t size)
{
// if (size > MAX_SIZE) ...
cout << "mynew" << endl;
return malloc(size);
}
class ZInput
{
public:
ZInput( int n );
~ZInput(){};
void CallMe( int n, DWORD b );
private:
int m_nData;
};
ZInput::ZInput( int n ){
m_nData = n;
}
void ZInput::CallMe( int n, DWORD b ) {
cout << n <<" "<< b << endl;
}
void Fake_RealSpace2_Input( int n, DWORD b )
{
__asm
{
mov ecx, g_Input
mov eax, 0x012C7310 //example address of ZInput::CallMe
push n
push b
call eax
}
}
int _tmain(int argc, _TCHAR* argv[])
{
ZInput* pInput = new ZInput(2);
cout << pInput << endl;
cout << g_Input << endl;
Fake_RealSpace2_Input(4,5 );
delete pInput;
return 0;
}
ZInput::CallMe
このようにして、有効なZInput
クラス オブジェクトを正常に呼び出すことができます。
今私の問題は、このコードを DLL に移植し、そこから呼び出すことです (クラスZInputZInput::CallMe
はメイン アプリケーションにあり、dll から呼び出したい)。(CallMe
のアドレスはメイン アプリケーション上にあり、メイン アプリケーション上ではg_Class ポインタはヒープに割り当てられたオブジェクトを指します)、問題は明らかな理由で dll から operator new をオーバーロードできないことです。メインアプリケーションで使用する唯一のデータ型であると仮定すると、どのようにしてdllから指すアドレスを見つけることができますか?g_Class
g_Class
WinMain
new
g_Class
new
g_Class