首页
社区
课程
招聘
[求助]逆向调试新手,这个内联HOOK函数怎么写
发表于: 2012-10-16 16:04 5064

[求助]逆向调试新手,这个内联HOOK函数怎么写

2012-10-16 16:04
5064
我要在632024a6出进行hook,执行我的MyCconnect函数
__declspec(naked) WINAPI void __stdcall MyWSAConnect()这个函数怎么写.
我写的有问题,请问如何修改

int WINAPI DoConnect(SOCKET s, const struct sockaddr FAR * name, int namelen)
{

}

__declspec(naked)  void __stdcall MyWSAConnect()
{
        __asm
        {
                MOV  EAX, ESP
                PUSHAD
                PUSH        10                                                                //len
                PUSH        DWORD PTR[EAX+0x8]                                //sockaddr
                PUSH        DWORD PTR[EAX+0x4]                                //socket
                CALL        DoConnect
                POPAD

                jmp g_dwWSAConnectAddr+5;
        }
}

void        HookWSAConnect()
{
        BYTE byJmpStr[5] = {0xE9};
        DWORD dwJmpAddr = (DWORD)MyWSAConnect - g_dwWSAConnectAddr - 5;
        memcpy(byJmpStr+1, &dwJmpAddr, 4);
       
        DWORD dwOldProtect = 0;
        ::VirtualProtect((void*)g_dwWSAConnectAddr, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect);
        ::WriteProcessMemory(::GetCurrentProcess(), (void*)g_dwWSAConnectAddr, byJmpStr, 5, NULL);
        ::VirtualProtect((void*)g_dwWSAConnectAddr, 5, dwOldProtect, &dwOldProtect);
}

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1392
活跃值: (4872)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
2
明显你这样做修改了EAX的值,可能EAX是有用的数据,也许是这里的问题。

PUSH EBP
MOV EBP,ESP
pushad
PUSH  10                //len
PUSH  DWORD PTR[EAX+0xc]        //sockaddr
PUSH  DWORD PTR[EAX+0x8]        //socket
CALL  DoConnect
POPAD
mov esp,ebp
POP EBP
JMP XXXX
这样试试

然后。你可以采用 Push xxxx ret占六个字节,
2012-10-16 16:56
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
<1> 少了一条指令test eax,eax
<2> 函数返回值eax被popad覆盖了
2012-10-16 19:15
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
怎么写eax不被覆盖呢
2012-10-17 08:54
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
5
int __stdcall MyWSAConnect(SOCKET s, const struct sockaddr FAR * name, int namelen)
{
     ....................
}
2012-10-17 10:59
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
把pushad分成6行写,popad也分成6行
2012-10-17 16:44
0
雪    币: 14
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
在popad前面加入
mov [esp + offset_of_eax], eax
popad
偏移自己算
----------------------------
其实修改的是call指令,调用过程寄存器也会改变,没必要保存寄存器,除非有特定的数据保存的某些寄存器里面。
2012-10-17 17:43
0
游客
登录 | 注册 方可回帖
返回
//