VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1545|回复: 2

[转载] C++实现控制台下嗅探器代码

[复制链接]
81_avatar_middle
最佳答案
3 
online_supermod 发表于 2015-10-20 12:02:02 | 显示全部楼层 |阅读模式
从网上找到的源码,应该是《Windows 编程循序渐进》中的源码,被我改成了控制台下的了,有需要的网友拿去吧,不用谢我,请叫我雷锋。

文件 :
Sniffer.cpp                          // 嗅探实现
IpHeader.h                         // 头文件

IpHeader.h
  1. #include <stdio.h>
  2. #include <winsock2.h>
  3. #pragma comment ( lib, "ws2_32.lib" )

  4. #define      DEF_BUF_SIZE        2048
  5. #define   SIO_RCVALL        _WSAIOW(IOC_VENDOR,1)
  6. #define      OUTPUT_FORMAT        "%-3d| %-4d|%4s |%15s |%15s |%5d |%5d\n"

  7. typedef struct _PACK_INFO {
  8.     USHORT    nLength ;            // 数据包长度
  9.     USHORT    nProtocol ;            // 协议类型
  10.     UINT    nSourIp ;            // 源IP
  11.     UINT    nDestIp ;            // 目的IP
  12.     USHORT    nSourPort ;            // 源端口号
  13.     USHORT    nDestPort ;            // 目的端口号
  14. } PACK_INFO, *LPPACK_INFO ;

  15. typedef struct _IP_HEADER {
  16.     BYTE    bVerAndHLen ;        // 版本信息(前4位)和头长度(后4位)
  17.     BYTE    bTypeOfService ;    // 服务类型
  18.     USHORT    nTotalLength ;        // 数据包长度
  19.     USHORT    nID ;                // 数据包标识
  20.     USHORT    nReserved ;            // 保留字段
  21.     BYTE    bTTL ;                // 生成时间
  22.     BYTE    bProtocol ;            // 协议类型
  23.     USHORT    nCheckSum ;            // 校验和
  24.     UINT    nSourIp ;            // 源IP
  25.     UINT    nDestIp ;            // 目的IP
  26. } IP_HEADER, *PIP_HEADER ;

  27. typedef struct _TCP_HEADER {
  28.     USHORT    nSourPort ;            // 源端口号
  29.     USHORT    nDestPort ;            // 目的端口号
  30.     UINT    nSequNum ;            // 序列号
  31.     UINT    nAcknowledgeNum ;    // 确认号
  32.     USHORT    nHLenAndFlag ;        // 前4位:TCP头长度;中6位:保留;后6位:标志位
  33.     USHORT    nWindowSize ;        // 窗口大小
  34.     USHORT    nCheckSum ;            // 检验和
  35.     USHORT    nrgentPointer ;        // 紧急数据偏移量
  36. } TCP_HEADER, *PTCP_HEADER ;

  37. typedef struct _UDP_HEADER {
  38.     USHORT    nSourPort ;            // 源端口号
  39.     USHORT    nDestPort ;            // 目的端口号
  40.     USHORT    nLength ;            // 数据包长度
  41.     USHORT    nCheckSum ;            // 校验和
  42. } UDP_HEADER, *PUDP_HEADER ;

  43. // 定义变量
  44. bool isMonitor = true;        // 嗅探开关
  45. int nCout = 0;                // 嗅探到的数据包计数

  46. // 嗅探函数
  47. DWORD WINAPI Sniffer ( FILE *lpfOutput );
  48. VOID WINAPI DispAndOutput ( FILE *lpfOutput, PACK_INFO PackInfo );
复制代码


