交叉编译自己的TcpDump工具

前言

对于网络抓包工具,大家肯定都听过或用过,譬如,强大的WireShark,支持Window和Linux平台;还有linux系统的TcpDump命令行工具。作为一名嵌入式开发工程师,开发过程中,难免会遇到没有图形界面的情况,在linux系统下,此时就需要用TcpDump来进行抓包工作了,然后通过WireShark对抓包文件进行分析。
但是如果你的OS中不带有TcpDump怎么办呢?此时就需要自己针对自己的平台编译一个TcpDump了。

一、准备工作

到TcpDump官网下载tcpdump和libpcap的源码,https://www.tcpdump.org/

方法一


点击这两处,分别下载tcpdump和libpcap,tar -vzxf tcpdump-4.99.4.tar.gztar -vzxf libpcap-1.10.4.tar.gz解压。
可能会下载不完整,导致解压失败。

方法二

在这里插入图片描述
通过git clone源代码。
比较慢,中途还可能会和github断连,也不是很稳定。

方法三

利用上面的URL
https://github.com/the-tcpdump-group/tcpdump
https://github.com/the-tcpdump-group/libpcap
访问github,选择方法一提供的版本的分支,此处
tcpdump就选择tcpdump-4.99这个分支,下载Zip包。
libpcap就选择libpcap-1.10这个分支,下载Zip包。
这种方式,个人觉得最稳妥。因为前面两种方式我都失败了!!!   ( ̄_ ̄|||)
                                  |||

二、编译步骤

1.创建工程

mkdir ~/tcpdump-tool	// 创建工程目录

将下载好的tcpdump-tcpdump-4.99.ziplibpcap-libpcap-1.10.zip拷贝到工程目录并解压

cp tcpdump-tcpdump-4.99.zip ~/tcpdump-tool	// 将tcpdump-tcpdump-4.99.zip拷贝到工程目录
cp libpcap-libpcap-1.10.zip ~/tcpdump-tool	// 将libpcap-libpcap-1.10.zip拷贝到工程目录
// 解压
unzip tcpdump-tcpdump-4.99.zip
unzip libpcap-libpcap-1.10.zip

2.交叉编译

编译tcpdump需要检查时候正确安装libpcap,所以我们需要先编译libpcap。

2.1交叉编译libpcap库

cd ~/tcpdump-tool/libpcap-libpcap-1.10		// 切换工作目录

mkdir build		// 创建构建目录
cd build
// 配置软件的编译选项和检查环境
../configure --host=[指定交叉编译环境的目标架构] --with-pcap=linux
cmake ..	// 生成Makefile文件
make	// 编译,链接,构建软件
sudo make install DESTDIR=[预安装的目录路径]		// 默认路径 /usr/local
  • 小白(第一次的我):交叉编译环境的目标架构是什么东西,--host=后面怎么配置啊?
  • 其他博主给的例子:../configure --prefix=$PWD/install --host=arm-linux-gnueabihf --with-pcap=linux
  • 我的应该怎么写呢?其实就是你交叉编译时的交叉编译器的名称不要最后的-gcc

例如:常见的的交叉编译器arm-linux-gcc,它的目标架构就是arm-linux;交叉编译器arm-linux-gnueabi-gcc的目标架构就是arm-linux-gnueabi

  • 如果忘记自己的编译器名称怎么办呢?那你应该是配了环境的变量的,通过echo $CC就可以查看你的编译器名称了。
    这都是默认你配好了你的交叉编译环境的情况,至少交叉编译了一个Hello World程序!!!
  • “emm~,其他博文在运行configure脚本的时候都加了 --prefix选项欸,你的不加没事吗?”
  • 我(小白):“后退,我要开始装*了。”
  • 当然没事,最后的make install,我指定了安装路径 ( •̀ ω •́ )✧
    其实是那个configure脚本太长了,本人又不会改,所以用这种方法。

  例子:

cd ~/tcpdump-tool/libpcap-libpcap-1.10		// 切换工作目录

mkdir build		// 创建构建目录
cd build
// 配置软件的编译选项和检查环境
../configure --host=arm-linux --with-pcap=linux
cmake ..	// 生成Makefile文件
make	// 编译,链接,构建软件
sudo make install DESTDIR=~/3Party/libpcap/		// 默认路径 /usr/local

也是不知道改configure脚本的哪里,暂时不得不操作的指令

