模擬抓包,並且解析報文。
這邊先貼上**和部分資料。詳細解釋以後再寫:
1.乙太網幀
2.ip報文
3.tcp報文
4.udp報文
//解析出mac位址
void dump_mac(const
char* header, char* buf, int start)
printf("\n");
}//解析出乙太網幀型別
unsigned
short get_type(char* buf)
//解析出ip報文的8位協議型別 tcp:6/udp:17
unsigned
char get_ptype(unsigned
char* ip)
//ip報文開始的位置
unsigned
char* get_ip_start(char* buf)
//tcp報文開始的位置
unsigned
char* get_tcp_start(unsigned
char* ip)
//tcp報文資料
unsigned
char* get_tcp_data(unsigned
char* tcp)
void handle(char* buf, int length)
unsigned
char* tcp = get_tcp_start(ip);
unsigned
char* tcp_data = get_tcp_data(tcp);
printf("%s\n\n\n", tcp_data);
}int main()
// 獲得硬體資訊,獲取介面的下標
struct ifreq ifstruct;
strcpy(ifstruct.ifr_name, "eth0");
// 獲取介面index
ioctl(sock, siocgifindex, &ifstruct);
// 獲取本地mac位址
ioctl(sock, siocgifhwaddr, &ifstruct);
// 獲取網絡卡設定
ioctl(sock, siocgifflags, &ifstruct);
// 設定混雜模式
ifstruct.ifr_flags |= iff_promisc;
// 繫結網口
struct sockaddr_ll sll;
sll.sll_family = af_packet;
sll.sll_ifindex = ifstruct.ifr_ifindex;
sll.sll_protocol = htons(eth_p_all);
sll.sll_hatype = arphrd_ether;
sll.sll_pkttype = packet_otherhost;
sll.sll_halen = eth_alen; //mac位址的長度
sll.sll_addr[6] = 0;
sll.sll_addr[7] = 0;
bind(sock, (struct sockaddr *)&sll, sizeof(struct sockaddr_ll));
// --------------------原始套接字建立完成--------------------------------
char buf[1514];
while(1)
handle(buf, ret);}}
C 使用原始套接字抓包
最近在研究使用原始套接字抓包,在網上找各種資料,下面是自己整理的測試 程式設計實現主要有以下幾個步驟 1.初始化winsock庫 2.建立socket控制代碼 3.繫結socket控制代碼到乙個本地位址 4.設定該socket為接收所有資料的模式 5.接收資料報 6.關閉socket控制代碼,清理w...
包分析(原始套接字七)
緊接上節 decodeippack 函式完成包的解析 ip包解析 int decodeippack char buf,int ibufsize return true 上述程式解析ip包型別後又分別呼叫decodetcppack decodeu ack decodeicmppack 解析相應的tcp...
golang使用原始套接字構造UDP包
這裡先看ip頭結構 其中16位總長度包括ip頭長度和資料的長度,8位協議填寫17,因為udp協議型別為17。這裡要說明一下ip頭中的首部校驗,這個值只校驗ip頭部,不包含資料。這裡給出校驗演算法,ip頭和udp頭中使用的校驗演算法是一樣的。func checksum msg byte uint16 ...