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 プッシュアド; /* レジスタの格納にも使用される最初の「引数」 */
    __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 に渡した後、ログに記録された値が間違っています。

参照オブジェクトを処理するには?

4

1 に答える 1

0

このフックの問題を次のように解決しました。

    extern "C" __declspec(naked) __declspec(dllexport) void __stdcall GenericHook()
    { /*関数本体の開始*/
        /* 標準のプロローグを設定します */
        __asm プッシュ ebp;
        __asm mov ebp、esp;
        __asm プッシュアド;

       // __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 に答える