原始套接字實現抓包,分析tcp ip報文

2021-07-27 12:43:57 字數 2312 閱讀 9829

模擬抓包,並且解析報文。

這邊先貼上**和部分資料。詳細解釋以後再寫:

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 ...