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_NONELIBNET_LINKLIBNET_RAW4LIBNET_RAW6LIBNET_LINK_ADVLIBNET_RAW4_ADV以及LIBNET_RAW6_ADVdevice要開啟的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_LINKLIBNET_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_FINTH_SYNTH_RSTTH_PUSHTH_ACKTH_URGTH_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。
  • 功能:傳回變數llabel


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的封包送出狀態。

results matching ""

    No results matching ""