libnet
libnet的errbuf長度皆是LIBNET_ERRBUF_SIZE。
libnet的函數也很多,建構封包表頭佔多數,一樣有用到才會列出,其他協定就翻man page吧。
主要函數
libnet_t *libnet_init(int injection_type, const char *device, char *err_buf);
- 返回值:成功傳回一個libnet handle,失敗傳回NULL,錯誤訊息在
errbuf。 - 參數:
injection_type封包建構類型,有LIBNET_NONE、LIBNET_LINK、LIBNET_RAW4、LIBNET_RAW6、LIBNET_LINK_ADV、LIBNET_RAW4_ADV以及LIBNET_RAW6_ADV。device要開啟的Interface,可以為NULL讓libnet自動挑選。errbuf錯誤訊息。 - 功能:開啟一個libnet handle,用來之後建構封包等動作。
該函數為libnet主要函數,建構封包的第一個步驟,其中injection_type分別:LIBNET_NONE表示單純建構封包沒有要送出,LIBNET_LINK開啟Data-link layer的Raw socket,LIBNET_RAW4開啟Network layer的IPv4 raw socket,LIBNET_RAW6開啟Network layer的IPv6 raw socket,最後有_ADV表示可以使用進階版本的函數(函數名內有adv的字樣)。呼叫這個函數除了使用LIBNET_NONE以外,都需要root權限。
安裝過Wireshark使用
LIBNET_LINK或LIBNET_LINK_ADV就不需要root權限了,詳情請看libpcap教學的/dev/bpf。
void libnet_clear_packet(libnet_t *l);
- 參數:
l一個libnet handle。 - 功能:清除
l內所有封包。
void libnet_destroy(libnet_t *l);
- 參數:
l一個libnet handle。 - 功能:釋放libnet handle資源。
發送封包相關
int libnet_write(libnet_t *l);
- 返回值:成功傳回送出去的byte數,失敗傳回-1,錯誤訊息由
libnet_geterror()取得。 - 參數:
l一個libnet handle。 - 功能:從
l所開啟的Interface送出封包,如果l初始化時未指定Interface,會自動抓取一個Interface。
地址相關
uint32_t libnet_name2addr4(libnet_t *l, char *host_name, uint8_t use_name);
- 返回值:IPv4的網路順序的地址,-1表示發生錯誤,錯誤訊息由
libnet_geterror()取得。 - 參數:
l一個libnet handle。host_name要轉換的主機名稱。use_name表示是否要解析主機名稱,LIBNET_RESOLVE表示需要解析,LIBNET_DONT_RESOLVE表示不需要解析。 - 功能:將主機名稱轉成網路順序的地址。
char *libnet_addr2name4(uint32_t in, uint8_t use_name);
- 返回值:主機名稱。
- 參數:
inIPv4的網路順序地址。use_name表示是否要解析主機名稱,LIBNET_RESOLVE表示需要解析,LIBNET_DONT_RESOLVE表示不需要解析。 - 功能:以網路順序地址查詢主機名稱。
struct libnet_in6_addr libnet_name2addr6(libnet_t *l, const char *host_name, uint8_t use_name);
- 返回值:IPv6的網路順序地址結構。
- 參數:
l一個libnet handle。host_name要轉換的主機名稱。use_name表示是否要解析主機名稱,LIBNET_RESOLVE表示需要解析,LIBNET_DONT_RESOLVE表示不需要解析。 - 功能:將主機名稱轉成網路順序的地址。
void libnet_addr2name6_r(struct libnet_in6_addr addr, uint8_t use_name, char *host_name, int host_name_len);
- 參數:
addrlibnet的IPv6地址結構。use_name表示是否要解析主機名稱,LIBNET_RESOLVE表示需要解析,LIBNET_DONT_RESOLVE表示不需要解析。host_name主機名稱結果陣列。host_name_len主機名稱結果陣列長度。 - 功能:以網路順序地址查詢主機名稱。
uint32_t libnet_get_ipaddr4(libnet_t *l);
- 返回值:網路順序的地址,-1表示發生錯誤,錯誤訊息由
libnet_geterror()取得。 - 參數:
l一個libnet handle。 - 功能:取得由
l所開啟Interface的IPv4地址。
struct libnet_in6_addr libnet_get_ipaddr6(libnet_t *l);
- 返回值:IPv6的網路順序地址結構。
- 參數:
l一個libnet handle。 - 功能:取得由
l所開啟Interface的IPv6地址。
uint8_t *libnet_hex_aton(const char *s, int *len);
- 返回值:二進位的資料指標,失敗傳回NULL。
- 參數:
s要轉換的字串。len轉換後的長度。 - 功能:將以分號隔開的字串資料轉成二進位的資料。
錯誤相關
char *libnet_geterror(libnet_t *l)
- 返回值:傳回錯誤訊息。
- 參數:
l一個libnet handle。 - 功能:當
l使用函數時發生錯誤,可以用該函數傳回錯誤訊息。
建構封包相關
libnet_ptag_t libnet_build_arp(uint16_t hrd, uint16_t pro, uint8_t hln, uint8_t pln, uint16_t op, const uint8_t *sha, const uint8_t *spa, const uint8_t *tha, const uint8_t *tpa, const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
- 返回值:成功傳回該表頭的tag值,失敗傳回-1。
- 參數:
hrdHardware type。proProtocol type。hlnHardware length。plnProtocol length。opARP operation。shaSource hardware address。spaSource protocol address。thaTarget hardware address。tpaTarget protocol address。payload攜帶的資料。payload_s攜帶資料的長度。l一個libnet handle。ptag要修改的表頭tag,LIBNET_PTAG_INITIALIZER表示新的表頭欄位。 - 功能:建構或修改ARP表頭欄位。
libnet_ptag_t libnet_autobuild_arp(uint16_t op, const uint8_t *sha, const uint8_t *spa, const uint8_t *tha, uint8_t *tpa, libnet_t *l);
- 返回值:成功傳回該表頭的tag值,失敗傳回-1。
- 參數:
opARP operation。shaSource hardware address。spaSource protocol address。thaTarget hardware address。tpaTarget protocol address。l一個libnet handle。 - 功能:建構ARP表頭欄位。
libnet_ptag_t libnet_build_ethernet(const uint8_t *dst, const uint8_t *src, uint16_t type, const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
- 返回值:成功傳回該表頭的tag值,失敗傳回-1。
- 參數:
dstDestination MAC address。srcSource MAC address。typeNext protocol。payload攜帶的資料。payload_s攜帶資料的長度。l一個libnet handle。ptag要修改的表頭tag,LIBNET_PTAG_INITIALIZER表示新的表頭欄位。 - 功能:建構或修改Ethernet表頭欄位。
libnet_ptag_t libnet_autobuild_ethernet(const uint8_t *dst, uint16_t type, libnet_t *l);
- 返回值:成功傳回該表頭的tag值,失敗傳回-1。
- 參數:
dstDestination MAC address。typeNext protocol。l一個libnet handle。 - 功能:建構Ethernet表頭欄位。
libnet_ptag_t libnet_build_icmpv4_echo(uint8_t type, uint8_t code, uint16_t sum, uint16_t id, uint16_t seq, const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
- 返回值:成功傳回該表頭的tag值,失敗傳回-1。
- 參數:
typeICMP Type。codeICMP Code。sumChecksum,0表示交由libnet計算。idICMP Identification。seqICMP Sequence。payload攜帶的資料。payload_s攜帶資料的長度。l一個libnet handle。ptag要修改的表頭tag,LIBNET_PTAG_INITIALIZER表示新的表頭欄位。 - 功能:建構或修改ICMP Echo表頭欄位。
libnet_ptag_t libnet_build_ipv4(uint16_t ip_len, uint8_t tos, uint16_t id, uint16_t frag, uint8_t ttl, uint8_t prot, uint16_t sum, uint32_t src, uint32_t dst, const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
- 返回值:成功傳回該表頭的tag值,失敗傳回-1。
- 參數:
ip_lenIP Total Length。tosType of Service。idIP Identification。fragIP Fragment and Offset。ttlTime to Live。protNext Protocol。sumChecksum,0表示交由libnet計算。srcSource IP Address。dstDestination IP Address。payload攜帶的資料。payload_s攜帶資料的長度。l一個libnet handle。ptag要修改的表頭tag,LIBNET_PTAG_INITIALIZER表示新的表頭欄位。 - 功能:建構或修改IPv4表頭欄位。
libnet_ptag_t libnet_autobuild_ipv4(uint16_t len, uint8_t prot, uint32_t dst, libnet_t *l);
- 返回值:成功傳回該表頭的tag值,失敗傳回-1。
- 參數:
lenIP Total Length。protNext Protocol。dstDestination IP Address。l一個libnet handle。 - 功能:建構IPv4表頭欄位。
libnet_ptag_t libnet_build_udp(uint16_t sp, uint16_t dp, uint16_t len, uint16_t sum, const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
- 返回值:成功傳回該表頭的tag值,失敗傳回-1。
- 參數:
spSource Port。dpDestination Port。lenUDP Length。sumChecksum,0表示交由libnet計算。payload攜帶的資料。payload_s攜帶資料的長度。l一個libnet handle。ptag要修改的表頭tag,LIBNET_PTAG_INITIALIZER表示新的表頭欄位。 - 功能:建構或修改UDP表頭欄位。
libnet_ptag_t libnet_build_tcp_options(const uint8_t *options, uint32_t options_s, libnet_t *l, libnet_ptag_t ptag);
- 返回值:成功傳回該TCP Option的tag值,失敗傳回-1。
- 參數:
options要填入的TCP Option。options_sTCP Option的長度。l一個libnet handle。ptag要修改的表頭tag,LIBNET_PTAG_INITIALIZER表示新的表頭欄位。 - 功能:建構或修改TCP Option欄位。
libnet_ptag_t libnet_build_tcp(uint16_t sp, uint16_t dp, uint32_t seq, uint32_t ack, uint8_t control, uint16_t win, uint16_t sum, uint16_t urg, uint16_t len, const uint8_t *payload, uint32_t payload_s, libnet_t *l, libnet_ptag_t ptag);
- 返回值:成功傳回該表頭的tag值,失敗傳回-1。
- 參數:
spSource Port。dpDestination Port。seqSequence Number。ackAcknowledgment Number。controlTCP Flags,可以用TH_FIN、TH_SYN、TH_RST、TH_PUSH、TH_ACK、TH_URG、TH_ECE以及TH_CWR,假如需要SYN+ACK,則使用TH_SYN | TH_ACK表示。winWindow Size。sumChecksum,0表示交由libnet計算。urgUrgent Pointer。lenTCP Length。payload攜帶的資料。payload_s攜帶資料的長度。l一個libnet handle。ptag要修改的表頭tag,LIBNET_PTAG_INITIALIZER表示新的表頭欄位。 - 功能:建構或修改TCP表頭欄位。
隨機數相關
int libnet_seed_prand(libnet_t *l);
- 返回值:成功傳回1,失敗傳回-1。
- 參數:
l一個libnet handle。 - 功能:初始化隨機數種子。
uint32_t libnet_get_prand(int mod);
- 返回值:傳回一個隨機數。
- 參數:
mod隨機數產生方式,可用:LIBNET_PR2:0 - 1、LIBNET_PR8:0 - 255、LIBNET_PR16:0 - 32767、LIBNET_PRu16:0 - 65535、LIBNET_PR32:0 - 2147483647、LIBNET_PRu32:0 - 4294967295。 - 功能:根據參數
mod產生一個隨機數。
libnet handle鏈結串列相關
int libnet_cq_add(libnet_t *l, char *label);
- 返回值:成功傳回1,失敗傳回-1。
- 參數:
l一個libnet handle。label標籤。 - 功能:將變數
l加入libnet handle鏈結串列內,變數label必須是唯一的。
libnet_t *libnet_cq_remove(libnet_t *l);
- 返回值:成功傳回一個libnet handle。失敗傳回NULL。
- 參數:
l一個libnet handle。 - 功能:將特定的變數
l從libnet handle鏈結串列內移除,成功傳回libnet handle後必須還要呼叫函數libnet_destroy()來釋放傳回的libnet handle。
libnet_t *libnet_cq_remove_by_label(char *label);
- 返回值:成功傳回一個libnet handle。失敗傳回NULL。
- 參數:
label標籤。 - 功能:根據變數
label來將特定的libnet handle從libnet handle鏈結串列內移除,成功傳回libnet handle後必須還要呼叫函數libnet_destroy()來釋放傳回的libnet handle。
const char *libnet_cq_getlabel(libnet_t *l);
- 返回值:成功傳回
label,失敗傳回NULL。 - 參數:
l一個libnet handle。 - 功能:傳回變數
l的label。
libnet_t *libnet_cq_find_by_label(char *label);
- 返回值:成功傳回一個libnet handle。失敗傳回NULL。
- 參數:
label標籤。 - 功能:根據變數
label來取回特定的libnet handle。
void libnet_cq_destroy(void);
- 功能:釋放整個libnet handle鏈結串列。
libnet_t *libnet_cq_head(void);
- 返回值:成功傳回一個libnet handle。失敗傳回NULL。
- 功能:取得libnet handle鏈結串列的第一個libnet handle。
int libnet_cq_last(void);
- 返回值:到達末端傳回0,其餘傳回1。
- 功能:判斷目前libnet handle鏈結串列是否到達末端。
libnet_t *libnet_cq_next(void);
- 返回值:成功傳回一個libnet handle。失敗傳回NULL。
- 功能:取得libnet handle鏈結串列中下一個libnet handle。
uint32_t libnet_cq_size(void);
- 返回值:libnet handle鏈結串列中libnet handle總數。
- 功能:傳回libnet handle鏈結串列中libnet handle總數。
libnet Port chain相關
int libnet_plist_chain_new(libnet_t *l, libnet_plist_t **plist, char *token_list);
- 返回值:成功傳回1,失敗傳回-1。
- 參數:
l一個libnet handle。plist一個指向libnet_plist_t *的指標。token_listPort列表。 - 功能:產生一個Port列表,
token_list可接受的字元有:0123456789-,。
int libnet_plist_chain_next_pair(libnet_plist_t *plist, uint16_t *bport, uint16_t *eport);
- 返回值:成功傳回1,列表為空傳回0,失敗傳回-1。
- 參數:
plist一個指向libnet_plist_t的指標。bport開始Port。eport結束Port。 - 功能:從
plist取得下一對可用的Port。
int libnet_plist_chain_free(libnet_plist_t *plist);
- 返回值:成功傳回1,失敗傳回-1。
- 參數:
plist一個指向libnet_plist_t的指標 - 功能:釋放從函數
libnet_plist_chain_new()分配給plist的資源。
輔助函數
const char *libnet_getdevice(libnet_t *l);
- 返回值:傳回
l所開啟的Interface,失敗傳回NULL,錯誤訊息由libnet_geterror()取得。 - 參數:
l一個libnet handle。 - 功能:傳回
l所開啟的Interface,如果在呼叫函數libnet_init()時第二個參數是NULL,且並沒有讓libnet使用類似libnet_get_ipaddr4()的函數讓libnet自動取得的話,會傳回NULL。
void libnet_stats(libnet_t *l, struct libnet_stats *ls);
- 參數:
l一個libnet handle。ls狀態結果結構。 - 功能:取得
l的封包送出狀態。