关于API HOOK的有关问题
关于API HOOK的问题
为什么我HOOK一个进程的send函数会导致进程自动关闭,比如说酷狗。比如我想截获酷狗进程的数据封包,我把代码写在一个dll里,然后注入到酷狗进程里。注入的办法倒不是关键,我就不发自己写的注入程序了,我随便找一个dll注入器注入的,dll代码如下:
如果改用MessageBoxA函数输出buf的内存,会弹出三个提示框,三个提示框的数据各都不同,但每个提示框都是无限弹出,内容都是一样的,好像MySend函数进入死循环了一样
------解决方案--------------------
你这样HOOK多线程下很容易出问题.
酷狗是多线程的,
我看了下酷狗7有49个线程.
DllMain最好改成这样.
为什么我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可以做得支持多线程
------解决方案--------------------