我是不是Hook到了recv ?可我得不到数据包的数据。我想得到数据包后,更改些数据,再让系统把数据抛给被勾的程序。
int _stdcall new_recv(SOCKET s,char FAR *buf,int len,int flags)
{
         CString str1(buf);//str1一直为空,本函数也一直会被调用
TRACE("recv\n");
return 1;
return recv(s,buf,len,flags);
}
HHOOK m_hook;
DWORD dwCurrentPID = 0; 
BYTE btNewBytes[8] = { 0x0B8, 0x0, 0x0, 0x40, 0x0, 0x0FF, 0x0E0, 0 }; 
DWORD dwOldBytes[3][2]; 
DWORD dwSize; 
DWORD pRecv = 0;
HHOOK m_hook=SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)MyWndProc,AfxGetApp()->m_hInstance,GetWindowThreadProcessId(IE,NULL)); 
LRESULT CALLBACK MyWndProc ( int nCode,WPARAM wParam, LPARAM lParam)
{
HINSTANCE hLib = LoadLibrary( "ws2_32.dll" ); 
pSend = (DWORD)GetProcAddress( hLib, "send" ); 
pRecv = (DWORD)GetProcAddress( hLib, "recv" );

::ReadProcessMemory( INVALID_HANDLE_VALUE, (void *)pRecv, (void *)dwOldBytes[1], sizeof(DWORD)*2, &dwSize ); 
*(DWORD *)( btNewBytes + 1 ) = (DWORD)new_recv; 
::WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)pRecv, (void *)btNewBytes, sizeof(DWORD)*2, &dwSize );
}

解决方案 »

  1.   

    1.还有个DLL也好HOOK,WSOCKET32.DLL
    2.下面这个函数应该修改:
    int _stdcall new_recv(SOCKET s,char FAR *buf,int len,int flags)
    {
             CString str1(buf);//str1一直为空,本函数也一直会被调用
    TRACE("recv\n");
          //恢复API头8个字节
           WriteProcessMemory( INVALID_HANDLE_VALUE, ( void* )g_receiveAddress, 
                      (void*)g_dwOldBytes, sizeof( DWORD )*2, NULL );
                         recv(s,buf,len,flags);
         
         //写入跳转语句,继续Hook
         WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)g_receiveAddress,
     (void*)g_btNewBytes, sizeof(DWORD)*2,NULL);
           return 1;
    }
    3.最好加上同步
      

  2.   

    1.还有个DLL也要HOOK,WSOCKET32.DLL
      

  3.   

    那怎么改嘛??
    recv(s,buf,len,flags); 把数据得到了,保存进了buf,我更改后,如何再放进应用程序里?比如:应用程序本来接收的是'a',我就截获到数据包(按上面的方法),然后我就更改数据,把
    'a'改成'b'.这样应用程序认为接收的是'b'
      

  4.   

    你HOOK了recv,当系统调用recv时,会先调用你的替代函数,那么,你替代函数中的buf就是传下来的数据,当你在调用系统的recv时就是把数据提交给应用层了(如果你是和你自己的应用程序通讯,就不需要这么麻烦了,直接用共享内存等方法就可以了)
      

  5.   

    恩,谢谢了
    有些懂了我目前
    int _stdcall new_recv(SOCKET s,char FAR *buf,int len,int flags)
    {
         //...
      recv(s,buf,len,flags);
      CString str1(buf);//str1一直为空。
       //...
    }
    不知道是不是我的WriteProcessMemory参数写错了