處於一些目的,有時需要對到達網口的所有網路資料進行捕獲,系統也提供了這樣的介面,稍微懂網路程式設計的都知道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 指定每個包記錄多少個資料,設...