粉丝不过W
Libpcap
pcap_open_live( )
/*
*function:
* 打开一个网络结构畸形数据包捕获
*parameter:
* device: 网络接口的名字
* snaplen: 捕获数据包的长度
* promise: 1代表混杂模式,其它非混杂模式
* to_ms: 等待时间
* ebuf: 存储错误信息
*return:
* 一个Libpcap句柄
*/
pcap_t *pcap_open_live(const char *device,
int snaplen,
int promisc,
int to_ms,
char *ebuf)
pcap_close( )
/*
*function:
* 关闭Libpcap操作,并销毁相应的资源
*parameter:
* p: 需要关闭的Libpcap句柄
*/
void pcap_close(pcap_t *p)
pcap_compile( )
/*
*function:
* 编译BPF过滤规则
*parameter:
* p: Libpcap句柄
* program: bpf过滤规则
* buf: 过滤规则字符串
* optimize: 优化
* mask: 掩码
*return:
* 成功: 0
* 失败: -1
*/
int pcap_compile(pcap_t *p,
struct bpf_program *program,
char *buf,
int optimize,
bpf_u_int32 mask)
pcap_setfilter( )
/*
*function:
* 设置BPF过滤规则
*parameter:
* p: Libpcap句柄
* fp: BPF过滤规则
*return:
* 成功: 0
* 失败: -1
*/
int pcap_setfilter(pcap *p,
struct bpf_program *fp)
pcap_next( )
/*
*function:
* 捕获一个网络数据包
*parameter:
* p: Libpcap句柄
* h: 数据包头
*return:
* 捕获的数据包的地址
*/
const u_char *pcap_next(pcap_t *p,
struct pcap_pkthdr *h)
pcap_loop( )
/*
*function:
* 循环捕获网络数据包,直到遇到错误或者满足退出条件
*每次捕获一个数据包就会调用callback指示的回调函数,所以可在回调函数中进行数据包的处理操作
*parameter:
* p: Libpcap句柄
* cnt: 指定捕获数据包的个数,如-1,会永无休止的捕获
* callback:回调函数
* user: 向回调函数中传递的参数
*return:
* 成功:0
* 失败:负数
*/
int pcap_loop(pcap_t *p,
int cnt,
pcap_handler callback,
u_char *user);
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, const u_char *);
Libnet
libnet_init( )
/*
*function:
* 数据包内存初始化及环境建立
*marapeter:
* injection_type: 构造的类型
* LIBNET_LINK
* LIBNET_RAW4
* LIBNET_LINK_ADV
* LIBNET_RAW4_ADV
* device: 网络接口,如 "eth0", 或IP地址,也可为NULL(自动查询搜索)
* err_buf: 存放出错的信息
*return:
* 成功: 一个libnet句柄
* 失败: NULL
*/
libnet_t *libnet_init(int injection_type, char *device, char *err_buf)
libnet_destroy( )
/*
*function:
* 释放资源
*parameter:
* l: libnet_init返回的句柄
*/
void libnet_destroy(libnet_t *l);
libnet_addr2name4( )
/*
*function:
* 将网络字节序转换成点分十进制数串
*parameter:
* in: 网络字节序的ip地址
* use_name: LIBNET_RESOLVE、LIBNET_DONT_RESOLVE
*return:
* 成功: 点分十进制ip地址
* 失败: NULL
*/
char* libnet_addr2name4(u_int32_t in, u_int8_t use_name)
libnet_name2addr4( )
/*
*function:
* 将点分十进制数串转换为网络字节序ip地址
*parameter:
* l: libnet句柄
* host_name: 点分十进制数串的地址
* use_name: LIBNET_RESOLVE, LIBNET_DONT_RESOLVE
*return:
* 成功: 网络字节序ip地址
* 失败: -1
*/
u_int32_t libnet_name2addr4(libnet_t *l, char *host_name, u_int8_t use_name)
libnet_get_ipaddr4( )
/*
*function:
* 获取接口设备ip地址
*parameter:
* l: libnet句柄
*return:
* 成功: 网络字节序的ip地址
* 失败: -1
*/
u_int32_t libnet_get_ipaddr4(libnet_t *l)
bnet_get_hwaddr( )
/*
*function:
* 获取接口设备硬件地址
*parameter:
* l : libnet句柄
*return:
* 成功: 指向MAC地址的指针
* 失败: NULL
*/
struct libnet_ether_addr* libnet_get_hwaddr(libnet_t *l)
libnet_build_udp( )
/*
*function:
* 构造udp数据包
*parameter:
* sp: 源端口号
* dp: 目的端口号
* len: udp包总长度
* sum: 校验和,设为0,libnet自动填充
* payload: 负载,可设为NULL
* payload_s: 负载长度,或为0
* l: libnet句柄
* ptag: 协议标记
*return:
* 成功: 协议标记
* 失败: -1
*/
libnet_ptag_t libnet_build_udp(u_int16_t sp,
u_int16_t dp,
u_int16_t len,
u_int16_t sum,
u_int8_t *payload,
u_int32_t payload_s,
libnet_t *l,
libnet_ptag_t ptag)
libnet_build_tcp( )
/*
*function:
* 构造tcp数据包
*parameter:
* sp: 源端口号
* dp: 目的端口号
* seq: 序号
* ack: ack标记
* control: 控制标记
* win: 窗口大小
* sum: 校验和,设为0,ibnet自动填充
* urg: 紧急指针
* len: tcp包长度
* payload: 负载,可设为NULL
* payload_s: 负载长度,或为0
* l: libnet句柄
* ptag: 协议标记
*return:
* 成功: 协议标记
* 失败: -1
*/
libnet_ptag_t libnet_build_tcp(u_int16_t sp, u_int16_t dp,
u_int32_t seq, u_int32_t ack,
u_int8_t control, u_int16_t win
u_int16_t sum, u_int16_t urg,
u_int16_t len, u_int8_t *payload,
u_int32_t payload_s, libnet_t *l,
libnet_ptag_t ptag)
libnet_build_tcp_options( )
/*
*function:
* 构造tcp选项数据包
*parameter:
* options: tcp选项字符串
* options_s: 选项长度
* l: libnet句柄
* ptag: 协议标记,若为0, 建立一个新的协议
*return:
* 成功: 协议标记
* 失败: -1
*/
libnet_ptag_t libnet_build_tcp_options(u_int8_t *options,
u_int32_t options_s,
libnet_t *l,
libnet_ptag_t ptag)
libnet_build_ipv4( )
/*
*function:
* 构造一个 IPv4 数据包
*parameter:
* ip_len: ip 包总长
* tos: 服务类型
* id: ip标识
* fla***偏移
* ttl: 生存时间
* prot: 上层协议
* sum: 校验和,设为0,libnet自动填充
* src: 源ip地址
* dst: 目的ip地址
* payload: 负载,可设为NULL
* payload_s: 负载长度,或为0
* l: libnet句柄
* ptag: 协议标记
*return:
* 成功: 协议标记
* 失败: -1
*/
libnet_ptag_t libnet_build_ipv4(u_int16_t ip_len, u_int8_t tos,
u_int16_t id, u_int16_t flag,
u_int8_t ttl, u_int8_t prot,
u_int16 sum, u_int32_t src,
u_int32_t dst, u_int8_t *payload,
u_int32_t payload_s, libnet_t *l,
libnet_ptag_t ptag);
libnet_build_ipv4_options( )
/*
*function:
* 构造IPv4选项数据包
*parameter:
* options: tcp选项字符串
* options_s: 选项长度
* l: libnet句柄
* ptag: 协议标记,若为0,建立一个新的协议
*return:
* 成功: 协议标记
* 失败: -1
*/
libnet_ptag_t libnet_build_ipv4_options(u_int8_t *options,
u_int32_t options,
libnet_t *l,
libnet_ptag_t ptag)
libnet_build_arp( )
/*
*function:
* 构造 arp 数据包
*parameter:
* hrd: 硬件地址格式, ARPHRD_ETHER( 以太网)
* pro: 协议地址格式, ETHERTYPE_IP( IP协议)
* hln: 硬件地址长度
* pln: 协议地址长度
* op: ARP协议操作类型 1: ARP请求,2: ARP回应,3: RARP请求,4: RARP回应
* sha: 发送者硬件地址
* spa: 发送者协议地址
* tha: 目标硬件地址
* tpa: 目标协议地址
* payload: 负载,可设为NULL
* payload_s:负载长度,或为0
* l: libnet句柄
* ptag: 协议标记
*return:
* 成功: 协议标记
* 失败: -1
*/
libnet_ptag_t libnet_build_arp(u_int16_t hrd, u_int16_t pro,
u_int8_t hln, u_int8_t pln,
u_int16_t op, u_int8_t *sha,
u_int8_t *spa, u_int8_t *tha,
u_int8_t *tpa, u_int8_t *payload,
u_int32_t payload_s, libnet_t *l,
libnet_ptag_t ptag)
libnet_build_ethernet( )
/*
*function:
* 构造一个以太网数据包
*parameter:
* dst: 目的 mac
* src: 源mac
* type: 上层协议类型
* payload: 负载,即附带的数据
* payload_s: 负载长度
* l: libnet句柄
* ptag: 协议标记
*return:
* 成功: 协议标记
* 失败: -1
*/
libnet_ptag_t libnet_build_ethernet(u_int8_t *dst,
u_int8_t *src,
u_int16_t type,
u_int8_t *payload,
u_int32_t payload_s,
libnet_t *l,
libnet_ptag_t ptag)