Почему мой обходной код, сбой с NOP - PullRequest
1 голос
/ 07 сентября 2011

Привет, это мой первый вопрос, поэтому, пожалуйста, относитесь ко мне осторожно. Я в обход exe, использую обходы MS и Visual Studio 2005, моя 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;
}

Это работает без каких-либо исключений, и мой файл журнала заполняется "его работой", однако мне нужно перехватить EAX после моего вызова Real_GenterateStrings (), так как он содержит указатель на строку 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

Не думаю, что он возвращает значение?

1 Ответ

2 голосов
/ 07 сентября 2011

Откуда вы знаете, что что-то есть в eax?

В общем, сбой в обходе часто происходит из-за неточного соглашения о вызовах и / или прототипа. Я подозреваю, что функция detoured возвращает 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;
}
...