发新话题
打印

[原创]A simple sniffer code

[原创]A simple sniffer code

  文章作者:netxfly [E.S.T]
信息来源:邪恶八进制安全小组(www.eviloctal.com
复制内容到剪贴板
代码:
//
//header.h
//IP,TCP和UDP数据报报头定义
//
#define MAX_PACK_LEN  65535    //接收的最大IP报文
#define MAX_ADDR_LEN  16      //点分十进制地址的最大长度
#define MAX_HOSTNAME_LEN 255   //最大主机名长度
#define SIO_RCVALL          _WSAIOW(IOC_VENDOR,1)

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

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

typedef struct _udphdr       //定义UDP首部
{
   unsigned short uh_sport;   //16位源端口
   unsigned short uh_dport;   //16位目的端口
   unsigned short uh_len;    //16位长度
   unsigned short uh_sum;    //16位校验和
}UDP_HEADER;
复制内容到剪贴板
代码:
//
//实现文件Netxsniffer.cpp
//

#include "header.h"
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include "ws2tcpip.h"
#pragma comment(lib,"ws2_32.lib")

void usage(char *);      //使用说明函数
void sniffer(void);      //开始监听函数
void decodeip(char *);    //IP解包函数
void decodetcp(char *);    //TCP解包函数
void decodeudp(char *);    //UDP解包函数
char *getproto(int);      //协议判断函数

//
//主函数
//
int main(int argc,char *argv[])
{
if(argc==2)
  {
   if(strcmp(argv[1],"-s")==0)
      {
      sniffer();
      }
   }
else
{
    usage(argv[0]);
}
return 0;
}
//
//帮助函数
//
void usage(char *help)
{   system("color 0a");
   printf("================================================================\n");
   printf("Netxsniffer ver 0.1 by netxfly 2005-3-4\n");
   printf("Used to find hide friend&#39;IP on QQ\n");
   printf("USAGE:\n");
   printf("%s -s\t\t\tStart to sniffer\n",help);
   printf("%s -s >netxfly.log\tInsert result to file netxfly.log\n",help);
   printf("Note: \nIt only can run at win200/XP/2003,Can&#39;t on win95/98\n");
   printf("Press CTRL + C to quit\n");
   printf("================================================================\n");

}

//
//监听函数
//
void sniffer(void)
{
   WSADATA wsa;
   SOCKET  netxsniffer;
   int    err;
   char   buffer[MAX_PACK_LEN];
   char   localname[MAX_HOSTNAME_LEN];
   struct  hostent *phostent;
   struct  sockaddr_in  sniffer;

   DWORD dwBufferLen[10] ;
   DWORD dwBufferInLen = 1 ;
   DWORD dwBytesReturned = 0 ;
   
   //printf("Protocol |Source Address  |Dest Address    |Srcport  |Destport\n");
   printf("协议 |远端地址|    |本地地址|      |来源端口| |目的端口|\n");
   system("color 0a");
   if(WSAStartup(MAKEWORD(2,2),&wsa)!=0)
      {
        printf("Init Socket Error...\n");
        exit(0);
      }
   if((netxsniffer = socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCKET)
      {
        printf("Create Raw socket Error...\n");
        exit(0);
      }


   gethostname(localname,MAX_HOSTNAME_LEN);


   phostent = gethostbyname(localname);

   sniffer.sin_family=AF_INET;
   sniffer.sin_port=htons(60000);
   memcpy(&sniffer.sin_addr.S_un.S_addr, phostent->h_addr_list[0], phostent->h_length);

   err=bind(netxsniffer,(PSOCKADDR)&sniffer,sizeof(sniffer));
   if(err==SOCKET_ERROR)
      {
        printf("Bind Local ADDR Error..\n");
        exit(0);
      }
   WSAIoctl(netxsniffer, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );

   while(1)
   {
      memset(buffer , 0 , sizeof(buffer) );


      err = recv(netxsniffer , buffer , sizeof(buffer) , 0 );
      if(err <= 0)
      {
        continue;
      }
   else
   {
   
      decodeip( buffer);
   }
   }
}

//
//IP解包函数
//

void decodeip(char *ipbuf)
{
   IP_HEADER    *pip;
   char      *protocol;
   SOCKADDR_IN   addr;

   pip=(IP_HEADER *)ipbuf;


   protocol=getproto(pip->proto);


   printf("%s  ",protocol);
   addr.sin_addr.s_addr = pip->sourceIP;
   printf("%s-->",inet_ntoa(addr.sin_addr));
   addr.sin_addr.s_addr = pip->destIP;
   printf("%s  ",inet_ntoa(addr.sin_addr));

   switch(pip->proto)
      {
        case 6:
           decodetcp(ipbuf+sizeof(IP_HEADER));
           break;
        case 17:
           decodeudp(ipbuf+sizeof(IP_HEADER));
           break;
        default:
           putchar(&#39;\n&#39;);
      }

}

//
// DecodeTCP function
//

void decodetcp(char *tcpbuf)
{
   TCP_HEADER *ptcp;
   ptcp=(TCP_HEADER *)tcpbuf;
   printf("%8d  -->%8d",ntohs(ptcp->th_sport),ntohs(ptcp->th_dport));
   putchar(&#39;\n&#39;);
}

//
// DecodeUDP function
//

void decodeudp(char *udpbuf)
{
   UDP_HEADER *pudp;
   pudp=(UDP_HEADER *)udpbuf;
   printf("%8d  -->%8d",ntohs(pudp->uh_sport),ntohs(pudp->uh_dport));
   putchar(&#39;\n&#39;);
}

//
// Get type of protocol
//

char *getproto(int proto)
{
   switch(proto)
      {
        case 6:
           return "TCP";
           break;
        case 17:
           return "UDP";
           break;
        default:
           return "Other";
      }
}

附件

Netxsniffer.rar (9 KB)

2005-3-12 15:42, 下载次数: 90

TOP

优化了部分代码,可以在VC6.0下直接编译通过...

TOP

  借花献佛  给你的程序减减肥  编译后3.50K

修改的Code如下 测试无误
复制内容到剪贴板
代码:
#include "header.h"
#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include "ws2tcpip.h"

#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"shell32.lib")
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"msvcrt.lib")  //也可以添加/MD编译指令

#pragma comment(linker, "-entry:my_main")
#pragma comment(linker, "-opt:nowin98")
#pragma comment(linker, "-opt:ref")
#pragma comment(linker, "-merge:.rdata=.text")
#pragma comment(linker, "-subsystem:console")

void usage(WCHAR *);    //使用说明函数

int __stdcall real_wmain (int argc,WCHAR *argv[])
{
if(argc==2)
  {
   if(wcscmp(argv[1],L"-s")==0)
      {
      sniffer();
      }
   }
else
{
    usage(argv[0]);
}
return 0;
}

void __cdecl my_main (void)
{
    int argc=0;

    WCHAR **argv=CommandLineToArgvW(GetCommandLineW(),&argc);

    ExitProcess(real_wmain(argc,argv));
}

......
请加47809945   100%通过!每个月总有那么几天,您的网络会受到黑客的攻击--坐立不安,烦躁无力,使用虎虎开发的"月月舒"防火墙,超轻超薄,易于携带,提供由内到外的全方位保护,即使流量再大,也可以冲浪自如,再也不用担心侧漏啦。

TOP

虽说网上sniffer的源码有不少,让宝宝这么一弄,新意增添了不少,有看头儿了。
我用青春赌明天

TOP

发新话题