0

我已经使用裸函数挂钩了一个导出的 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 后,记录的值是错误的。

如何处理参考对象?

4

1 回答 1

0

我已经解决了这个挂钩问题,如下所示:

    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 [蹦床];   
    }

于 2012-09-04T08:10:34.560 回答