Sniffer.cpp
  1. // Sniffer.cpp 嗅探器主文件
  2. //

  3. #include "IpHeader.h"

  4. void main()
  5. {
  6.     FILE *lpf;
  7.     lpf = fopen ( "SnifferLog.txt", "a+" );

  8.     printf("| nCout | nSize | szProt | SourIP | DestIP | SourPort | DestPort |\n");
  9.     fprintf ( lpf, "| nCout | nSize | szProt | SourIP | DestIP | SourPort | DestPort |\n");
  10.     Sniffer ( lpf );

  11.     fclose ( lpf );
  12. }

  13. DWORD WINAPI Sniffer ( FILE *lpfOutput )
  14. {
  15.     PACK_INFO    PackInfo = {0} ;
  16.     int nRecvSize = 0 ;
  17.     char szPackBuf[DEF_BUF_SIZE] = {0} ;

  18.     WSADATA wsaData;
  19.     int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  20.     if (iResult != NO_ERROR)
  21.         return 0 ;

  22.     // 获取本地地址信息
  23.     sockaddr_in LocalAddr ;
  24.     char szLocalName[DEF_BUF_SIZE] = {0} ;
  25.     gethostname ( szLocalName, DEF_BUF_SIZE ) ;
  26.     hostent* pHost = gethostbyname ( szLocalName ) ;
  27.     if ( pHost != NULL )
  28.     {
  29.         LocalAddr.sin_family = AF_INET ;
  30.         LocalAddr.sin_port = htons(0) ;
  31.         memcpy ( &(LocalAddr.sin_addr.s_addr), pHost->h_addr_list[0], pHost->h_length ) ;
  32.     }
  33.     else
  34.         return 0 ;

  35.     // 创建监听套接字
  36.     SOCKET MonSock = socket ( AF_INET, SOCK_RAW, IPPROTO_IP ) ;
  37.     if ( MonSock == INVALID_SOCKET )
  38.         return 0 ;

  39.     // 绑定地址信息到套接字
  40.     if ( bind ( MonSock, (sockaddr*)&LocalAddr, sizeof(sockaddr) ) == SOCKET_ERROR )
  41.         return 0 ;

  42.     // 设置为混杂模式,收所有IP包
  43.     DWORD dwValue = 1 ;
  44.     if ( ioctlsocket ( MonSock, SIO_RCVALL, &dwValue ) != 0 )
  45.         return 0 ;

  46.     // 检测控制标志,是否继续监视
  47.     while ( isMonitor )
  48.     {
  49.         // 取得数据包
  50.         nRecvSize = recv ( MonSock, szPackBuf, DEF_BUF_SIZE, 0 ) ;
  51.         if ( nRecvSize > 0 )
  52.         {
  53.             // 解析IP包头
  54.             PIP_HEADER pIpHeader = (PIP_HEADER)szPackBuf ;
  55.             PackInfo.nLength    = nRecvSize ;
  56.             PackInfo.nProtocol    = (USHORT)pIpHeader->bProtocol ;
  57.             PackInfo.nSourIp    = pIpHeader->nSourIp ;
  58.             PackInfo.nDestIp    = pIpHeader->nDestIp ;
  59.             UINT nIpHeadLength = ( pIpHeader->bVerAndHLen & 0x0F ) * sizeof(UINT) ;            // IP数据包头长度

  60.             // 只检测TCP和UDP包
  61.             switch ( pIpHeader->bProtocol )
  62.             {
  63.             case IPPROTO_TCP:
  64.                 {
  65.                     // 取得TCP数据包端口号
  66.                     PTCP_HEADER pTcpHeader = (PTCP_HEADER)&szPackBuf[nIpHeadLength] ;
  67.                     PackInfo.nSourPort = pTcpHeader->nSourPort ;
  68.                     PackInfo.nDestPort = pTcpHeader->nDestPort ;
  69.                     
  70.                     DispAndOutput ( lpfOutput, PackInfo );
  71.                 }
  72.                 break ;
  73.             case IPPROTO_UDP:
  74.                 {
  75.                     // 取得UDP数据包端口号
  76.                     PUDP_HEADER pUdpHeader = (PUDP_HEADER)&szPackBuf[nIpHeadLength] ;
  77.                     PackInfo.nSourPort = pUdpHeader->nSourPort ;
  78.                     PackInfo.nDestPort = pUdpHeader->nDestPort ;
  79.                     
  80.                     DispAndOutput ( lpfOutput, PackInfo );
  81.                 }
  82.                 break ;
  83.             }
  84.         }
  85.         Sleep ( 100 ) ;
  86.     }
  87.     return 0;
  88. }

  89. VOID WINAPI DispAndOutput ( FILE *lpfOutput, PACK_INFO PackInfo )
  90. {
  91.     nCout += 1;
  92.     char *lpszProtocol = NULL ;
  93.     char *lpszSourIp = (char*)calloc( 16, sizeof(char) );
  94.     char *lpszDestIp = (char*)calloc( 16, sizeof(char) );

  95.     if( PackInfo.nProtocol == IPPROTO_TCP )
  96.         lpszProtocol = "TCP";
  97.     else if( PackInfo.nProtocol == IPPROTO_UDP )
  98.         lpszProtocol = "UDP";

  99.     struct in_addr SourAddr, DestAddr ;

  100.     SourAddr.S_un.S_addr = PackInfo.nSourIp ;
  101.     memcpy( lpszSourIp, inet_ntoa(SourAddr), strlen(inet_ntoa(SourAddr)) );
  102.    
  103.     DestAddr.S_un.S_addr = PackInfo.nDestIp ;
  104.     memcpy( lpszDestIp, inet_ntoa(DestAddr), strlen(inet_ntoa(DestAddr)));

  105.     printf ( OUTPUT_FORMAT, nCout, PackInfo.nLength, lpszProtocol, lpszSourIp, lpszDestIp,
  106.         htons(PackInfo.nSourPort), htons(PackInfo.nDestPort) );   
  107.     fprintf ( lpfOutput, OUTPUT_FORMAT, nCout, PackInfo.nLength, lpszProtocol, lpszSourIp, lpszDestIp,
  108.         htons(PackInfo.nSourPort), htons(PackInfo.nDestPort) );   

  109.     free(lpszSourIp);
  110.     lpszSourIp = NULL;
  111.     free(lpszDestIp);
  112.     lpszDestIp = NULL;
  113. }
复制代码




上一篇:socket端口数据转发
下一篇:frp
15_avatar_middle
最佳答案
0 
在线会员 发表于 2015-10-20 16:43:38 | 显示全部楼层
写的很精简、工整,适合学习,谢谢分享了
85_avatar_middle
最佳答案
3 
在线会员 发表于 2020-3-13 12:02:09 | 显示全部楼层
咋不用 pcap
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-20 00:18

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表