cd ~/3Party/libpcap
//将多余的层级移除
mv usr/local/* ./
rm -r usr

2.2交叉编译tcpdump

cd ~/tcpdump-tool/tcpdump-tcpdump-4.99		// 切换工作目录
mkdir build		// 创建构建目录
cd build

因为此处的configure脚本会检查你的libpcap是否正确安装,所以在同级目录下建立软连接

sudo ln -s ~/3Party/libpcap libpcap		// 在此处建立libpcap的软连接
../configure --host=[指定交叉编译环境的目标架构] CFLAGS="-I./libpcap/include/ -L./libpcap/lib/"
make

  例子:

sudo ln -s ~/3Party/libpcap libpcap		// 在此处建立libpcap的软连接
../configure --host=arm-linux CFLAGS="-I./libpcap/include/ -L./libpcap/lib/"
make

现在ls应该可以在当前目录下看到一个tcpdump的二进制文件了。

file tcpdump		// 检查一下是否是Arm版本

当打印信息包含“ARM aarch64”字样,恭喜编译成功。

3.使用

将编译得到的tcpdump程序和libpcap库打包上传到你的开发板

// 打包程序
mkdir ~/my_tcpdump
cd ~/my_tcpdump
cp ~/tcpdump-tool/tcpdump-tcpdump-4.99/build/tcpdump ~/my_tcpdump
cp ~/3Party/libpcap/lib/libpcap.so.1.10.5-PRE_GIT ~/my_tcpdump
tar -czvf my_tcpdump.tar.gz my_tcpdump
// 上传
scp my_tcpdump.tar.gz [username]@[xxx.xxx.xxx.xxx]:/home/[username]/

开发板上使用

cd ~	// 切换到文件上传的路径
tar -xzvf my_tcpdump.tar.gz		// 解压
cd my_tcpdump
sudo ln -s libpcap.so.1.10.5-PRE_GIT libpcap.so.1.10.5		// 建立软链
sudo ln -s libpcap.so.1.10.5 libpcap.so 
export LD_LIBRARY_PATH=`pwd`		// 添加环境变量
chmod a+x tcpdump		// 更改权限
./tcpdump -i eth0		//测试使用

至此,你应该已经完成了tcpdump的交叉编译和使用测试,
------------如果感到有用,麻烦一键三连,感激--------------


总结

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ] [ -s snaplen ] [ -w file ] [ expression ] 抓包选项: -c:指定要抓取的包数量。注意,是最终要获取这么多个包。例如,指定"-c 10"将获取10个包,但可能已经处理了100个包,只不过只有10个包是满足条件的包。 -i interface:指定tcpdump需要监听的接口。若未指定该选项,将从系统接口列表中搜寻编号最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo), :一旦找到第一个符合条件的接口,搜寻马上结束。可以使用'any'关键字表示所有网络接口。 -n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。 -nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。 -N:不打印出host的域名部分。例如tcpdump将会打印'nic'而不是'nic.ddn.mil'。 -P:指定要抓取的包是流入还是流出的包。可以给定的值为"in"、"out"和"inout",默认为"inout"。 -s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。对于要抓取的数据包较大时,长度设置不够可能会产生包截断,若出现包截断, :输出行中会出现"[|proto]"的标志(proto实际会显示为协议名)。但是抓取len越长,包的处理时间越长,并且会减少tcpdump可缓存的数据包的数量, :从而会导致数据包的丢失,所以在能抓取我们想要的包的前提下,抓取长度越小越好。 输出选项: -e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。 -q:快速打印输出。即打印很少的协议相关信息,从而输出行都比较简短。 -X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。 -XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。 -v:当分析和打印的时候,产生详细的输出。 -vv:产生比-v更详细的输出。 -vvv:产生比-vv更详细的输出。 其他功能性选项: -D:列出可用于抓包的接口。将会列出接口的数值编号和接口名,它们都可以用于"-i"后。 -F:从文件中读取抓包的表达式。若使用该选项,则命令行中给定的其他表达式都将失效。 -w:将抓包数据输出到文件中而不是标准输出。可以同时配合"-G time"选项使得输出文件每time秒就自动切换到另一个文件。可通过"-r"选项载入这些文件以进行分析和打印。 -r:从给定的数据包文件中读取数据。使用"-"表示从标准输入中读取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值