我想用钩子截取某一程序的socket的recv和send函数,但是却没反应,不知道问题出在什么地方。
请高手指点一下,主要代码如下:
////////////////////////////////////////////////
//取得当前窗口的句柄
CWnd* pWnd=CWnd::GetActiveWindow();
HWND hwndCurr=pWnd->GetSafeHwnd();
DWORD Pid;
//CString str;
//Pid=::GetWindowThreadProcessId(hwndCurr,NULL);
::GetWindowThreadProcessId(hwndCurr,&Pid);
//str.Format("%d",Pid);
//AfxMessageBox(str);
////////////////////////////////////////////////
//启动消息钩子
hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,Pid); //设置消息钩子
/////////////////////////////////////////////////
//GetProcAddress(GetModuleHandle("GDI32.dll"),"ExtTextOutA"):取得要钩的函数在所在dll中的地址
//截取socket
HookAllAPI("Wsock32.dll",GetProcAddress(GetModuleHandle("Wsock32.dll"),
"recv"),(PROC)&recv1,NULL);
////////////////////////////////////////////////
.......BOOL WINAPI recv1(SOCKET s, char FAR *buf, int len, int flags)
{
//MessageBox(NULL,"TextOutW","APIHook_Dll ---rivershan",MB_OK);
MessageBox(NULL,"len","Hook",MB_OK);
recv(s,buf,len,flags); //返回原来的函数
return TRUE;
}
请高手指点一下,主要代码如下:
////////////////////////////////////////////////
//取得当前窗口的句柄
CWnd* pWnd=CWnd::GetActiveWindow();
HWND hwndCurr=pWnd->GetSafeHwnd();
DWORD Pid;
//CString str;
//Pid=::GetWindowThreadProcessId(hwndCurr,NULL);
::GetWindowThreadProcessId(hwndCurr,&Pid);
//str.Format("%d",Pid);
//AfxMessageBox(str);
////////////////////////////////////////////////
//启动消息钩子
hHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,Pid); //设置消息钩子
/////////////////////////////////////////////////
//GetProcAddress(GetModuleHandle("GDI32.dll"),"ExtTextOutA"):取得要钩的函数在所在dll中的地址
//截取socket
HookAllAPI("Wsock32.dll",GetProcAddress(GetModuleHandle("Wsock32.dll"),
"recv"),(PROC)&recv1,NULL);
////////////////////////////////////////////////
.......BOOL WINAPI recv1(SOCKET s, char FAR *buf, int len, int flags)
{
//MessageBox(NULL,"TextOutW","APIHook_Dll ---rivershan",MB_OK);
MessageBox(NULL,"len","Hook",MB_OK);
recv(s,buf,len,flags); //返回原来的函数
return TRUE;
}
PROC pfnDummyFuncAddress,HMODULE hModCallerModule)
{
if (pszCalleeModuleName == NULL)
{
return FALSE;
}
if (pfnOriginApiAddress == NULL)
{
return FALSE;
}
//如果没传进来要挂钩的模块名称,枚举被挂钩进程的所有引用的模块,
//并对这些模块进行传进来的相应函数名称的查找if (hModCallerModule == NULL)
{
MEMORY_BASIC_INFORMATION mInfo;
HMODULE hModHookDLL;
HANDLE hSnapshot;
MODULEENTRY32 me = {sizeof(MODULEENTRY32)};
//MODULEENTRY32:描述了一个被指定进程所应用的模块的struct VirtualQuery(HookOneAPI,&mInfo,sizeof(mInfo));
hModHookDLL=(HMODULE)mInfo.AllocationBase;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);
BOOL bOk = Module32First(hSnapshot,&me);
while (bOk)
{
if (me.hModule != hModHookDLL)
{
hModCallerModule = me.hModule;//赋值
//me.hModule:指向当前被挂钩进程的每一个模块
HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
}
bOk = Module32Next(hSnapshot,&me);
}
return TRUE;
}
//如果传进来了,进行查找
else
{
HookOneAPI(pszCalleeModuleName,pfnOriginApiAddress,
pfnDummyFuncAddress,hModCallerModule);
return TRUE;
}
return FALSE;
}