我已经使用裸函数挂钩了一个导出的 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 pushad; /* 第一个“参数”,也用于存储寄存器 */ __asm 推送 ecx;/* 填充以便 ebp+8 引用第一个“参数” */ /* 设置标准序言 */ __asm 推送 ebp; __asm mov ebp, esp; __asm sub esp, __LOCAL_SIZE; 如果(flg == 假) { //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具有以下功能:
无效 CMyClass::returnRect(类 CRect& objParam) { int 宽度 = objParam.Width(); int 高度 = objParam.Height(); CPoint pt = objParam.TopLeft(); 文件* fp; 字符 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 后,记录的值是错误的。
如何处理参考对象?