该伪装数据包能够伪装假的本地ip地址,向web服务器发送http请求,谁有这样的源代码,如果有,可以送上200分

解决方案 »

  1.   

    #pragma pack(1)#define WIN32_LEAN_AND_MEAN#include <winsock2.h>
    #include <ws2tcpip.h>
    #include <stdio.h>
    #include <stdlib.h>#define MAX_MESSAGE      4068
    #define MAX_PACKET       4096#define DEFAULT_PORT     1234
    #define DEFAULT_IP       "127.0.0.1"
    #define DEFAULT_COUNT    5
    #define DEFAULT_MESSAGE  "stone"typedef struct ip_hdr
    {
      unsigned char  ip_verlen;
      unsigned char  ip_tos;
      unsigned short ip_totallength;
      unsigned short ip_id;
      unsigned short ip_offset;
      unsigned char  ip_ttl;
      unsigned char  ip_protocol;
      unsigned short ip_checksum;
      unsigned int   ip_srcaddr;
      unsigned int   ip_destaddr;
    } IP_HDR,*PIP_HDR,FAR* LPIP_HDR;typedef struct udp_hdr
    {
      unsigned short src_portno;
      unsigned short dst_portno;
      unsigned short udp_length;
      unsigned short udp_checksum;
    } UDP_HDR,*PUDP_HDR;unsigned long dwToIP,dwFromIP;
    unsigned short iToPort,iFromPort;
    DWORD dwCount;
    char strMessage[MAX_MESSAGE];void usage(char *progname)
    {
    printf("usage: %s [-fp:int] [-fi:str] [-tp:int] [-ti:str] [-n:int] [-m:str]\n",progname);
    printf("   -fp:int From(sender) port number\n");
    printf("   -fi:IP  From(sender) IP address\n");
    printf("   -fp:int To(recipient) port number\n");
    printf("   -fi:IP  To(recipient) Ip address\n");
    printf("   -n:int  Number of times to read message\n");
    printf("   -m:str  Size of buffer to read\n\n");
    ExitProcess(1);
    }void ValidateArgs(int argc,char **argv)
    {
     int i;
     
     iToPort=DEFAULT_PORT;
     iFromPort=DEFAULT_PORT;
     dwToIP=inet_addr(DEFAULT_IP);
     dwFromIP=inet_addr(DEFAULT_IP);
     dwCount=DEFAULT_COUNT;
     strcpy(strMessage,DEFAULT_MESSAGE);
     
     for(i=1;i<argc;i++)
      {
        if((argv[i][0]=='-')||(argv[i][0]=='/'))
        {
            switch(tolower(argv[i][1]))
            {
              case 'f':
                   switch(tolower(argv[i][2]))
                   {
                     case 'p':
                          if(strlen(argv[i])>4)
                            iFromPort=atoi(&argv[i][4]);
                          break;
                     case 'i':
                          if(strlen(argv[i])>4)
                            dwFromIP=inet_addr(&argv[i][4]);
                          break;
                    default:
                          usage(argv[0]);
                          break;
                   }
                   break;
                case 't':
                    switch(tolower(argv[i][2]))
                    {
                        case 'p':
                            if(strlen(argv[i])>4)
                                iToPort=atoi(&argv[i][4]);
                            break;
                        case 'i':
                            if(strlen(argv[i])>4)
                                dwToIP=inet_addr(&argv[i][4]);
                            break;
                         default:
                            usage(argv[0]);
                            break;
                    }
                    break;
                 case 'n':
                     if(strlen(argv[i])>3)
                           dwCount=atol(&argv[i][3]);
                     break;
                 case 'm':
                     if(strlen(argv[i])>3)
                        strcpy(strMessage,&argv[i][3]);
                     break;
                 default:
                     usage(argv[0]);
                     break;
             }
         } 
     }
     return;
    }
    USHORT checksum(USHORT *buffer,int size)
    {
      unsigned long cksum=0;
      while(size>1)
      {
         cksum+=*buffer++;
         size-=sizeof(USHORT);
      }
      if(size)
      {
         cksum+=*(UCHAR*)buffer;
      }
      cksum=(cksum>>16)+(cksum & 0xffff);
      cksum+=(cksum>>16);
      return (USHORT)(~cksum);}
    int main(int argc,char **argv)
    {
    WSADATA            wsd;
    SOCKET             s;
    BOOL               bOpt;
    struct sockaddr_in remote;
    IP_HDR             ipHdr;
    UDP_HDR            udpHdr;
    int                ret;
    DWORD              i;unsigned short iTotalSize,iUdpSize,iUdpChecksumSize,iIPVersion,iIPSize,cksum=0;
    char buf[MAX_PACKET];
    char *ptr=NULL;
    IN_ADDR  addr;ValidateArgs(argc,argv);
    addr.S_un.S_addr=dwFromIP;
    printf("From IP:<%s>\n    Port: %d\n",inet_ntoa(addr),iFromPort);
    addr.S_un.S_addr=dwToIP;
    printf("To  IP: <%s>\n   Port:%d\n",inet_ntoa(addr),iToPort);
    printf("Message:[%s]\n",strMessage);
    printf("Count: %d\n",dwCount);
       if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
       {
        printf("WSAStartup() failed:%d\n",GetLastError());
         return -1;
       }
    s=WSASocket(AF_INET,SOCK_RAW,IPPROTO_UDP,NULL,0,0);
       if(s==INVALID_SOCKET)
       {
           printf("WSASOCKET() failed:%d\n",WSAGetLastError());
           return -1;   }bOpt=TRUE;
    ret=setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&bOpt,sizeof(bOpt));
    if(ret==SOCKET_ERROR)
    {
    printf("setsockopt(IP_HDRINCL) failed: %d\n",WSAGetLastError());
    return -1;
    }iTotalSize=sizeof(ipHdr)+sizeof(udpHdr)+strlen(strMessage);
    iIPVersion=4;
    iIPSize=sizeof(ipHdr) / sizeof(unsigned long);ipHdr.ip_verlen=(iIPVersion<<4)|iIPSize;
    ipHdr.ip_tos=0;
    ipHdr.ip_totallength=htons(iTotalSize);
    ipHdr.ip_id=0;
    ipHdr.ip_offset=0;
    ipHdr.ip_ttl=128;
    ipHdr.ip_protocol=0x11;
    ipHdr.ip_checksum=0;
    ipHdr.ip_srcaddr=dwFromIP;
    ipHdr.ip_destaddr=dwToIP;udpHdr.src_portno=htons(iFromPort);
    udpHdr.dst_portno=htons(iToPort);
    udpHdr.udp_length=htons(iUdpSize);
    udpHdr.udp_checksum=0;iUdpChecksumSize=0;
    ptr=buf;
    ZeroMemory(buf,MAX_PACKET);memcpy(ptr,&ipHdr.ip_srcaddr,sizeof(ipHdr.ip_srcaddr));
    ptr+=sizeof(ipHdr.ip_srcaddr);
    iUdpChecksumSize+=sizeof(ipHdr.ip_srcaddr);memcpy(ptr,&ipHdr.ip_destaddr,sizeof(ipHdr.ip_destaddr));
    ptr+=sizeof(ipHdr.ip_destaddr);
    iUdpChecksumSize+=sizeof(ipHdr.ip_destaddr);ptr++;
    iUdpChecksumSize+=1;memcpy(ptr,&ipHdr.ip_protocol,sizeof(ipHdr.ip_protocol));
    ptr+=sizeof(ipHdr.ip_protocol);
    iUdpChecksumSize+=sizeof(ipHdr.ip_protocol);memcpy(ptr,&udpHdr.udp_length,sizeof(udpHdr.udp_length));
    ptr+=sizeof(udpHdr.udp_length);
    iUdpChecksumSize+=sizeof(udpHdr.udp_length);memcpy(ptr,&udpHdr.udp_length,sizeof(udpHdr.udp_length));
    ptr+=sizeof(udpHdr.udp_length);
    iUdpChecksumSize+=sizeof(udpHdr.udp_length);memcpy(ptr,&udpHdr,sizeof(udpHdr));
    ptr+=sizeof(udpHdr);
    iUdpChecksumSize+=sizeof(udpHdr);for(i=0;i<strlen(strMessage);i++,ptr++)
     *ptr=strMessage[i];
    iUdpChecksumSize+=strlen(strMessage);
    cksum=checksum((USHORT *)buf,iUdpChecksumSize);
    udpHdr.udp_checksum=cksum;ZeroMemory(buf,MAX_PACKET);
    ptr=buf;memcpy(ptr,&ipHdr,sizeof(ipHdr));  ptr+=sizeof(ipHdr);
    memcpy(ptr,&udpHdr,sizeof(udpHdr)); ptr+=sizeof(udpHdr);
    memcpy(ptr,strMessage,strlen(strMessage));remote.sin_family=AF_INET;
    remote.sin_port=htons(iToPort);
    remote.sin_addr.s_addr=dwToIP;for(i=0;i<dwCount;i++)
    {
      ret=sendto(s,buf,iTotalSize,0,(SOCKADDR *)&remote,sizeof(remote));
      if(ret==SOCKET_ERROR)
      {
         printf("sendto() failed:%d\n",WSAGetLastError());
         break;
      }
       else
        printf("sEND %d bytes\n",ret);
    }
    closesocket(s);
    WSACleanup();
    return 0;
    }
      

  2.   

    这个是最新的,你直接可以调试通,记得在工程/设置->LINK,加WSOCK32.LIB WS2_32.LIB 这两个库!
      

  3.   

    伪造IP可以使用原始套接字。发送http请求可以参考
    http://community.csdn.net/Expert/topic/3641/3641113.xml?temp=.6726801
      

  4.   

    chenzunshi(石头) 
    我发送给主机好象都没什么反应