ネイキッド関数を使用して、エクスポートされた MFC DLL 関数をフックしました。
ネイキッド関数の定義は次のとおりです。
__declspec(ネイキッド) static void __cdecl GenericHook(void* __this,class CScrollViewAccess* objParam1, class CRect& objParam2,unsigned int iParam1, unsigned long iParam2, char* szParam1, void* vParam1、クラス CFont* objParam3、クラス CFont* objParam4、 クラス CBrush* objParam5) { /*関数本体の開始*/ __asm プッシュアド; /* レジスタの格納にも使用される最初の「引数」 */ __asm プッシュ ecx; /* ebp+8 が最初の「引数」を参照するようにパディング */ /* 標準のプロローグを設定します */ __asm プッシュ ebp; __asm mov ebp、esp; __asm サブ esp、__LOCAL_SIZE; if(flg == false) { //RECT* rct = reinterpret_cast(&objParam2); hInst = LoadLibrary("C:\\Sample.dll"); /// MFC DLL funcPTR = (CMYCLASS_)(((int)hInst)+((int)0x00001032)); funcPTR(__this,objParam2); /* 通常のエピローグ */ __asm mov esp、ebp; __asm pop ebp; __asm pop ecx; /* クリアパディング */ __asm ポップパッド; /* 最初の「引数」をクリア */ __asm jmp [トランポリン]; } /*関数本体終了*/
Mfc dll には次の機能があります。
void CMyClass::returnRect (クラス CRect & objParam) { int 幅 = objParam.Width(); int 高さ = objParam.Height(); CPoint pt = objParam.TopLeft(); ファイル * fp; char szEnter[6] = {13,0,10,0,0,0}; fp = fopen("c:\\LogFolder\\log.txt","ab+"); fprintf(fp,"幅: %d 高さ: %d X 座標: %d Y 座標: %d\n%s",width,height,pt.x,pt.y,szEnter); fclose(fp); }
CRect& パラメータを MFC DLL に渡した後、ログに記録された値が間違っています。
参照オブジェクトを処理するには?