1

こんにちは、これは私の最初の質問ですので、優しく扱ってください。MS迂回とVisual Studio 2005を使用して、exeを迂回していますが、dllが読み込まれ、フックが処理されますが、フックコードを拡張しようとすると、問題が発生します。すべてがクラッシュし、メッセージボックスの連絡先サポートをポップアップするexeファイルで例外が発生すると思います。

typedef void (__stdcall* GenterateStrings)(int,int,int);

GenterateStrings Real_GenterateStrings = (GenterateStrings)(0x06EDFA0);

extern "C" { static void __stdcall myGenterateStrings(int,int,int); }

void __stdcall myGenterateStrings(int a1, int a2, int a3) 
{   
    myLogMessage(L"its working");
    Real_GenterateStrings( a1,  a2,  a3);
    return;
}

これは例外なく動作し、ログファイルは「動作中」でいっぱいになりますが、Real_GenterateStrings()呼び出しの後にEAXをキャプチャする必要があります。これには、Unicode文字列へのポインタが含まれているためです。

しかし、Real_GenterateStrings呼び出しの後にコードを配置すると、フックされるとすぐにクラッシュが発生します。ただのNOPでも

void __stdcall PokerAdvisorGenterateStrings(int a1, int a2, int a3) 
{   
    myLogMessage(L"its working");
    Real_GenterateStrings( a1,  a2,  a3);
    __asm   
    {
        nop
    }   
    return;
}

何か案は?

私がフックしている機能は

mov     eax, [rsp+0Ch]
mov     ecx, [rsp+8]
mov     edx, cs:113650Ah
push    rax
mov     eax, [rsp+8]
push    rcx
push    rdx
push    0A3CA2Ch
push    rax
call      near ptr unk_6AB8E0
add     esp, 14h
retn

私はそれが値を返すとは思わないのですか?

4

1 に答える 1

2

何かがあることをどうやって知っていますかeax

一般に、迂回クラッシュは、不正確な呼び出し規約やプロトタイプが原因であることがよくあります。迂回関数がvoid*などを返すのではないかと思います。次のように、戻り値を取得して、完了したら呼び出し元に渡す必要があります。

typedef void* (__stdcall* GenterateStrings)(int,int,int);

GenterateStrings Real_GenterateStrings = (GenterateStrings)(0x06EDFA0);

extern "C" { static void __stdcall myGenterateStrings(int,int,int); }

void* __stdcall myGenterateStrings(int a1, int a2, int a3) 
{   
    myLogMessage(L"its working");
    void* ret = Real_GenterateStrings( a1,  a2,  a3);
    __asm   
    {
        nop
    }   

    return ret;
}
于 2011-09-07T16:40:29.863 に答える