0

x86 実行可能ファイルから関数をフックしたい。これは、IDA の hex-rays プラグインで逆コンパイルされた関数プロトタイプです。

int __userpurge sub_43CE70<eax>(int a1<eax>, int a2, char a3, int a4, int a5, int a6)

そのため、関数は最初のパラメーターとして eax を受け入れ、同じレジスターに戻ります。

ラッパーとして次の関数を試しました:

int the_wrapper(int a2, unsigned a3, int a4, int a5, int a6)
{
    int a1;
    _asm
    {
        mov [a1], eax
    };
    char bString[50];
    sprintf(bString,"a1: %u, a2: %u, a3: %d, a4: %d, a5: %d, a6: %d",a1,a2,a3,a4,a5,a6);
    logs(bString);
    int rtn;
    _asm{
        push a6
        push a5
        push a4
        push a3
        push a2
        mov eax, [a1]
        call the_function
        mov [rtn], eax
    };
    return rtn;
}

何らかの理由で機能せず、関数が呼び出されるたびにクラッシュしました。

4

1 に答える 1

0

ラップしようとしている関数と同じ呼び出し規約でラッパーを宣言する必要があります。

規則 (最も一般的なのはcdeclandstdcallですが、ラップされたコードのコンパイラにも依存します) に応じて、スタックを消去するのは呼び出し元または呼び出し先のいずれかです。正しい規則を使用しないと、スタックの破損やクラッシュが発生しやすくなります。

于 2013-05-10T11:12:41.323 に答える