1

嗨,这是我的第一个问题,所以请温柔对待我。我正在绕行一个 exe,使用 MS detours 和 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;
}

这有效,没有例外,我的日志文件充满了“它的工作”,但是,我需要在我的 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

一般来说,detour 崩溃通常是由于不准确的调用约定和/或原型造成的。我怀疑迂回的函数返回一个 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 回答