【问题标题】:passing reference object from win32 dll to mfc dll将引用对象从 win32 dll 传递给 mfc dll
【发布时间】: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


【解决方案1】:

我已经解决了这个钩子问题如下:

extern "C" __declspec(naked) __declspec(dllexport) void __stdcall GenericHook() { /*函数体开始*/ /* 设置标准序言 */ __asm 推送 ebp; __asm mov ebp, esp; __asm pushad; // __asm sub esp, __LOCAL_SIZE; // 增加堆栈大小 __asm mov eax,[ebp+4]; //退货地址 __asm mov objParam1,eax; __asm mov eax,DWORD ptr[ebp+8]; //arg1 __asm mov objParam2,eax; __asm mov eax,DWORD ptr[ebp+12]; //arg2 __asm mov objParam3,eax; __asm mov eax,DWORD ptr[ebp+16]; //arg3 __asm mov objParam4,eax; __asm mov eax,DWORD ptr[ebp+20]; //arg4 __asm mov objParam5,eax; /*-------------处理开始----------*/ fp = fopen("c:\\LogFolder\\log.txt","ab+"); fprintf(fp,"arg1: %lu~arg2: %lu~arg3: %lu~arg4: %lu~ar5: %lu\n",objParam1,objParam2,objParam3,objParam4,objParam5); fprintf(fp,"============================================== ==============================\n\n"); fclose(fp); /*-------------处理结束-----------*/ /* 标准尾声 __asm add esp, __LOCAL_SIZE;*/ __asm 流行音乐; __asm mov esp, ebp; __asm pop ebp; __asm jmp [蹦床]; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多