简单的分析数据包

http://wmjie.51.net/swords/blog/show.php?id=54于是我自己写了个,花了2个小时,惭愧……才几行代码,简单的分析而已。这个死blog贴代码总喜欢掉东西,郁闷~~!!!代码:


////////////////////////////////////////////////////////////////////////////////
//Filename:TestSniffer.c 
//Author:yunshu 
//Write:2005-01-11 
//////////////////////////////////////////////////////////////////////////////// #include <stdio.h>
#include <winsock2.h> 
#include <mstcpip.h>  ////////////////////////////////////////////////////////////////////////////////
//全局变量 
//////////////////////////////////////////////////////////////////////////////// typedef struct ip_hdr 

    unsigned char h_verlen; //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 tcp_hdr //定义TCP首部 

    USHORT th_sport; //16位源端口 
    USHORT th_dport; //16位目的端口 
    unsigned int    th_seq; //32位序列号 
    unsigned int    th_ack; //32位确认号 
    unsigned char th_lenres; //4位首部长度/6位保留字 
    unsigned char th_flag; //6位标志位 
    USHORT th_win; //16位窗口大小 
    USHORT th_sum; //16位校验和 
    USHORT th_urp; //16位紧急数据偏移量 
}TCP_HEADER;  ////////////////////////////////////////////////////////////////////////////////
//函数原形
//////////////////////////////////////////////////////////////////////////////// //void RecvPacket(char *);//抓包函数
void DecoPacket(char *);//解包函数  ////////////////////////////////////////////////////////////////////////////////
//主函数
//////////////////////////////////////////////////////////////////////////////// int main()
{
      WSADATA            WSAData;
      char        FAR hostname[128] = { 0 };//存放主机名 
        struct             hostent *phe;//存放IP地址结构 
        char              myIP[16] = {0};
        SOCKET      sock;
        BOOL        flag;
        char        recvBuffer[65000] = { 0 };//缓冲区存放捕获的数据 
        SOCKADDR_IN sniff;
        
        if ( WSAStartup(MAKEWORD(2,2) ,  &WSAData) == 0 ) 
    { 
          printf( “WSAStartup Error…\n” ); 
        return -1; 
    }      gethostname( hostname ,128 );//获取本机主机名 
    phe = gethostbyname( hostname );//获取本机ip地址结构      if( phe == NULL ) 
    { 
        printf( “Get LocalIP Error…\n” ); 
        return -1;
    } 
    
       if( phe->h_addr_list[0] )
      {
            struct in_addr addr;
            memmove(&addr , phe->h_addr_list[0] , 4);
            //获得标准IP地址
            myIP = inet_ntoa(addr);
      }
    
    //调试用,注释掉 
    printf( “test\n” );
    printf( “test\t%s\n” , myIP );
    
    //建立socket监听数据包 
    sock = socket( AF_INET,SOCK_RAW,IPPROTO_IP );      sniff.sin_family = AF_INET; 
    sniff.sin_port = htons(0); 
    sniff.sin_addr.s_addr = inet_addr( myIP );      //绑定到本地随机端口 
    bind(sock,(PSOCKADDR)&sniff,sizeof(sniff));      //设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包 
    DWORD dwBufferLen[10] ; 
    DWORD dwBufferInLen = 1 ; 
    DWORD dwBytesReturned = 0 ; 
    WSAIoctl(sock,SIO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL); 
    
    while(TRUE) 
    { 
        memset( recvBuffer , 0 , sizeof(recvBuffer) );          //开始捕获数据包 
        int bytesRecived = recv( sock , recvBuffer , sizeof(recvBuffer) , 0 ); 
        if(bytesRecived <= 0) 
        { 
            continue; 
        } 
        DecoPacket( recvBuffer ); 
    }    
    
    return 0;
}     void DecoPacket( char *buffer)
{
    IP_HEADER            *ipHeader;//IP_HEADER型指针 
    TCP_HEADER            *tcpHeader;//TCP_HEADER型指针 
    in_addr                  inAddr;      ipHeader = (IP_HEADER *)buffer; 
    tcpHeader = (TCP_HEADER *) (buffer+sizeof(IP_HEADER)); 
        
    printf( “协议类型:\t%d\n” , ipHeader->proto );
    
    inAddr.s_addr = ipHeader->sourceIP;
    printf( “来源地址:\t%s\n” , inet_ntoa(inAddr) );
    
    inAddr.s_addr = ipHeader->destIP;
    printf( “目的地址:\t%s\n” , inet_ntoa(inAddr) );
    
    printf( “来源端口:\t%d\n” , ntohs(tcpHeader->th_sport) );
    printf( “目的端口:\t%d\n\n” , ntohs(tcpHeader->th_dport) );  
}    

此条目发表在技术分类目录。将固定链接加入收藏夹。

简单的分析数据包》有 8 条评论

  1. Lalphbet说:

    看不懂啊…

  2. swords说:

    简单的分析数据包
    http://wmjie.51.net/swords/nettools/sniffer.rar

    thanks yunshu!

    C:>sniffer

    混杂模式设置成功….
    开始捕获数据包….

    捕获数据包1:
    按Ctrl+C停止捕获!
    协议类型: 17
    来源地址: 61.141.194.231
    目的地址: 10.10.37.49
    来源端口: 8000
    目的端口: 4000
    数据包长度: 124

    捕获数据包2:
    按Ctrl+C停止捕获!
    协议类型: 17
    来源地址: 10.10.37.49
    目的地址: 61.141.194.231
    来源端口: 4000
    目的端口: 8000
    数据包长度: 72

    捕获数据包3:
    按Ctrl+C停止捕获!
    协议类型: 17
    来源地址: 61.141.194.231
    目的地址: 10.10.37.49
    来源端口: 8000
    目的端口: 4000
    数据包长度: 132

    捕获数据包4:
    按Ctrl+C停止捕获!
    协议类型: 17
    来源地址: 10.10.37.49
    目的地址: 61.141.194.231
    来源端口: 4000
    目的端口: 8000
    数据包长度: 72

    捕获数据包5:
    按Ctrl+C停止捕获!
    ^C

  3. swords说:

    我发现不能检测其他包,只能检测自己机器的包。。。。

  4. 云舒说:

    这个我没有条件测试
    我这里是交换网络~~没有hub

  5. 双眼皮的猪说:

    做一次arp欺骗.广播自己的mac地址为网关的mac地址.然后打开自己机器的转发.就可以抓到别人的包了.

    推荐软件:
    dsniff

  6. 双眼皮的猪说:

    忘记说.上边这种做法只针对上到ip层及往外走…对于同链路之间的mac广播之类抓不到…

  7. 乱步说:

    能不能在弄详细点,能捕获user和 pass

  8. 云舒说:

    user和pass那里针对协议解码就可以了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注