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);
- 返回值:主機名稱。
- 參數:
in
IPv4的網路順序地址。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);
- 參數:
addr
libnet的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。
- 參數:
hrd
Hardware type。pro
Protocol type。hln
Hardware length。pln
Protocol length。op
ARP operation。sha
Source hardware address。spa
Source protocol address。tha
Target hardware address。tpa
Target 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。
- 參數:
op
ARP operation。sha
Source hardware address。spa
Source protocol address。tha
Target hardware address。tpa
Target 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。
- 參數:
dst
Destination MAC address。src
Source MAC address。type
Next 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。
- 參數:
dst
Destination MAC address。type
Next 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。
- 參數:
type
ICMP Type。code
ICMP Code。sum
Checksum,0表示交由libnet計算。id
ICMP Identification。seq
ICMP 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_len
IP Total Length。tos
Type of Service。id
IP Identification。frag
IP Fragment and Offset。ttl
Time to Live。prot
Next Protocol。sum
Checksum,0表示交由libnet計算。src
Source IP Address。dst
Destination 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。
- 參數:
len
IP Total Length。prot
Next Protocol。dst
Destination 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。
- 參數:
sp
Source Port。dp
Destination Port。len
UDP Length。sum
Checksum,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_s
TCP 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。
- 參數:
sp
Source Port。dp
Destination Port。seq
Sequence Number。ack
Acknowledgment Number。control
TCP Flags,可以用TH_FIN
、TH_SYN
、TH_RST
、TH_PUSH
、TH_ACK
、TH_URG
、TH_ECE
以及TH_CWR
,假如需要SYN+ACK,則使用TH_SYN | TH_ACK
表示。win
Window Size。sum
Checksum,0表示交由libnet計算。urg
Urgent Pointer。len
TCP 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_list
Port列表。 - 功能:產生一個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
的封包送出狀態。