一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

用libnet和libpcap構(gòu)建Linux下的SYN掃描程序

 astrotycoon 2016-10-11
  1. //編譯: gcc synscan.c -o synscan -lnet -lpcap -lpthread  
  2. #include <stdio.h>  
  3. #include <pcap.h>  
  4. #include <libnet.h>  
  5. #include <pthread.h>  
  6. #include <sys/types.h>  
  7. #include <sys/socket.h>  
  8. #include <netinet/in.h>  
  9. #include <netinet/ip.h>  
  10. #include <netinet/tcp.h>  
  11. #include <netinet/if_ether.h>  
  12. #define LOCALPORT 55555  
  13. #define ETHERNET_LEN 14  
  14. #define SLEEP_TIME 1  
  15. #define TH_SYN 0x02  
  16. #define TH_ACK 0x10  
  17. //在我的機子上,網(wǎng)絡(luò)設(shè)備必須設(shè)置為ppp0;如果為NULL,則libnet和libpcap會自動查找合適的網(wǎng)絡(luò)設(shè)備  
  18. #ifdef __GUZHOU  
  19. #    define DEVICE "ppp0"  
  20. #else  
  21. #    define DEVICE NULL  
  22. #endif  
  23. #define RECV_IPPACKET_SIZE 40  
  24. static unsigned char recvbuf[RECV_IPPACKET_SIZE];       //接收緩存  
  25. #define TH_FLAG 33              //TCP標(biāo)志位在recvbuf中的位置  
  26. struct syn_scanner  
  27. {  
  28.     uint32_t dst_ip;  
  29.     uint16_t dst_port;  
  30. };  
  31. static struct syn_scanner scanner;  
  32. static uint32_t gethostip(const char *name)  
  33. {  
  34.     struct hostent *hostinfo = NULL;  
  35.     uint32_t *addr = NULL;  
  36.     hostinfo = gethostbyname(name);  
  37.     if (!hostinfo)  
  38.         return -1;  
  39.     if (AF_INET != hostinfo->h_addrtype)  
  40.         return -1;  
  41.     addr = (uint32_t *) (hostinfo->h_addr_list[0]);  
  42.     return *addr;  
  43. }  
  44. static uint32_t flag;           //用于判斷recvbuf是否為收到的分組  
  45. static void *recv_packet(void *arg)  
  46. {  
  47.     flag = 0;  
  48.     char *dev, errbuf[PCAP_ERRBUF_SIZE];  
  49.     pcap_t *handle;  
  50.     struct bpf_program fp;  
  51.     bpf_u_int32 mask, net;  
  52.     struct pcap_pkthdr header;  
  53.     const unsigned char *packet;  
  54.     char filter_exp[100] = "src host ";  
  55.     char tmp[100] = " and src port ", t[10];  
  56.     const struct syn_scanner *ss;  
  57.     struct in_addr addr;  
  58.     ss = (const struct syn_scanner *)arg;  
  59.     if (NULL == ss)  
  60.     {  
  61.         fprintf(stderr, "arg is NULL/n");  
  62.         return NULL;  
  63.     }  
  64.     dev = DEVICE;  
  65.     if (NULL == dev)  
  66.     {  
  67.         dev = pcap_lookupdev(errbuf);  
  68.         if (NULL == dev)  
  69.         {  
  70.             fprintf(stderr, "pcap_lookupdev() error/n");  
  71.             return NULL;  
  72.         }  
  73.     }  
  74.     printf("pcap Network interface: %s/n", dev);  
  75.     if (pcap_lookupnet(dev, &net, &mask, errbuf) == -1)  
  76.     {  
  77.         fprintf(stderr, "pcap_lookupnet() error/n");  
  78.         return NULL;  
  79.     }  
  80.     handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf);  
  81.     if (NULL == handle)  
  82.     {  
  83.         fprintf(stderr, "pcap_open_live() error/n");  
  84.         return NULL;  
  85.     }  
  86.     addr.s_addr = ss->dst_ip;  
  87.     strcat(filter_exp, inet_ntoa(addr));  
  88.     sprintf(t, "%u", ss->dst_port);  
  89.     strcat(tmp, t);  
  90.     strcat(filter_exp, tmp);  
  91.     printf("filter: %s/n", filter_exp); //打印過濾規(guī)則  
  92.     if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1)  
  93.     {  
  94.         fprintf(stderr, "pcap_compiler() error/n");  
  95.         return NULL;  
  96.     }  
  97.     if (pcap_setfilter(handle, &fp) == -1)  
  98.     {  
  99.         fprintf(stderr, "pcap_setfilter() error");  
  100.         return NULL;  
  101.     }  
  102.     packet = pcap_next(handle, &header);        //若沒有分組傳過來,則會阻塞  
  103.     printf("Jacked a packet with length of [%d]/n", header.len);  
  104.     //把收到的分組從ip頭開始的ETHERNET_LEN存到recvbuf中  
  105.     int i;  
  106.     packet += ETHERNET_LEN;  
  107.     for (i = 0; i < RECV_IPPACKET_SIZE; i++)  
  108.         recvbuf[i] = packet[i];  
  109.     flag = 1;  
  110.     return NULL;  
  111. }  
  112. static int send_syn(const struct syn_scanner *ss)  
  113. {  
  114.     uint32_t src_ip, dst_ip;  
  115.     uint16_t dst_port;  
  116.     libnet_t *l;  
  117.     char errbuf[LIBNET_ERRBUF_SIZE];  
  118.     pthread_t recv;  
  119.     dst_ip = ss->dst_ip;  
  120.     dst_port = ss->dst_port;  
  121.     l = libnet_init(LIBNET_RAW4, DEVICE, errbuf);  
  122.     if (NULL == l)  
  123.     {  
  124.         fprintf(stderr, "libnet_init() error/n");  
  125.         return -1;  
  126.     }  
  127.     src_ip = libnet_get_ipaddr4(l);  
  128.     if (-1 == src_ip || 0 == src_ip)  
  129.     {  
  130.         fprintf(stderr, "libent_get_ipaddr4() error/n");  
  131.         return -1;  
  132.     }  
  133.     printf("dst ip: %s, port: %u/n", inet_ntoa(*(struct in_addr *)&dst_ip), dst_port);  
  134.     printf("src ip: %s/n", inet_ntoa(*(struct in_addr *)&src_ip));  
  135.     if (libnet_build_tcp(LOCALPORT, dst_port, 0, 0, TH_SYN, 0, 0, 0, LIBNET_TCP_H, NULL, 0, l, 0) == -1)  
  136.     {  
  137.         fprintf(stderr, "libnet_build_tcp() error/n");  
  138.         return -1;  
  139.     }  
  140.     if (libnet_build_ipv4  
  141.         (LIBNET_IPV4_H + LIBNET_TCP_H, 0, 242, 0, 64, IPPROTO_TCP, 0, src_ip, dst_ip, NULL, 0, l, 0) == -1)  
  142.     {  
  143.         fprintf(stderr, "libnet_build_ipv4() error/n");  
  144.         return -1;  
  145.     }  
  146.     if (libnet_write(l) == -1)  
  147.     {  
  148.         fprintf(stderr, "libnet_write() error/n");  
  149.         return -1;  
  150.     }  
  151.     libnet_destroy(l);  
  152.     return 1;  
  153. }  
  154. //解析分組,這里我簡單地打印分組的內(nèi)容  
  155. static void parse_packet(const unsigned char *buf, const unsigned int len)  
  156. {  
  157.     int i;  
  158.     printf("The buffer is:/n");  
  159.     for (i = 0; i < len; i++)  
  160.         printf("%u ", buf[i]);  
  161.     putchar('/n');  
  162. }  
  163. int main(int argc, char **argv)  
  164. {  
  165.     pthread_t recv;  
  166.     void *retval;  
  167.     if (3 != argc)  
  168.     {  
  169.         fprintf(stderr, "Usage: %s dst_ip dst_port/n", argv[0]);  
  170.         return -1;  
  171.     }  
  172.     scanner.dst_ip = gethostip(argv[1]);  
  173.     sscanf(argv[2], "%u", &(scanner.dst_port));  
  174.     if (scanner.dst_ip == -1)  
  175.     {  
  176.         fprintf(stderr, "gethostip() error/n");  
  177.         return -1;  
  178.     }  
  179.     printf("Scanning.../n");  
  180.     //創(chuàng)建接收線程  
  181.     if (pthread_create(&recv, NULL, recv_packet, &scanner))  
  182.     {  
  183.         fprintf(stderr, "pthread_create() error/n");  
  184.         return -1;  
  185.     }  
  186.     if (send_syn(&scanner) == -1)  
  187.     {  
  188.         fprintf(stderr, "send_syn() error/n");  
  189.         return -1;  
  190.     }  
  191.     pthread_join(recv,&retval);  
  192.     if ((recvbuf[TH_FLAG] & TH_SYN) && (recvbuf[TH_FLAG] & TH_ACK))  
  193.         printf("%s: %s is opend/n", argv[1], argv[2]);  
  194.     else  
  195.         printf("%s: %s is closed/n", argv[1], argv[2]);  
  196.     if (flag)  
  197.         parse_packet(recvbuf, RECV_IPPACKET_SIZE);  
  198.     return 0;  
  199. }  

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产一区二区精品丝袜| 日本不卡视频在线观看| 成人你懂的在线免费视频| 爽到高潮嗷嗷叫之在现观看| 久久本道综合色狠狠五月| 亚洲视频在线观看你懂的| 极品少妇一区二区三区精品视频 | 黑色丝袜脚足国产一区二区| 色综合视频一区二区观看| 亚洲中文在线男人的天堂| 亚洲一级二级三级精品| 中文字幕人妻日本一区二区| 黄色av尤物白丝在线播放网址 | 99久只有精品免费视频播放| 欧美黄色黑人一区二区| 国产欧美日韩在线精品一二区| 亚洲一区二区欧美在线| 激情视频在线视频在线视频| 欧美精品亚洲精品日韩精品| 国产精品一区二区传媒蜜臀| 少妇淫真视频一区二区| 午夜视频在线观看日韩| 久久亚洲午夜精品毛片| 日韩三级黄色大片免费观看| 中文字幕日韩精品人一妻| 天堂网中文字幕在线观看| 九九热精品视频免费观看| 视频一区二区 国产精品| 精品人妻一区二区三区免费看| 国产精品日本女优在线观看| 亚洲男人的天堂就去爱| 97人妻精品免费一区二区| 国产亚洲中文日韩欧美综合网 | 麻豆国产精品一区二区三区| 日韩精品在线观看完整版| 亚洲欧美日韩中文字幕二欧美| 久久精品亚洲精品一区| 精品欧美一区二区三久久| 日韩精品一区二区毛片| 亚洲高清亚洲欧美一区二区| 国产欧美亚洲精品自拍|