c++ - 为什么我绕行的代码会因 NOP 而崩溃

标签 c++ assembly crash hook detours

嗨,这是我的第一个问题,所以请温和地对待我。我正在使用 MS detours 和 Visual Studio 2005 绕过一个 exe,我的 dll 被加载并且我的钩子(Hook)工作正常但是当我尝试扩展我的钩子(Hook)代码时有些东西是出了问题,整个事情崩溃了,我认为它在弹出消息框联系支持的 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;
}

这没有异常(exception),我的日志文件充满了“它的工作”,但是,我需要在我的 Real_GenterateStrings() 调用之后捕获 EAX,因为它包含一个指向 unicode 字符串的指针。

但是如果我在 Real_GenterateStrings 调用之后放置任何代码,就会在它被钩住时立即导致崩溃。哪怕只是打个盹

void __stdcall PokerAdvisorGenterateStrings(int a1, int a2, int a3) 
{   
    myLogMessage(L"its working");
    Real_GenterateStrings( a1,  a2,  a3);
    __asm   
    {
        nop
    }   
    return;
}

有什么想法吗?

我 Hook 的函数是

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 里有东西?

一般来说,绕行崩溃通常是由于调用约定和/或原型(prototype)不准确造成的。我怀疑绕行函数返回 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;
}

关于c++ - 为什么我绕行的代码会因 NOP 而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7337357/

相关文章:

c++ - 双斜杠//在路径中 - 我可以使用单斜杠吗?

assembly - 如何在不污染缓存的情况下从内存加载值?

c++ - 词法分析器不断跳过最终标记

c++ - 在 C++ 代码中使用 new/delete 而不是 malloc/free 时崩溃

c++ - 不是从 .begin()ing 迭代一个 STL 容器并环绕

c++ - 如何避免定义与 boost::spirit::lex 中的所有内容匹配的 token

c++ - 保护可执行文件免受逆向工程?

iphone - Phonegap 1.2在iPhone 3G iOS 3.x上不起作用

vba - Excel 2016 锁定了在早期版本的 Excel 中工作的 VBA 函数

c++ - 为什么 C++ 支持带实现的纯虚函数?