今天在使用一个HOOK 库来HOOK send 函数 发现 虽然HOOK 成功了 但是 尼玛 发送不出去数据包 返回 10035 错误。。
各种 debug 无解 但是百度了下 还真没几个人遇到这个问题 说明 这个应该是 HOOK 库的问题了。。一些HOOk lib 虽然HOOk了 但是最后 寄存器的值都被改写了。。。导致最后API执行异常。。。
于是自己写了个 尼玛正常了。。。我去。
感觉HOOK 库 微软的 detour 做的还是很好的。。基本避免了这个问题。。。
哥写的测试代码
// Hook_test.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include#include int (__stdcall *pf_send)( __in SOCKET s, __in_bcount(len) const char FAR * buf, __in int len, __in int flags );int __stdcall my_send( __in SOCKET s, __in_bcount(len) const char FAR * buf, __in int len, __in int flags ){ printf("send:%d %d bytes %d\n",s,len,flags); return 0;}int __declspec(naked) __stdcall detour_send( __in SOCKET s, __in_bcount(len) const char FAR * buf, __in int len, __in int flags ){ __asm { pushad pushfd push [esp+0x34] //0x24 + 4 * 4 push [esp+0x34] push [esp+0x34] push [esp+0x34] call my_send popfd popad mov edi,edi push ebp mov ebp,esp mov eax,pf_send add eax,5 jmp eax }}int _tmain(int argc, _TCHAR* argv[]){ DWORD old_protect; DWORD jmp_addr; pf_send = (int (__stdcall *)(SOCKET,const char *,int,int))GetProcAddress(LoadLibraryW(L"ws2_32.dll"),"send"); VirtualProtect(pf_send,10,PAGE_EXECUTE_READWRITE,&old_protect); __asm { mov eax,offset detour_send sub eax,pf_send sub eax,5 mov jmp_addr,eax } printf("%x",jmp_addr); __asm { mov eax,pf_send mov [eax],0xE9 inc eax mov ebx,jmp_addr mov [eax],ebx } pf_send(222,NULL,22,22); return 0;}