回 帖 发 新 帖 刷新版面

主题:请高手指点:函数内HOOK

这是一个应用的代码片段:

007 mov  eax, dword ptr [ebp+8]
00A call eax
00C mov  dword ptr [ebp-4], eax
00F mov  eax, dword ptr [edi+C]

在 00A 处的 call 执行完成后,返回值在 eax
我想在00C处拦截 eax 的值,按需要修改 eax,然后返回到 00C 处
继续执行。
我该怎么做,请高手指点,谢谢!!

先说一下我曾这样做过,但是有时程序崩溃了:
保存 00C 开始的7个字节,在00C处写入:
mov eax , ********  (*是我的函数地址)
jmp eax

下面是我的函数:
void HOOK()
{
DWORD gData=0;
    WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )Hook_APIAddress, ( void* )g_dwOldBytes, 7, NULL );
    _asm
    {
        mov gData,eax        
    }    
    if (gData>xFFFF)        {
        gData=0;
    }
    if (gData<=0xFFFF)
    {
        gData=0x8ae;    
    }
    _asm
    {   
        mov eax,gData
    }
    WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )Hook_APIAddress, ( void* )g_btNewBytes, 7, NULL );    
    return;
}

回复列表 (共3个回复)

沙发

晚了,没仔细看,局部、全局变量?

调试一下,单步跟踪,自写的函数一定要跟踪执行一下,遇到使用Win32 API的时候,尽量使用消息窗口判定正确与否。

板凳

我的问题是HOOK后如何跳回去原函数HOOK的位置继续执行原来的代码

3 楼

之前没仔细看,你是高人啊!

修改代码之前,保存好后续代码。call你的函数,别jmp,因为你使用的是C。

要保证修改了eax后返回时,其余寄存器的值都别改变,尤其是堆栈指针,而且控制权交给完整的原程序。你用调试工具跟踪,这很重要。

其实玩转堆栈就能很好返回到原来的地方。(注意保护模式的限制)

对C不是特别熟悉。

我来回复

您尚未登录,请登录后再回复。点此登录或注册