hu1y40's blog

hu1y40'blog
天堂的穹空遍布地狱之火的颜色,但也是天堂。
  1. 首页
  2. MISC
  3. 正文

libpcap库及其C语言调用

2023年10月7日 1413点热度 0人点赞 0条评论

libpcap C语言调用

简介

由于本人需要写一款安卓抓包程序,所以决定C语言写一个.so库供kotlin进行调用,来抓取网卡的包。

安装步骤

  1. 下载libpcap
  2. 解压 tar -zxvf <filename>
  3. 安装libpcap
  • 进入其文件夹操作一下命令
  • ./configure
    make
    sudo make install
  • 这时候ls /usr/local/include应该能看见pcap.h文件。
  1. 随后是在文件/etc/ld.so.conf的末尾直接添加/usr/local/lib
  • 这里原因是/etc/ld.so.conf此文件记录了编译时使用的动态库的路径,也就是加载so库的路径。
  • 默认情况下,编译器指挥使用/lib和/usr/lib这两个目录下的库文件。而通常通过源码包进行安装时,如果不指定--prefix会将库安装在/usr/local目录下。这样虽然安装了源码包,但是使用时仍然找不到相关的.so库,就会报错。也就是说系统不知道安装了源码包。

测试代码

#include <pcap.h>
#include <stdio.h>

int main()
{
char errBuf[PCAP_ERRBUF_SIZE], * device;
device = pcap_lookupdev(errBuf);
if(device)
{
printf("device: %s\n", device);
}
else
{
printf("error: %s\n", errBuf);
}
return 0;
}

fig:

函数使用方法

以下汉化均为本人渣翻,如有错误概不负责!请自行参考官方文档

pcap_findalldevs

pcap_findalldevs 获得一个网卡列表

pcap_freealldevs free pcap_if_t的空间,也就是上面这个列表的空间。

#include <pcap/pcap.h>

char errbuf[PCAP_ERRBUF_SIZE];

int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);
void pcap_freealldevs(pcap_if_t *alldevs);

pcap_findalldevs()构造一个网络设备的数组,这个数组能被pcap_create(3PCAP) 和pcap_activate(3PCAP) 或 pcap_open_live(3PCAP)调用。

struct pcap_if {
struct pcap_if *next;
char *name; /* name to hand to "pcap_open_live()" */
char *description; /* textual description of interface, or NULL */
struct pcap_addr *addresses;
bpf_u_int32 flags; /* PCAP_IF_ interface flags */
};

pcap_if_t结构

pcap_lookupnet

int pcap_lookupnet(const char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *errbuf);

确定所制定名字的网卡的IPV4的网络号和掩码。(因为是网络所以x.x.x.0)

pcap_open_live

#include <pcap/pcap.h>

char errbuf[PCAP_ERRBUF_SIZE];

pcap_t *pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, char *errbuf);

返回的这个类型在1.10.0版本已经没有定义了,只有一个typedef。原先定义是在<pcap-int.h>中。

其参数为device name。snaplen时设置句柄上的数据包长度。promisc设定是否为接口为混杂模式。如果promisc非零。则设置混杂模式。to_ms 设定数据包的timeout时间。

pcap_dump_open

将pcap_t *类型的句柄和filename传入,无则创建文件,有则覆盖写入文件。

#include <pcap/pcap.h>

pcap_dumper_t *pcap_dump_open(pcap_t *p, const char *fname);
pcap_dumper_t *pcap_dump_open_append(pcap_t *p, const char *fname);
pcap_dumper_t *pcap_dump_fopen(pcap_t *p, FILE *fp);

pcap_dump_fopen打开一个文件流,随后通过pcap_dump_close来关闭。

pcap_compile

#include <pcap/pcap.h>

int pcap_compile(pcap_t *p, struct bpf_program *fp, const char *str, int optimize, bpf_u_int32 netmask);

将str编译成过滤程序。optimize决定是否结果代码进行优化。netmask指定捕获网络上的ipv4网络掩码。如果不知道网络掩码,或者要捕获“any”接口的数据包。使用PCAP_NETMASK_UNKNOWsN。

在libpcap 1.8.0及更高版本中pcap_compile()可以在单个进程中的多个线程中使用。

pcap_setfilter

#include <pcap/pcap.h>

int pcap_setfilter(pcap_t *p, struct bpf_program *fp);

指定过滤程序。

pcap_dump

#include <pcap/pcap.h>

void pcap_dump(u_char *user, struct pcap_pkthdr *h, u_char *sp);

将数据包输出到pcap_dump_open打开的文件。user参数的类型时pcap_dump_t

标签: MISC
最后更新:2023年10月7日

hu1y40

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • libpcap C语言调用
    • 简介
    • 安装步骤
    • 测试代码
    • 函数使用方法
      • pcap_findalldevs
      • pcap_lookupnet
      • pcap_open_live
      • pcap_dump_open
      • pcap_compile
      • pcap_setfilter
      • pcap_dump

分类目录

  • 0day安全
  • Bypass
  • C++Prime
  • CTF
  • DoS
  • DoS
  • FUZZ
  • iot
  • JSONP
  • MISC
  • MISC
  • PHP伪协议
  • Python
  • REVERSE
  • sqli-labs
  • SQL注入
  • Trick
  • UAF
  • WEB
  • WEB
  • XXE
  • 书籍阅读
  • 二进制
  • 代码阅读
  • 信息搜集
  • 信息泄露
  • 加密与解密
  • 双重释放漏洞
  • 反序列化
  • 命令执行
  • 命令执行
  • 堆溢出
  • 密码学
  • 弱加密
  • 提权漏洞
  • 整数溢出
  • 文件上传
  • 未分类
  • 栈溢出
  • 格式化字符串漏洞
  • 模型
  • 汇编语言
  • 渗透测试
  • 漏洞分析
  • 漏洞利用
  • 漏洞战争
  • 漏洞挖掘
  • 病毒分析
  • 越界读取
  • 路径遍历
  • 逻辑漏洞
  • 配置不当
  • 钓鱼
  • 靶场
最新 热点 随机
最新 热点 随机
加密算法 2023年度总结 RTSPServer StackOverflow Vulnerability FUZZ 总览篇 MP4Box 无限循环漏洞 CVE-2023-40477 Winrar RCE漏洞分析
sqli-labs 61-70 加密与解密 第4章实验 工商银行美国子公司遭LockBit勒索攻击 加密与解密 第8章 下 FUZZ 总览篇 bugku split_all

COPYRIGHT © 2023 hu1y40's blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

鄂ICP备2021009673号-1