點圖可放大 |
以下系列文章只用於學術學習,請不要拿來攻擊別人電腦
完整程式碼會在教完作業後發佈上來,這邊稍為介紹一下怎麼抓ARP封包
記得使用root權限執行!
一、步驟:
1.假設自己IP為192.168.1.131
2.假設arp請求發起方的IP為192.168.1.254
3.在自己電腦中開啟程式
4.觀察程式的輸出
二、arp封包的格式
請至此觀看詳細欄位格式:http://www.ipv6.com/articles/general/Address-Resolution-Protocol.htm
三、示範影片
建議切換至720P全螢幕觀賞
四、程式碼
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <net/if.h> #include <arpa/inet.h> #include <netpacket/packet.h> #include <net/ethernet.h> #include <net/if_arp.h> #include "debug.h" /*arp_packet*/ struct arp_packet { //各項欄位資訊查詢man Page //Header //Dest mac unsigned char mac_target[ETH_ALEN]; //Source mac unsigned char mac_source[ETH_ALEN]; //Ethertype unsigned short ethertype; //ARP Frame // 乙太網類型值0x1 unsigned short hw_type; //proto - IP協議(0x0800) unsigned short proto_type; //MAC地址長度 unsigned char mac_addr_len; //IP地址長度 unsigned char ip_addr_len; //操作碼 - 0x1表示ARP請求包,0x2表示應答包 unsigned short operation_code; //發送方mac unsigned char mac_sender[ETH_ALEN]; //發送方ip unsigned char ip_sender[4]; //接收方mac unsigned char mac_receiver[ETH_ALEN]; //接收方ip unsigned char ip_receiver[4]; //填充數據 unsigned char padding[18];//暫時用不到 };
#ifdef DEBUG #define Debug_printf(format, args...) printf("[%s:%d] "format, __FILE__, __LINE__, ##args) #else #define Debug_printf(args...) #endif
int main() { int sfd; struct sockaddr_ll my_etheraddr; struct arp_packet rcvbuff; //socket: only catch ARP packets sfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP)); if(-1 == sfd) { Debug_printf("socket error"); } memset(&my_etheraddr, 0, sizeof(my_etheraddr)); my_etheraddr.sll_family = PF_PACKET; my_etheraddr.sll_protocol = htons(ETH_P_ARP); my_etheraddr.sll_ifindex = IFF_BROADCAST; //bind if(-1 == bind(sfd, (struct sockaddr *)&my_etheraddr, sizeof(my_etheraddr))){ Debug_printf("bind error"); } while(1) { //recv if(-1 == recv(sfd, &rcvbuff, sizeof(rcvbuff), 0)){ Debug_printf("recv error"); continue; } print_packet(rcvbuff); } return 0; }
//參考man page 或者封包格式欄位 void print_packet(struct arp_packet ap) { printf("\n-----------------arp package begin--------------------------\n"); int i ; printf(" mac_target = "); for( i = 0; i < ETH_ALEN; i++) printf(i > 0 ? ":0x%.2x" : "0x%.2x", ap.mac_target[i]); printf("\n mac_source = "); for( i = 0; i < ETH_ALEN; i++) printf(i > 0 ? ":0x%.2x" : "0x%.2x", ap.mac_source[i]); printf("\n ethertype = 0x%x", ntohs(ap.ethertype)); printf("\n hw_type = 0x%x", ntohs(ap.hw_type)); printf("\n proto_type = 0x%x", ntohs(ap.proto_type)); printf("\n mac_addr_len = 0x%x", ap.mac_addr_len); printf("\n ip_addr_len = 0x%x", ap.ip_addr_len); printf("\n operation_code = 0x%x", ntohs(ap.operation_code)); printf("\n mac_sender = "); for(i = 0; i < ETH_ALEN; i++) printf(i > 0 ? ":0x%.2x" : "0x%.2x", ap.mac_sender[i]); printf("\n ip_sender = %s", inet_ntoa(*(struct in_addr*)(ap.ip_sender))); printf("\n mac_receiver = "); for( i = 0; i < ETH_ALEN; i++) printf(i > 0 ? ":0x%.2x" : "0x%.2x", ap.mac_receiver[i]); printf("\n ip_receiver = %s", inet_ntoa(*(struct in_addr*)(ap.ip_receiver))); printf("\n-----------------arp package end----------------------------\n"); }
程式碼載點
RAR: 載點1 載點2
Zip: 載點1 載點2
沒有留言:
張貼留言
俗話說
凡走過必留下痕跡,凡住過必留下鄰居
凡爬過必留下樓梯,凡來過必留下IP
看過文章之後歡迎留下您寶貴的意見喔!