libpcap能夠發送封包,不過是使用data-link層的raw socket。
一樣打開一個pcap handle。
char errbuf[PCAP_ERRBUF_SIZE];
char *device = NULL;
//get default interface name
device = pcap_lookupdev(errbuf);
if(!device) {
fprintf(stderr, "pcap_lookupdev(): %s\n", errbuf);
exit(1);
}//end if
pcap_t *handle = pcap_open_live(device, 65535, 1, 1, errbuf);
if(!handle) {
fprintf(stderr, "pcap_open_live(): %s\n", errbuf);
exit(1);
}//end if
接著宣告一下封包,長度是14。
u_char frame[] = "\x01\x02\x03\x04\x05\x06\xff\xff\xff\xff\xff\xff\x81\x00";
int length = sizeof(frame) - 1;
其實一看就知道,這個封包目的mac address是"01:02:03:04:05:06",來源mac address是"ff:ff:ff:ff:ff:ff",則類型是"0x8100"(VLAN)。
呼叫函數
pcap_sendpacket()送出封包。 //send packet
if(pcap_sendpacket(handle, frame, length) < 0) {
fprintf(stderr, "pcap_sendpacket(): %s\n", pcap_geterr(handle));
}//end if
除了函數
pcap_sendpacket()以外,函數pcap_inject()一樣能達到相同效果,差別在於回傳值。函數
pcap_sendpacket()原型:int pcap_sendpacket(pcap_t *p, const u_char *buf, int size);
- 返回值:成功傳回0,失敗傳回-1,錯誤訊息從pcap_geterr()取得。
- 參數:p一個libpcap handle。buf要送出去的封包。size送出大小。
- 功能:從p所開啟的Interface送出封包。
函數
pcap_inject()原型:int pcap_inject(pcap_t *p, const void *buf, size_t size);
- 返回值:成功傳回送出封包的byte數,失敗傳回-1,錯誤訊息從pcap_geterr()取得。
- 參數:p一個libpcap handle。buf要送出去的封包。size送出大小。
- 功能:從p所開啟的Interface送出封包。
編譯:
libpcap % gcc -I/usr/local/opt/libpcap/include -Wall -std=gnu99 -L/usr/local/opt/libpcap/lib -lpcap send-a-frame.c -o send-a-frame
執行結果:
從左下角的十六進位可以看得出來是剛剛宣告的封包。
Source code on Github

沒有留言:
張貼留言