Linux網路資料捕獲之原始套接字

2021-06-08 11:27:39 字數 2599 閱讀 4567

處於一些目的,有時需要對到達網口的所有網路資料進行捕獲,系統也提供了這樣的介面,稍微懂網路程式設計的都知道sock_dgram、sock_stream,差不多就udp、tcp之類的吧。但是還有乙個很少用的叫sock_raw,原始套接字,使用它你可以捕獲網絡卡上的所有網路資料,當然這需要超級使用者許可權。貼個列子吧,網上摘的,具體出處忘了

#include #include #include #include #include #include #include #include #include #include #include #include /* the l2 protocols */

#include #include #include #define buffer_max 2048

int main(int argc, char *argv)

memset(&sll, 0, sizeof(sll));

sll.sll_family = pf_packet;

sll.sll_protocol = htons(eth_p_all);

//get net card index ethx->index

strcpy(ifstruct.ifr_name, "eth0");

ioctl(sock, siocgifindex, &ifstruct);

sll.sll_ifindex = ifstruct.ifr_ifindex;

//bind net card

if (bind(sock, (struct sockaddr *)&sll, sizeof(sll)) == -1)

while(1)

//process packet

}return 0;

}

其實原始套接字不僅可以捕獲資料,也可以傳送資料,而且是任意格式的資料,從mac頭到ip頭之類的資料段都在自己的控制範圍之內,什麼arp攻擊、

ddos攻擊之類的都離不開原始套接字吧,不過這些封包是重點,這裡篇幅有限不涉及封包了吧,只介紹如何將資料發出去

#include #include #include #include #include #include #include #include #include #include #include #include /* the l2 protocols */

#include #include #include #define buffer_max 2048

int main(int argc, char *argv)

; char type_buffer[2] = ;

if((sockfd = socket(pf_packet, sock_raw, htons(eth_p_all))) < 0)

n_res = 0;

n_write = 0;

memset(&sll, 0, sizeof(sll));

sll.sll_family = pf_packet;

sll.sll_protocol = htons(eth_p_all);

//get netcard inte***ce index ethx->ifindex

strcpy(ifstruct.ifr_name, "eth0");

ioctl(sockfd, siocgifindex, &ifstruct);

sll.sll_ifindex = ifstruct.ifr_ifindex;

//get the local netcard mac

strcpy(ifstruct.ifr_name, "eth0");

ioctl(sockfd, siocgifhwaddr, &ifstruct);

memcpy(sll.sll_addr, ifstruct.ifr_ifru.ifru_hwaddr.sa_data, eth_alen);

sll.sll_halen = eth_alen;

//bind the netcard

if(bind(sockfd, (struct sockaddr *)&sll, sizeof(sll)) == -1)

//get the netcard work mode

memset(&ifstruct, 0, sizeof(ifstruct));

strcpy(ifstruct.ifr_name, "eth0");

if(ioctl(sockfd, siocgifflags, &ifstruct) == -1)

//set the netcard work mode

ifstruct.ifr_flags |= iff_promisc;

if(ioctl(sockfd, siocsifflags, &ifstruct) == -1)

memcpy(buffer,mac_buffer,eth_alen);

memcpy(buffer+6,sll.sll_addr,eth_alen);

memcpy(buffer+12,type_buffer,2);

while(1)

n_write += n_res;

if(n_write >= 2048 * 2560)

}return 0;

}

UNIX網路程式設計讀書筆記 原始套介面

應用程式可以繞過傳輸層而直接使用ipv4和ipv6,這稱為原始套介面 raw socket 原始套介面是一種對原始網路報文進行處理的套介面。原始套介面主要應用在底層網路程式設計上,同時也是網路黑客的必備手段。例如sniffer 拒絕服務 dos ip位址欺騙等都需要在原始套接字的基礎上實現。與原始套...

Linux網路程式設計 原始套接字

原始套接字 sock raw 應用原始套接字,我們可以編寫出由tcp和udp套接字不能夠實現的功能.注意原始套接字只能夠由有 root許可權的人建立.dos.c include include include include include include include include inclu...

使用tcpdump捕獲網路資料

tcpdump host 61.135.169.125 i eth1 s 0 w tmp.txt i 指定網絡卡 如果不指定貌似tcpdump自己會選擇乙個,而不是監聽所有網絡卡 host 需要監聽的ip,也可寫成 host a and b 監聽a,b之間的通訊 s 0 指定每個包記錄多少個資料,設...