关于API HOOK的有关问题

关于API HOOK的问题
为什么我HOOK一个进程的send函数会导致进程自动关闭,比如说酷狗。比如我想截获酷狗进程的数据封包,我把代码写在一个dll里,然后注入到酷狗进程里。注入的办法倒不是关键,我就不发自己写的注入程序了,我随便找一个dll注入器注入的,dll代码如下:
C/C++ code
#include <iostream>
#include <fstream>
using namespace std;
char SendJmp[5]={0};
char MySendJmp[5]={(char)0xe9};
int WINAPI MySend(SOCKET s,const char FAR* buf,int len,int flags);
typedef int (WINAPI *RPsend1)(SOCKET s,const char FAR* buf,int len,int flags);
RPsend Psend=(RPsend)::GetProcAddress(::LoadLibrary(L"ws2_32.dll"),"send");
ofstream SendOut("SendData.txt");
BOOL APIENTRY DllMain(HMODULE d1,DWORD d2,LPVOID d3) 
{  
    DWORD dwJmpAddr=0;
    dwJmpAddr=(DWORD)MySend-(DWORD)Psend-5;
    memcpy(MySendJmp+1,&dwJmpAddr,4);
    ReadProcessMemory((void*)-1,Psend,SendJmp,5,NULL);
    WriteProcessMemory((void*)-1,Psend,MySendJmp,5,NULL);
    return TRUE; 
}
int WINAPI MySend(SOCKET s,const char FAR* buf,int len,int flags)
{
    SendOut<<"Send:"<<buf<<endl;
    WriteProcessMemory((void*)-1,Psend,SendJmp,5,NULL); 
    int S=Psend1(s,buf,len,flags);
    WriteProcessMemory((void*)-1,Psend,MySendJmp,5,NULL);
    return S; 
}

如果改用MessageBoxA函数输出buf的内存,会弹出三个提示框,三个提示框的数据各都不同,但每个提示框都是无限弹出,内容都是一样的,好像MySend函数进入死循环了一样

------解决方案--------------------
你这样HOOK多线程下很容易出问题.

酷狗是多线程的,
我看了下酷狗7有49个线程.
DllMain最好改成这样.
C/C++ code

BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
    if (dwReason == DLL_PROCESS_ATTACH)
    {
        DisableThreadLibraryCalls(hModule);
        DWORD dwJmpAddr=0; dwJmpAddr=(DWORD)MySend-(DWORD)Psend-5; 
        memcpy(MySendJmp+1,&dwJmpAddr,4); 
        ReadProcessMemory((void*)-1,Psend,SendJmp,5,NULL); 
        WriteProcessMemory((void*)-1,Psend,MySendJmp,5,NULL);
    }
    return TRUE;
}

------解决方案--------------------
重复hook了。(DLL_PROCESS_ATTACH)

而且,你这样做,即便对了,也是个巧合。

当调用的时候,因为你用你的jmp代码恢复被hook函数的开始几个字节,然后用完又改写,多线程下肯定会出错。
------解决方案--------------------
和是否内核无关,inline hook可以做得支持多线程
------解决方案--------------------
探讨

引用:
inline hook 你这样很容易出错误的

可我只会这种HOOK,内核的HOOK我不会,内核编程没学过