VC++パケット嗅覚を実現

4205 ワード

嗅覚器は、ネットワーク上を流れるパケットを盗聴することができる.ハブhubで構築されたネットワークは共有の原理に基づいており、ローカルエリアネットワーク内のすべてのコンピュータが同じパケットを受信し、一方、NICはハードウェアの「フィルタ」を構築しており、「MACアドレスを識別することで自分に関係のない情報をフィルタリングし、嗅覚プログラムはこのフィルタを閉じるだけで、NICを「ハイブリッドモード」に設定すれば嗅覚用スイッチswitchで構築できるネットワークは「交換」に基づいている「原理的には、スイッチはパケットをすべてのポートに送信するのではなく、目的のNICが存在するポートに送信する.sniffを嗅ぐ.嗅覚器はネットワーク上を流れるパケットを盗聴することができる.ハブhubで構成されたネットワークは共有の原理に基づいており、ローカルエリアネットワーク内のすべてのコンピュータは同じパケットを受信し、NICはハードウェアの「フィルタ」を構築している「MACアドレスを識別して自分に関係のない情報をフィルタリングすることで、嗅覚プログラムはこのフィルタを閉じるだけで、NICを「ハイブリッドモード」に設定すれば嗅覚用スイッチswitchで構築できるネットワークは「交換」に基づいている「原理的には、スイッチはパケットをすべてのポートに送るのではなく、目的のNICがあるポートに送るのです.このように嗅ぐと面倒になりますが、嗅覚プログラムは一般的に「ARP詐欺」の方法を利用して、MACアドレスを変えるなどの手段で、スイッチをだましてパケットを自分に送り、嗅覚分析を終えてから転送します.
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment (lib,"ws2_32.lib")

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

struct IPHEAD
{
    unsigned char h_len:4;//4     +4 IP   
    unsigned char ver:4;
    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  
};

struct TCPHEAD //  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        
};


char *phostlist[10];//         

DWORD _stdcall listen(void *p)
{
    SOCKET s;
    struct sockaddr_in addr;
    int itimeout=1000;
    int ret;
    char cbuf[1500];//       
    struct IPHEAD *piphd;//  IP   
	struct TCPHEAD *ptcphd;//  TCP   
 
    s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW); //         
    setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char*)&itimeout,sizeof(itimeout));

    memset(&addr,0,sizeof(addr));
    addr.sin_family=AF_INET;
    addr.sin_addr.S_un.S_addr=inet_addr((char *)p);
    addr.sin_port=htons(6000);//       
    bind(s,(struct sockaddr *)&addr,sizeof(addr));//    
    //  sock_raw sio_rcvall,      IP 
    DWORD dwin=1;
    DWORD dwout[10];
    DWORD dwret;
    WSAIoctl(s,SIO_RCVALL,&dwin,sizeof(dwin),&dwout,sizeof(dwout),&dwret,NULL,NULL);

    for(;;)
    {
        ret=recv(s,cbuf,sizeof(cbuf),0);//    
        if(ret==SOCKET_ERROR)
        {
            if(WSAGetLastError()==WSAETIMEDOUT)continue;
            closesocket(s);
            return 0;
        }

        piphd=(struct IPHEAD *)cbuf;//  IP      
		int iIphLen = sizeof(unsigned long) * (piphd->h_len  & 0xf);
		ptcphd=(struct TCPHEAD *)(cbuf+iIphLen);//  TCP      


        printf("From : %s \t port %d\t",inet_ntoa(*(struct in_addr*)&piphd->sourceip),ntohs(ptcphd->th_sport) );
        printf("To : %s \t port %d  ",inet_ntoa(*(struct in_addr*)&piphd->destip),ntohs(ptcphd->th_dport));
	
        switch(piphd->proto)//  IP             
        {
        case 1:
            printf("ICMP
"); break; case 2: printf("IGMP
"); break; case 6: printf("TCP
"); break; case 17: printf("UDP
"); break; default: printf("unknow:%d
",piphd->proto); } } return 1; } void main() { // sock WSADATA wsa; int i=0; DWORD dwtid; char chname[128]; hostent *host; WSAStartup(MAKEWORD(2,1),&wsa); gethostname(chname,sizeof(chname)); host=gethostbyname(chname); while(host->h_addr_list[i]!=NULL)// , { phostlist[i]=(char *)malloc(16); sprintf(phostlist[i],"%s",inet_ntoa(*(struct in_addr *)host->h_addr_list[i])); printf("Bind to %s
",phostlist[i]); CreateThread(NULL,0,listen,phostlist[i],0,&dwtid); i++; } for(;;)// { Sleep(10); } }