`
wezly
  • 浏览: 487308 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

底层网络开发库之libnet

阅读更多

在Unix系统平台上的网络安全工具开发中,目前最为流行的C API library有libnet、libpcap、libnids和 libicmp等。它们分别从不同层次和角度提供了不同的功能函数。使网络开发人员能够忽略网络底层细节的实现,从而专注于程序本身具体功能的设计与开 发。其中,

* libnet提供的接口函数主要实现和封装了数据包的构造和发送过程。

* libpcap提供的接口函数主要实现和封装了与数据包截获有关的过程。

* libnids提供的接口函数主要实现了开发网络入侵监测系统所必须的一些结构框架。

* libicmp等相对较为简单,它封装的是ICMP数据包的主要处理过程(构造、发送、接收等)。

利用这些C函数库的接口,网络安全工具开发人员可以很方便地编写出具有结构化强、健壮性好、可移植性高等特点的程序,如scanner、sniffer、firewall、IDS等。


---[ libnet ]------------------------------------------

libnet 库的最新版本为1.0.0,它一共约7600行C源代码,33个源程序文件,12个C头文件,50余个自定义函数,提供的接口函数包含15种数据包生成器 和两种数据包发送器(IP层和数据链路层)。目前只支持IPv4,不支持IPv6。已经过测试的系统平台包括:

* OpenBSD 2.6snap, 2.5, 2.4, 2.3, 2.2 (i386)
* FreeBSD 4.0-STABLE, 3.3-STABLE, 3.2-RELEASE, 3.1-CURRENT, 3.0, 2.2 (i386)
* NetBSD 1.3.2 (i386)
* BSD/OS 3.x (i386)
* BSDi 3.0 (i386)
* Linux 2.2.x, 2.0.3x, 2.1.124 (i386, alpha) (libc: 2.4.x, glibc: 2.0.x)
* Solaris 7 (SPARC, gcc 2.7.2[13], 2.8.2), 2.6 (SPARC, gcc 2.8.2),
2.5.x (SPARC, gcc 2.7.2[13])
* IRIX 6.2
* MacOS 5.3rhapsody (powerpc)

libnet提供的接口函数按其作用可分为四类:

* 内存管理(分配和释放)函数
* 地址解析函数
* 数据包构造函数
* 数据包发送函数

以下分别列出这些接口函数及其功能(其参数含义简单易懂,不再解释):


★ 内存管理函数

单数据包内存初始化:
int libnet_init_packet(u_short packet_size, u_char **buf);

单数据包内存释放:
void libnet_destroy_packet(u_char **buf);

多数据包内存初始化:
int libnet_init_packet_arena(struct libnet_arena **arena,u_short packet_num, u_short packet_size);

访问多数据包内存中的下一个数据包:
u_char *libnet_next_packet_from_arena(struct libnet_arena **arena,u_short packet_size);

多数据包内存释放:
void libnet_destroy_packet_arena(struct libnet_arena **arena);


★ 地址解析函数

解析主机名:
u_char *libnet_host_lookup(u_long ip, u_short use_name);

解析主机名(可重入函数):
void libnet_host_lookup_r(u_long ip, u_short use_name, u_char *buf);

域名解析:
u_long libnet_name_resolve(u_char *ip, u_short use_name);

获取接口设备IP地址:
u_long libnet_get_ipaddr(struct libnet_link_int *l,const u_char *device, const u_char *ebuf);

获取接口设备硬件地址:
struct ether_addr *libnet_get_hwaddr(struct libnet_link_int *l,const u_char *device,const u_char *ebuf);


★ 数据包构造函数

ARP协议数据包:
int libnet_build_arp(u_short hrdw, u_short prot, u_short h_len,u_short p_len, u_short op, u_char *s_ha,
u_char *s_pa, u_char *t_ha, u_char *t_pa,const u_char *payload, int payload_len,u_char *packet_buf);

DNS协议数据包:
int libnet_build_dns(u_short id, u_short flags, u_short num_q,u_short num_answ_rr, u_short num_auth_rr,
u_short num_add_rr, const u_char * payload,int payload_len, u_char *packet_buf);

以太网协议数据包:
int libnet_build_ethernet(u_char *daddr, u_char *saddr, u_short id,const u_char *payload, int payload_len,
u_char *packet_buf);

ICMP协议数据包(ICMP_ECHO / ICMP_ECHOREPLY):
int libnet_build_icmp_echo(u_char type, u_char code, u_short id,
u_short seq, const u_char *payload,int payload_len, u_char *packet_buf);

ICMP协议数据包(ICMP_MASKREQ / ICMP_MASKREPLY):
int libnet_build_icmp_mask(u_char type, u_char code, u_short id,
u_short seq, u_long mask,const u_char *payload, int payload_len,
u_char *packet_buf);

ICMP协议数据包(ICMP_UNREACH):
int libnet_build_icmp_unreach(u_char type, u_char code,
u_short orig_len, u_char orig_tos,u_short orig_id, u_short orig_frag,
u_char orig_ttl, u_char orig_prot,u_long orig_saddr, u_long orig_daddr,
const u_char *payload, int payload_len,u_char *packet_buf);

ICMP协议数据包(ICMP_TIMEXCEED):
int libnet_build_icmp_timeexceed(u_char type, u_char code,
u_short orig_len, u_char orig_tos,u_short orig_id, u_short orig_frag,
u_char orig_ttl, u_char orig_prot,u_long orig_saddr, u_long orig_daddr,
const u_char *payload, int payload_len,u_char *packet_buf);

ICMP协议数据包(ICMP_REDIRECT):
int libnet_build_icmp_redirect(u_char type, u_char code, u_long gateway,
u_short orig_len, u_char orig_tos,u_short orig_id, u_short orig_frag,
u_char orig_ttl, u_char orig_prot,u_long orig_saddr, u_long orig_daddr,
const u_char *payload, int payload_len,u_char *packet_buf);

ICMP协议数据包(ICMP_TSTAMP / ICMP_TSTAMPREPLY):
int libnet_build_icmp_timestamp(u_char type, u_char code, u_short id,
u_short seq, n_time otime, n_time rtime,n_time ttime, const u_char *payload,
int payload_len, u_char *packet_buf);

IGMP协议数据包:
int libnet_build_igmp(u_char type, u_char code, u_long ip,
const u_char *payload, int payload_len,u_char *packet_buf);

IP协议数据包:
int libnet_build_ip(u_short len, u_char tos, u_short ip_id, u_short frag,u_char ttl, u_char protocol, u_long saddr, u_long daddr, const u_char *payload, int payload_len,u_char *packet_buf);

OSPF路由协议数据包:
int libnet_build_ospf(u_short len, u_char type, u_long router_id,u_long area_id, u_short auth_type,
const char *payload, int payload_s, u_char *buf);

OSPF路由协议数据包(Hello):
int libnet_build_ospf_hello(u_long netmask, u_short interval,
u_char options, u_char priority,u_int dead_interval, u_long des_router,
u_long backup, u_long neighbor,const char *payload, int payload_s,u_char *buf);

OSPF路由协议数据包(DataBase Description (DBD)):
int libnet_build_ospf_dbd(u_short len, u_char options, u_char type,
u_int sequence_num, const char *payload,int payload_s, u_char *buf);

OSPF路由协议数据包(Link State Request (LSR)):
int libnet_build_ospf_lsr(u_int type, u_int ls_id, u_long adv_router,
const char *payload, int payload_s,u_char *buf);

OSPF路由协议数据包(Link State Update (LSU)):
int libnet_build_ospf_lsu(u_int num, const char *payload,int payload_s, u_char *buf);

OSPF路由协议数据包(Link State Acknowledgement (LSA)):
int libnet_build_ospf_lsa(u_short age, u_char options, u_char type,u_int ls_id, u_long adv_router, u_int sequence_num, u_short len,const char *payload, int payload_s,u_char *buf);

OSPF路由协议数据包(OSPF Link Sate NetworkLink State Router):
int libnet_build_ospf_lsa_net(u_long netmask, u_int router_id,
const char *payload, int payload_s,u_char *buf);

OSPF路由协议数据包(Link State Router):
int libnet_build_ospf_lsa_rtr(u_short flags, u_short num, u_int id,
u_int data, u_char type, u_char tos,u_short metric, const char *payload,int payload_s, u_char *buf);

OSPF路由协议数据包(Link State Summary):
int libnet_build_ospf_lsa_sum(u_long netmask, u_int metric, u_int tos,
const char *payload, int payload_s,u_char *buf);

OSPF路由协议数据包(Link State AS External):
int libnet_build_ospf_lsa_as(u_long netmask, u_int metric,
u_long fwd_addr, u_int tag,const char *payload, int payload_s,u_char *buf);

RIP路由协议数据包:
int libnet_build_rip(u_char cmd, u_char ver, u_short domain,
u_short addr_fam, u_short route_tag, u_long ip,u_long mask, u_long next_hop, u_long metric,
const u_char *payload, int payload_len,u_char *packet_buf);

TCP协议数据包:
int libnet_build_tcp(u_short th_sport, u_short th_dport, u_long th_seq,
u_long th_ack, u_char th_flags, u_short th_win,u_short th_urg, const u_char *payload,int payload_len, u_char *packet_buf);

UDP协议数据包:
int libnet_build_udp(u_short sport, u_short dport, const u_char *payload,int payload_len, u_char *packet_buf);

IP协议数据包选项:
int libnet_insert_ipo(struct ipoption *opt, u_char opt_len,u_char *packet_buf);

TCP协议数据包选项:
int libnet_insert_tcpo(struct tcpoption *opt, u_char opt_len,u_char *packet_buf);


★ 数据包发送函数

打开raw socket:
int libnet_open_raw_sock(int protocol);

关闭raw socket:
int libnet_close_raw_sock(int socket);

选择接口设备:
int libnet_select_device(struct sockaddr_in *sin,
u_char **device, u_char *ebuf);

打开链路层接口设备:
struct libnet_link_int *libnet_open_link_interface(char *device,char *ebuf);

关闭链路层接口设备:
int libnet_close_link_interface(struct libnet_link_int *l);

发送IP数据包:
int libnet_write_ip(int socket, u_char *packet, int packet_size);

发送链路层数据包:
int libnet_write_link_layer(struct libnet_link_int *l,const u_char *device, u_char *packet,int packet_size);

检验和计算:
int libnet_do_checksum(u_char *packet, int protocol, int packet_size);


★ 相关的支持函数

随机数种子生成器:
int libnet_seed_prand();

获取随机数:
u_long libnet_get_prand(int modulus);

16进制数据输出:
void libnet_hex_dump(u_char * buf, int len, int swap, FILE *stream);

端口列表链初始化:
int libnet_plist_chain_new(struct libnet_plist_chain **plist,char *token_list);


获取端口列表链的下一项(端口范围):
int libnet_plist_chain_next_pair(struct libnet_plist_chain *plist,u_short *bport, u_short *eport);

端口列表链输出显示:
int libnet_plist_chain_dump(struct libnet_plist_chain *plist);

获取端口列表链:
u_char *libnet_plist_chain_dump_string(struct libnet_plist_chain *plist);

端口列表链内存释放:
void libnet_plist_chain_free(struct libnet_plist_chain *plist);

 

分享到:
评论

相关推荐

    libnet

    这个库的核心功能是提供一套API(应用程序编程接口),允许程序员在不同操作系统上构建和注入自定义的网络数据包,而无需依赖底层的网络驱动或者操作系统特性。libnet的主要应用领域包括网络安全研究、网络工具开发...

    封装网络底层库

    libnet是一个小型的接口函数库,主要用C语言写成,提供了低层网络数据包的构造...libnet的开发目的是:建立一个简单统一的网络编程接口以屏蔽不同操作系统底层网络编程的差别,使得程序员将精力集中在解决关键问题上。

    数据包构造和发送开发包libnet

    Libnet是一款强大的开源库,主要用于在底层网络层构造和发送自定义的数据包。它为开发者提供了灵活、低级别的网络编程接口,使得程序员可以精确控制网络数据包的每一比特,这对于网络安全研究、网络协议分析和网络...

    libnet-libnet-1.2-rc3(vs2010完整编译生成dll及lib文件包含源码)

    1. **libnet库**:Libnet是一个开源的C语言库,用于开发底层网络协议,尤其是构造和发送原始网络数据包。它可以用于创建自定义网络协议,进行网络安全研究,或者进行网络设备的诊断和测试。 2. **VS2010编译环境**...

    libnet学习参考资料

    通过这些资料,学习者可以全面了解libnet库的使用,掌握底层网络编程技术,并了解如何利用这些技术进行安全测试或开发网络安全工具。特别是对于网络攻防和安全研究者来说,libnet是一个不可多得的工具和学习资源。

    libnids-libpcap-libnet库源码合辑

    在IT领域,网络编程是构建高效、稳定网络应用的基础,而`libnids`、`libpcap`和`libnet`是三个重要的开源库,它们分别提供了不同的功能,为网络开发人员提供了强大的工具集。下面我们将详细探讨这三个库的功能、应用...

    libnet-1.1.5.zip

    描述中提到,“libnet是一个小型的接口函数库”,这表示它是一个程序员可以使用的工具集,提供了对底层网络操作的API。它“主要用C语言写成”,意味着这个库是为那些熟悉C语言的开发者设计的,他们可以通过C语言来...

    libnet for windows

    libnet在Windows平台上提供了开发网络应用程序的能力,特别是那些需要底层网络控制的程序,例如嗅探、伪造或操纵网络流量。这个资源特别适合开发者,尤其是对网络安全和网络编程感兴趣的程序员。 **libnet详解:** ...

    libnet-0.10.11.zip

    这意味着开发者可以专注于应用层逻辑,而不是底层网络协议的实现。 **标签解析:** "libnet 库函数" 指的是 libnet 库提供的各种函数,这些函数可以用来创建、填充和发送网络数据包。库函数通常包括初始化、错误...

    libnet-1.0.2.tar.gz

    libnet是一款强大的网络编程库,它为开发者提供了底层的网络协议构造和发送功能。libnet-1.0.2是这个库的一个稳定版本,对于那些需要低版本库以确保兼容性的项目来说,这是一个理想的选择。本文将详细介绍libnet-...

    libnet函数库

    Libnet是一个强大的C语言编写的网络发包库,专为开发人员设计,用于在各种操作系统平台上构建网络协议栈或进行底层网络通信。它提供了底层网络编程所需的接口,支持Linux、macOS和Windows NT等不同的操作系统。通过...

    libnet-1.1.2.1和1.1.4

    libnet是一个开源的C语言库,主要用于网络协议构造和底层网络数据包的构造。它为开发者提供了构建各种网络协议头的能力,如TCP/IP,UDP等,并能将这些数据包发送到目标网络接口,这对于网络编程和安全研究非常有用。...

    libnet-1.1.2.1编译版

    1. **libnet库的功能**:libnet允许程序员在底层网络层操作,如构造和发送自定义协议数据包,支持多种协议如TCP/IP、UDP、ICMP等。 2. **编译流程**:从源代码到编译成可执行文件,通常涉及预处理、编译、汇编和...

    libnet-1.1.5.tar.gz

    libnet的开发目的是:建立一个简单统一的网络编程接口以屏蔽不同操作系统底层网络编程的差别,使得程序员将精力集中在解决关键问题上。 2010-11-09 更新的1.1.5版本,是截至上传日的最新版本,请问轻信高版本号的...

    libnet使用visual studio2013编译 工程文件

    Libnet是一个开源的C语言库,主要设计用于简化网络协议的底层构造和发送。它提供了一套API,使得开发者无需深入理解网络协议栈的复杂性,就能构建和注入自定义的数据包到网络中。这个库特别适用于网络协议分析、安全...

    libnet-1.1.2.1-2.1.i386.rpm.zip

    《libnet-1.1.2.1-2.1.i386.rpm:便捷的网络编程库》 libnet库是网络编程领域中的一个重要工具,尤其对于那些需要底层网络...无论是对于开发还是维护,libnet都是一个强大的工具,尤其是在需要底层网络控制的场景下。

    isic依赖库libnet

    libnet是一个小型的接口函数库,主要用C语言写成,提供了低层网络数据包的构造...libnet的开发目的是:建立一个简单统一的网络编程接口以屏蔽不同操作系统底层网络编程的差别,使得程序员将精力集中在解决关键问题上。

    libnet-1.1.6

    它提供了一个灵活的接口,使得程序员能够构建和注入各种网络协议的数据包,而无需深入理解底层网络操作的复杂性。这个库在开发网络应用、安全测试、网络嗅探和分析等方面具有广泛的应用。 libnet-1.1.6主要包含以下...

    网络开发工具包

    ### 网络开发工具包概述 在网络开发与测试领域,掌握有效的工具是提升效率与质量的关键。本文将深入探讨“网络开发工具包”,重点介绍socket原始套接字、libpcap...希望本文能为您的网络开发之旅提供有价值的参考。

    刘文涛 网络安全开发包 难得宝库

    在网络安全领域,开发和研究往往需要深入底层,理解网络数据包的捕获与分析是至关重要的。本文将围绕"刘文涛网络安全开发包"展开,详细解析其中包含的重要组件,以及它们在实际应用中的作用。 首先,我们来关注...

Global site tag (gtag.js) - Google Analytics