为什么我的绕道代码,崩溃与NOP

Why is my detoured code, crashing with a NOP

本文关键字:崩溃 NOP 代码 我的 为什么      更新时间:2023-10-16

你好,这是我的第一个问题,所以请对我温柔一点。我正在绕道一个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;
}

这是一个处理没有异常,我的日志文件充满了"它的工作",但是,我需要捕获我的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

我不认为它返回一个值?

你怎么知道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;
}