【发布时间】:2012-08-25 06:52:28
【问题描述】:
我已经使用裸函数挂钩了一个导出的 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 后,记录的值是错误的。
如何处理引用对象?
【问题讨论】:
-
CMYCLASS_(我想它是指向函数的指针)是如何定义的? -
是的,它是一个函数指针
-
returnRect的调用类型是什么?如果是 __thiscall,则 this 传入 ecx 而不是栈上。
-
@TheSteve:正确,调用约定是 __stdcall。
-
是否可以使用调试器并在returnRect中设置断点。我可能还建议使用 ollydbg 逐步执行生成的汇编代码。作为记录,传递一个 CRect & 和一个 CRect* 在汇编级别应该是相同的。
标签: winapi visual-c++ mfc hook