我想用钩子截取某一程序的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;
}

解决方案 »

  1.   

    BOOL WINAPI HookAllAPI(LPCTSTR pszCalleeModuleName,PROC pfnOriginApiAddress,
            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;
    }
      

  2.   

    ExtTextOutA函数我可以截取到,但是revc和send我就是截取不到,为什么呢?是不是钩子的类型错了?
      

  3.   

    我觉得你应该截WSASend和WSARecv函数,也许系统根本就不掉用你截的那两个函数