嗨,这是我的第一个问题,所以请轻轻地对待我。我正在绕过一个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调用之后放入任何代码,只要它挂起就会导致崩溃。即使只是一个小鸟
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
我认为它不会返回值?
答案 0 :(得分:2)
你怎么知道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;
}