返回列表 回复 发帖

GUNiffer For Win2K by Shotgun代码

信息来源:补天网络
  1. //////////////////////////////////////////////////////////////////////////
  2. //                                                                                                        //                        
  3. //      GUNiffer   For Win2K by Shotgun                                                  //
  4. //                                                                                                            //
  5. //      Version:      0.30 Beta                                                                        //
  6. //      Released:      [2001.4]                                                                    //
  7. //      Author:            [Shotgun]                                                                    //
  8. //      Homepage:                                                                                       //
  9. //                        [[url]http://IT.Xici.Net[/url]]                                                   //
  10. //                        [[url]http://www.Patching.Net[/url]]                                             //
  11. //                                                                                                         //
  12. //////////////////////////////////////////////////////////////////////////
  13. #include <math.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <Winsock2.h>
  17. #include <mstcpip.h>

  18. #define STATUS_FAILED 0xFFFF            //定义异常出错代码
  19. #define MAX_PACK_LEN 65535                  //接收的最大IP报文      
  20. #define MAX_ADDR_LEN 16                  //点分十进制地址的最大长度
  21. #define MAX_PROTO_TEXT_LEN      16            //子协议名称(如"TCP")最大长度
  22. #define MAX_PROTO_NUM 12                  //子协议数量
  23. #define MAX_HOSTNAME_LAN 255            //最大主机名长度
  24. #define CMD_PARAM_HELP true

  25. typedef struct _iphdr
  26. {
  27.      unsigned char      h_lenver;            //4位首部长度+4位IP版本号
  28.      unsigned char      tos;                  //8位服务类型TOS
  29.      unsigned short      total_len;            //16位总长度(字节)
  30.      unsigned short      ident;                  //16位标识
  31.      unsigned short      frag_and_flags;      //3位标志位
  32.      unsigned char      ttl;                  //8位生存时间 TTL
  33.      unsigned char      proto;                  //8位协议 (TCP, UDP 或其他)
  34.      unsigned short      checksum;            //16位IP首部校验和
  35.      unsigned int      sourceIP;            //32位源IP地址
  36.      unsigned int      destIP;                  //32位目的IP地址
  37. }IP_HEADER;

  38. typedef struct _tcphdr                        //定义TCP首部
  39. {
  40.      USHORT th_sport;                        //16位源端口
  41.      USHORT th_dport;                        //16位目的端口
  42.      unsigned int th_seq;                  //32位序列号
  43.      unsigned int th_ack;                  //32位确认号
  44.      unsigned char th_lenres;            //4位首部长度/6位保留字
  45.      unsigned char th_flag;                  //6位标志位
  46.      USHORT th_win;                              //16位窗口大小
  47.      USHORT th_sum;                              //16位校验和
  48.      USHORT th_urp;                              //16位紧急数据偏移量
  49. }TCP_HEADER;

  50. typedef struct _udphdr                        //定义UDP首部
  51. {
  52.   unsigned short uh_sport;            //16位源端口
  53.   unsigned short uh_dport;            //16位目的端口
  54.   unsigned short uh_len;                  //16位长度
  55.   unsigned short uh_sum;                  //16位校验和
  56. } UDP_HEADER;

  57. typedef struct _icmphdr                        //定义ICMP首部
  58. {
  59.      BYTE   i_type;                              //8位类型
  60.      BYTE   i_code;                              //8位代码
  61.      USHORT i_cksum;                              //16位校验和
  62.      USHORT i_id;                              //识别号(一般用进程号作为识别号)
  63.      USHORT i_seq;                              //报文序列号      
  64.      ULONG timestamp;                        //时间戳
  65. }ICMP_HEADER;

  66. typedef struct _protomap                  //定义子协议映射表
  67. {
  68.      int ProtoNum;
  69.      char ProtoText[MAX_PROTO_TEXT_LEN];
  70. }PROTOMAP;

  71. PROTOMAP ProtoMap[MAX_PROTO_NUM]={      //为子协议映射表赋值
  72.            { IPPROTO_IP   , "IP " },
  73.            { IPPROTO_ICMP , "ICMP" },
  74.            { IPPROTO_IGMP , "IGMP" },
  75.            { IPPROTO_GGP , "GGP " },
  76.            { IPPROTO_TCP , "TCP " },
  77.            { IPPROTO_PUP , "PUP " },
  78.            { IPPROTO_UDP , "UDP " },
  79.            { IPPROTO_IDP , "IDP " },
  80.            { IPPROTO_ND   , "NP " },
  81.            { IPPROTO_RAW , "RAW " },
  82.            { IPPROTO_MAX , "MAX " },
  83.            { NULL , ""      } };

  84. SOCKET SockRaw;
  85. char TcpFlag[6]={'F','S','R','P','A','U'};      //定义TCP标志位
  86. bool ParamTcp      =false;                        // -t关注TCP 报文
  87. bool ParamUdp      =false;                        // -u关注UDP 报文      
  88. bool ParamIcmp      =false;                        // -i关注ICMP报文
  89. bool ParamDecode=false;                        // -d对协议进行解码
  90. char *strFromIpFilter=NULL;                  // 源IP地址过滤
  91. char *strDestIpFilter=NULL;                  // 目的地址过滤
  92. char *strSensitive=NULL;                  // 敏感字符串
  93. int iPortFilter=0;                              // 端口过滤
  94. int iProtocol, iTTL;                        
  95. char szProtocol[MAX_PROTO_TEXT_LEN];
  96. char szSourceIP[MAX_ADDR_LEN], szDestIP[MAX_ADDR_LEN];

  97. int DecodeIpPack(char *, int);            //IP解包函数
  98. int DecodeTcpPack(char *, int);            //TCP解包函数
  99. int DecodeUdpPack(char *, int);            //UDP解包函数
  100. int DecodeIcmpPack(char *, int);      //ICMP解包函数
  101. void CheckSockError(int, char*);      //出错处理函数
  102. char * CheckProtocol(int);                  //协议检查
  103. void usage(void);                              //使用说明
  104. bool GetCmdLine(int, char **);            //命令行参数处理

  105. void main(int argc, char ** argv)
  106. {
  107.      int iErrorCode;
  108.      char RecvBuf[MAX_PACK_LEN] = {0};
  109.      usage();
  110.      if(GetCmdLine(argc, argv)==CMD_PARAM_HELP) exit(0);
  111.      //初始化SOCKET
  112.      WSADATA wsaData;
  113.      iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData);
  114.      CheckSockError(iErrorCode, "WSAStartup");
  115.      SockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);
  116.      CheckSockError(SockRaw, "socket");
  117.      //获取本机IP地址
  118.      char FAR name[MAX_HOSTNAME_LAN];
  119.      iErrorCode = gethostname(name, MAX_HOSTNAME_LAN);
  120.      CheckSockError(iErrorCode, "gethostname");
  121.      struct hostent FAR * pHostent;
  122.      pHostent = (struct hostent * )malloc(sizeof(struct hostent));
  123.      pHostent = gethostbyname(name);
  124.      SOCKADDR_IN sa;
  125.      sa.sin_family = AF_INET;
  126.      sa.sin_port = htons(6000);
  127.      memcpy(&sa.sin_addr.S_un.S_addr, pHostent->h_addr_list[0], pHostent->h_length);
  128.      free(pHostent);
  129.      iErrorCode = bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa));
  130.      CheckSockError(iErrorCode, "bind");
  131.      //设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包
  132.      DWORD dwBufferLen[10] ;
  133.      DWORD dwBufferInLen = 1 ;
  134.      DWORD dwBytesReturned = 0 ;
  135.      iErrorCode=WSAIoctl(SockRaw, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),         
  136.                 &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );
  137.      CheckSockError(iErrorCode, "Ioctl");
  138.      //侦听IP报文
  139.      while(1)
  140.      {
  141.            memset(RecvBuf, 0, sizeof(RecvBuf));
  142.            iErrorCode = recv(SockRaw, RecvBuf, sizeof(RecvBuf), 0);
  143.            CheckSockError(iErrorCode, "recv");
  144.            iErrorCode = DecodeIpPack(RecvBuf, iErrorCode);
  145.            CheckSockError(iErrorCode, "Decode");
  146.      }
  147. }

  148. //IP解包程序
  149. int DecodeIpPack(char *buf, int iBufSize)
  150. {
  151.      IP_HEADER *pIpheader;
  152.      SOCKADDR_IN saSource, saDest;
  153.      pIpheader = (IP_HEADER *)buf;
  154. //协议甄别
  155.      iProtocol = pIpheader->proto;
  156.      strncpy(szProtocol, CheckProtocol(iProtocol), MAX_PROTO_TEXT_LEN);
  157.      if((iProtocol==IPPROTO_TCP) && (!ParamTcp)) return true;
  158.      if((iProtocol==IPPROTO_UDP) && (!ParamUdp)) return true;
  159.      if((iProtocol==IPPROTO_ICMP) && (!ParamIcmp)) return true;
  160. //源地址
  161.      saSource.sin_addr.s_addr = pIpheader->sourceIP;
  162.      strncpy(szSourceIP, inet_ntoa(saSource.sin_addr), MAX_ADDR_LEN);
  163.      if (strFromIpFilter)
  164.            if (strcmp(strFromIpFilter,szSourceIP)) return true;
  165. //目的地址
  166.      saDest.sin_addr.s_addr = pIpheader->destIP;
  167.      strncpy(szDestIP, inet_ntoa(saDest.sin_addr), MAX_ADDR_LEN);
  168.      if (strDestIpFilter)
  169.            if (strcmp(strDestIpFilter,szDestIP)) return true;
  170.      iTTL = pIpheader->ttl;
  171. //计算IP首部的长度
  172.      int iIphLen = sizeof(unsigned long) * (pIpheader->h_lenver & 0xf);
  173. //根据协议类型分别调用相应的函数
  174.      switch(iProtocol)
  175.      {
  176.            case IPPROTO_TCP      :DecodeTcpPack(buf+iIphLen, iBufSize);break;
  177.            case IPPROTO_UDP      :DecodeUdpPack(buf+iIphLen, iBufSize);break;
  178.            case IPPROTO_ICMP      :DecodeIcmpPack(buf+iIphLen, iBufSize);break;
  179.            default                        :break;
  180.      }
  181.      //printf("\n");
  182.      return true;
  183. }

  184. //协议识别程序
  185. char * CheckProtocol(int iProtocol)
  186. {
  187.      for(int i=0; i<MAX_PROTO_NUM; i++)
  188.                  if(ProtoMap[i].ProtoNum==iProtocol)
  189.                        return ProtoMap[i].ProtoText;
  190.      return "";
  191. }

  192. //TCP解包程序
  193. int DecodeTcpPack(char * TcpBuf, int iBufSize)
  194. {
  195.      TCP_HEADER * pTcpHeader;
  196.      int i;
  197.      int iSourcePort,iDestPort;
  198.      
  199.      pTcpHeader = (TCP_HEADER * )TcpBuf;
  200.      //计算TCP首部长度
  201.      int TcpHeaderLen = pTcpHeader->th_lenres>>4;
  202.      TcpHeaderLen *= sizeof(unsigned long);
  203.      char * TcpData=TcpBuf+TcpHeaderLen;
  204.      //如果过滤敏感字符串则判断是否包含
  205.      if (strSensitive)
  206.            if ((strstr(TcpData, strSensitive))==NULL) return true;
  207.      //对端口进行过滤
  208.      iSourcePort = ntohs(pTcpHeader->th_sport);
  209.      iDestPort = ntohs(pTcpHeader->th_dport);
  210.      if ((iPortFilter) && (iSourcePort!=iPortFilter) && (iDestPort!=iPortFilter))
  211.            return true;
  212.      //输出
  213.      printf("%s ", szProtocol);
  214.      printf("%15s:%5d ->%15s:%5d ", szSourceIP, iSourcePort, szDestIP, iDestPort);
  215.      printf("TTL=%3d ", iTTL);
  216.      //判断TCP标志位
  217.      unsigned char FlagMask = 1;
  218.      for( i=0; i<6; i++ )
  219.      {
  220.            if((pTcpHeader->th_flag) & FlagMask) printf("%c",TcpFlag[i]);
  221.            else printf("-");
  222.            FlagMask=FlagMask<<1;
  223.      }
  224.      printf(" bytes=%4d", iBufSize);
  225.      printf("\n");
  226.      //对于长度大于40字节的包进行数据分析(IP_HEADER+TCP_HEADER=40)
  227.      if ((ParamDecode) && (iBufSize>40))
  228.      {
  229.            //分析TCP数据段
  230.            if ((!strSensitive) || (strstr(TcpData,strSensitive)))
  231.            {
  232.                  printf(" [DATA]\n");
  233.                  printf("%s",TcpData);
  234.                  printf("\n [DATA END]\n\n\n");
  235.            }
  236.      }
  237.      return true;
  238. }

  239. //UDP解包程序
  240. int DecodeUdpPack(char * UdpBuf, int iBufSize)
  241. {
  242.      UDP_HEADER *pUdpHeader;
  243.      pUdpHeader = (UDP_HEADER * )UdpBuf;
  244.      int iSourcePort = ntohs(pUdpHeader->uh_sport);
  245.      int iDestPort = ntohs(pUdpHeader->uh_dport);
  246.      //对端口进行过滤
  247.      if(iPortFilter)
  248.            if ((iSourcePort!=iPortFilter) && (iDestPort!=iPortFilter))
  249.                  return true;
  250.      printf("%s ", szProtocol);
  251.      printf("%15s:%5d ->%15s:%5d ", szSourceIP, iSourcePort, szDestIP, iDestPort);
  252.      printf("TTL=%3d ", iTTL);
  253.      printf("Len=%4d ", ntohs(pUdpHeader->uh_len));
  254.      printf("bytes=%4d", iBufSize);
  255.      printf("\n");
  256.      //对于长度大于28字节的包进行数据分析(IP_HEADER+UDP_HEADER>28)
  257.      if ((ParamDecode) && (iBufSize>28))
  258.      {
  259.            printf(" [DATA]\n");
  260.            //UDP首部长度为8
  261.            char * UdpData=UdpBuf+8;
  262.            //分析UDP数据段
  263.            for(unsigned int i=0;i<(iBufSize-sizeof(UDP_HEADER));i++)
  264.            {
  265.                  if (!(i%8)) printf("\n");
  266.                  if ( (UdpData[i]>33) && (UdpData[i]<122) )
  267.                              printf("%3c [%3x]", UdpData[i], UdpData[i]);
  268.                  else printf("   [%3x]", abs(UdpData[i]));
  269.            }
  270.            printf("\n [DATA END]\n\n\n");
  271.      }
  272.      return true;
  273. }

  274. //ICMP解包程序
  275. int DecodeIcmpPack(char * IcmpBuf, int iBufSize)
  276. {
  277.      ICMP_HEADER * pIcmpHeader;
  278.      pIcmpHeader = (ICMP_HEADER * )IcmpBuf;
  279.      int iIcmpType = pIcmpHeader->i_type;
  280.      int iIcmpCode = pIcmpHeader->i_code;
  281.      //对类型进行过滤
  282.      if ((iPortFilter) && (iIcmpType!=iPortFilter)) return true;
  283.      printf("%s ", szProtocol);
  284.      //printf("%15s Type%d ->%15s Code%d ", szSourceIP, iIcmpType, szDestIP, iIcmpCode);
  285.      printf("%15s     ->%15s     ", szSourceIP, szDestIP);
  286.      printf("TTL=%3d ", iTTL);
  287.      printf("Type%2d,%d ",iIcmpType,iIcmpCode);
  288.      printf("bytes=%4d", iBufSize);
  289.      printf("\n");
  290.      //对于包含数据段的包进行数据分析
  291.      if ((ParamDecode) && (iBufSize>28))
  292.      {
  293.            char * IcmpData=IcmpBuf+4;
  294.            //分析ICMP数据段
  295.            printf(" [DATA]");
  296.            for(unsigned int i=0;i<(iBufSize-sizeof(ICMP_HEADER));i++)
  297.            {
  298.                  if (!(i%8)) printf("\n");
  299.                  if ( (IcmpData[i]>33) && (IcmpData[i]<122) )
  300.                              printf("%3c [%3x]", IcmpData[i], IcmpData[i]);
  301.                  else printf("   [%3x]", abs(IcmpData[i]));
  302.            }
  303.            printf("\n [DATA END]\n\n\n");
  304.      }
  305.      return true;
  306. }

  307. //命令行参数处理
  308. bool GetCmdLine(int argc, char ** argv)
  309. {
  310.      if (argc<2) return CMD_PARAM_HELP;
  311.      for(int i=1;i<argc;i++)
  312.      {
  313.            if(argv[i][0]!='/') return CMD_PARAM_HELP;
  314.            else switch (argv[i][1])
  315.                  {
  316.                        case 't':
  317.                        case 'T': ParamTcp=true; break;
  318.                        case 'u':
  319.                        case 'U': ParamUdp=true; break;
  320.                        case 'i':
  321.                        case 'I': ParamIcmp=true; break;
  322.                        case 'p':
  323.                        case 'P': ParamDecode=true; break;
  324.                        case 'f':
  325.                        case 'F':
  326.                              {
  327.                                    strFromIpFilter=(char*)malloc(16*sizeof(char));
  328.                                    memset(strFromIpFilter,0,16*sizeof(char));
  329.                                    strcpy(strFromIpFilter,argv[i]+3);
  330.                                    break;
  331.                              }
  332.                        case 'd':
  333.                        case 'D':
  334.                              {
  335.                                    strDestIpFilter=(char*)malloc(16*sizeof(char));
  336.                                    memset(strDestIpFilter,0,16*sizeof(char));
  337.                                    strcpy(strDestIpFilter,argv[i]+3);
  338.                                    break;
  339.                              }
  340.                        case 's':
  341.                        case 'S':
  342.                              {
  343.                                    strSensitive=(char*)malloc(255*sizeof(char));
  344.                                    memset(strSensitive,0,255*sizeof(char));
  345.                                    strcpy(strSensitive,argv[i]+3);
  346.                                    break;
  347.                              }
  348.                        case 'o':
  349.                        case 'O':
  350.                              {
  351.                                    iPortFilter=atoi(argv[i]+3);
  352.                                    break;
  353.                              }
  354.                  }
  355.      }
  356.      printf("\nWill Sniffer");
  357.      if(ParamTcp) printf(" TCP");
  358.      if(ParamUdp) printf(" UDP");
  359.      if(ParamIcmp) printf(" ICMP");
  360.      if(strFromIpFilter) printf(" FromIp:%s",strFromIpFilter);
  361.      if(strDestIpFilter) printf(" DestIp:%s",strDestIpFilter);
  362.      if(ParamDecode) printf(" DECODE ON");
  363.      if(strSensitive) printf(" Sensitive String:'%s'",strSensitive);
  364.      printf("\n\tCTRL+C to quit\nStart:\n");
  365.      return (!CMD_PARAM_HELP);
  366. }

  367. //使用说明
  368. void usage(void)
  369. {
  370.      printf("GUNiffer\n");
  371.      printf("\tSinffer for Win2K By Shotgun (Ver 0.3)\n");
  372.      printf("\[email]tShotgun@Xici.net[/email]\n");
  373.      printf("\thttp://It.Xici.Net\n");
  374.      printf("\thttp://www.Patching.Net\n\n");
  375.      printf("USAGE:\n");
  376.      printf("\t/t       Output TCP Packets\n");
  377.      printf("\t/u       Output UDP Packets\n");
  378.      printf("\t/i       Output ICMP Packets\n");
  379.      printf("\t/p       Decode Packets (default OFF)\n");
  380.      printf("\t/f: fromIP Output Packets FromIp=fromIP (default ALL)\n");
  381.      printf("\t/d: destIP Output Packets DestIp=destIP (default ALL)\n");
  382.      printf("\t/s: string Output Packets Include sensitive String(TCP only)\n");
  383.      printf("\t/o: port   Output Packets from or to the port(ICMP is TYPE)\n");
  384.      printf("Example:\n");
  385.      printf("\tGUNiffer.exe /d>GUNiffer.log\n");
  386.      printf("\tGUNiffer.exe /t /u /f:192.168.15.231\n");
  387.      printf("\tGUNiffer.exe /t /p /s:PASS\n");
  388. }

  389. //SOCK错误处理程序
  390. void CheckSockError(int iErrorCode, char *pErrorMsg)
  391. {
  392.      if(iErrorCode==SOCKET_ERROR)
  393.      {
  394.            printf("%s Error:%d\n", pErrorMsg, GetLastError());
  395.            closesocket(SockRaw);
  396.            exit(0);
  397.      }
  398.       
  399. }
复制代码
返回列表