Перехват функции _userpurge С++

Я хочу подключить функцию из исполняемого файла x86. Это прототип функции, декомпилированный плагином hex-rays для IDA:

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;
}

по какой-то причине он не работает и вылетает каждый раз при вызове функции.


person user2367563    schedule 09.05.2013    source источник


Ответы (1)


Вам необходимо объявить оболочку с тем же соглашением о вызовах, что и функция, которую вы пытаетесь обернуть.

В зависимости от соглашения (наиболее распространенными являются cdecl и stdcall, но это также зависит от компилятора обернутого кода) либо вызывающий, либо вызываемый объект очищает стек. Если вы не используете правильное соглашение, вы подвержены повреждению стека и сбою.

person Seki    schedule 10.05.2013