返回列表 发帖

捕获数据包的程序设计

[这个贴子最后由风灵风之子在 2005/04/28 10:57pm 第 1 次编辑]

具体看这篇文章吧。

用原始套接字实现网络监听
作者:张志强

如图一
4、小结
    本文介绍的以原始套接字实现网络侦听的方法实现起来比较简单,尤其是不需要编写驱动程序就能实现网络侦听。但由于接收到的数据报头不含帧信息,因此不能接收网络层的其他数据包,如ARP、RARP等。原始套接字只能监听但不能实现拦截。另外最致命的缺点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包例如TDI无法进行处理。对于一些木 马和病毒来说很容易避开这个层次的监听。

TOP

捕获数据包的程序设计

上传的文件是源代码
注释写的比较详细

TOP

捕获数据包的程序设计

  1. #pragma comment (lib,"Ws2_32.lib")
  2. &#35;include<winsock2.h>
  3. &#35;include <Ws2tcpip.h>
  4. &#35;include<stdio.h>
  5. &#35;define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)//0x80000000|0x18000000|0x00000001
  6. int main(void )
  7. {
  8. SOCKET SnifferSocket;
  9. WSADATA wsaData;
  10. int iFlag=WSAStartup(MAKEWORD(2,0),&wsaData);
  11. struct sockaddr_in sa;
  12. char receive[1024]={0};
  13. SnifferSocket = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
  14. sa.sin_family = AF_INET;
  15. sa.sin_port = htons(7000);
  16. sa.sin_addr.s_addr=inet_addr("10.0.0.66");//inet_addr(10.0.0.66)
  17. bind(SnifferSocket,(struct sockaddr *)&sa, sizeof(sa)) ;
  18. DWORD dwBufferLen[10] ;
  19. DWORD dwBufferInLen = 1 ;
  20. DWORD dwBytesReturned = 0 ;
  21. WSAIoctl(
  22. SnifferSocket,//套接字的描述符;
  23. SIO_RCVALL,//待执行操作的控制代码,这里为SO_SSL_SET_VALIDATE_CERT_HOOK,表示将指针设置为证书验证指令;
  24. &dwBufferInLen, //是一个指向输入缓冲区的指针;
  25. sizeof(dwBufferInLen),//输入缓冲区大小;
  26. &dwBufferLen, //指向输出缓冲区的指针;
  27. sizeof(dwBufferLen),//输出缓冲区大小;
  28. &dwBytesReturned ,//指向真实的输出字节的数值;
  29. NULL , NULL //这里必须为NULL
  30. );
  31. memset(receive,0,1024);
  32. printf("memset over\n");
  33. recv( SnifferSocket, receive, sizeof(receive) , 0 ) ;
  34. printf("Recv Over...\n");
  35. for(int i=0;i<1024;i++)
  36. printf("%x",receive[i]);
  37. closesocket(SnifferSocket);
  38. WSACleanup();
  39. return 0;
  40. }
复制代码

TOP

捕获数据包的程序设计

[这个贴子最后由风灵风之子在 2005/04/29 01:16pm 第 1 次编辑]

To x86:
你的程序错误在这一句:
sa.sin_addr.s_addr=INADDR_ANY;//inet_addr(10.0.0.66);
我改为了
sa.sin_addr.s_addr=inet_addr("10.0.0.66");

TOP

返回列表 回复 发帖