看流星社区

 找回密码
 注册账号
查看: 2783|回复: 2

请问下这样HookCall错在哪里?

[复制链接]

该用户从未签到

发表于 2011-3-23 07:37:07 | 显示全部楼层 |阅读模式
struct  TJmpCode{
        char Jmp;
        DWORD Ptr;
    };
void CDllDialog::OnBtn_Inject()  
{
        void *_TagFuncPtr = (void*)0x004F115C
        void *_NewFuncPtr = (void*) HookCall;//下面Hook的函数     
      TJmpCode      _OrgCode;      // 原代码
    TJmpCode      _NewCode;      // 新代码 jmp FuncPtr
      CopyMemory(&_OrgCode,_TagFuncPtr,5);      // 保存原函数前五字节
    _NewCode.Jmp=0xe9;  //0xe9为机器码的jmp
        _NewCode.Ptr=DWORD(_NewFuncPtr)-DWORD(_TagFuncPtr)-5;// 五字节为jmpNewFuncPtr
        CRITICAL_SECTION _cs;  // 临界区
    EnterCriticalSection(&_cs);
        memcpy(_TagFuncPtr,&_NewCode,5);
        LeaveCriticalSection(&_cs);
}

void HookCall()
{
    __asm
    {
        push eax
        push edi
        push ebx
        mov ebx,[ebp+0x0c]
        mov [ebx],edi
        mov [ebx+0x04],eax
        pop ebx
        mov ebx,0x004F1175  //假设这是你要去的地址
                    jmp ebx
    }  
}

这里是CE里截取的游戏代码
…………                  …………
mov edi,eax                            004F1155
call 00427df1                          004F1157
push eax                                  004F115C
push edi                                  004F115D
lea eax,[ebp-38]    *********这里地址是004F115E*********
push eax                                  004F1161
call dword ptr [00ad2fac]      004F1162
test eax,eax                              004F1168
jne 004f1175                            004F116A
…………                  …………

该用户从未签到

发表于 2011-3-23 07:37:27 | 显示全部楼层
原理是在函数头上JMP到自己的函数地址,比如这个截包的HOOK
DWORD flOldProtected;
            if(VirtualProtect((LPVOID)0x005B3660, 5, PAGE_READWRITE, &flOldProtected))
            {
                *(BYTE*)0x005B3660 = 0xE9;
                *(DWORD*)0x005B3661 = (DWORD)&SendPackPatch - 0x005B3660 - 5;
                VirtualProtect((LPVOID)0x005B3660, 5, flOldProtected, &flOldProtected);
            }

上面是zswking大虾的
只懂点DELPHI
可能楼主想错了
0072D065  |.  8BF1            mov    esi, ecx                  //比如要在这插入代码
0072D067  |.  8B4C24 08        mov    ecx, dword ptr [esp+8]
0072D06B  |.  50              push    eax
0072D06C  |.  51              push    ecx
0072D06D  |.  E8 6EFEFFFF      call    0072CEE0

直接将0072D065  的指令修改成JMP 跳到你自己处理的函数
然后在跳回来



用OD修改后变成
0072D065  |.  8BF1            mov    esi, ecx                  //在这修改的
0072D067  |.  8B4C24 08        mov    ecx, dword ptr [esp+8]


0072D065    /E9 FAFF0F00      jmp    0082D064
0072D06A    |90              nop
0072D06B  |. |50              push    eax
0072D06C  |. |51              push    ecx
0072D06D  |. |E8 6EFEFFFF      call    0072CEE0

0072D065到0072D067
共6个字节  JMP占5个字节所以用 NOP填充
写的时候自己可以多加几个NOP

ASM
PUSHAD
mov    esi, ecx                  
mov    ecx, dword ptr [esp+8]
push    eax
push    ecx
*******************中间可以CALL 自己处理的函数后再返回
jmp $0072D06D  //跳回去执行call    0072CEE0
POPAD
END

该用户从未签到

 楼主| 发表于 2011-3-23 07:37:54 | 显示全部楼层
我想问的是这样        mov ebx,0x004F1175  //假设这是你要去的地址
                                  jmp ebx
这样写会跳到指定内存地址0x004F1175 这里吗?
*(BYTE*)0x005B3660 = 0xE9;
*(DWORD*)0x005B3661 = (DWORD)&SendPackPatch - 0x005B3660 - 5;
这里0xE9是JMP的话,后面是地址,但这个是0x005B3660和SendPackPatch相对的地址吧,那么上面我写的应该不对的.是这样理解的么?
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-26 22:03

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表