原始套接字--包过滤器BPF学习记录

参考文章:https://blog.csdn.net/jin787730090/article/details/117993915

可以使用以下命令生成bpf code

bash 复制代码
tcpdump -dd -i lo port 6172

输出如下结果

bash 复制代码
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 8, 0x000086dd },
{ 0x30, 0, 0, 0x00000014 },
{ 0x15, 2, 0, 0x00000084 },
{ 0x15, 1, 0, 0x00000006 },
{ 0x15, 0, 17, 0x00000011 },
{ 0x28, 0, 0, 0x00000036 },
{ 0x15, 14, 0, 0x0000181c },
{ 0x28, 0, 0, 0x00000038 },
{ 0x15, 12, 13, 0x0000181c },
{ 0x15, 0, 12, 0x00000800 },
{ 0x30, 0, 0, 0x00000017 },
{ 0x15, 2, 0, 0x00000084 },
{ 0x15, 1, 0, 0x00000006 },
{ 0x15, 0, 8, 0x00000011 },
{ 0x28, 0, 0, 0x00000014 },
{ 0x45, 6, 0, 0x00001fff },
{ 0xb1, 0, 0, 0x0000000e },
{ 0x48, 0, 0, 0x0000000e },
{ 0x15, 2, 0, 0x0000181c },
{ 0x48, 0, 0, 0x00000010 },
{ 0x15, 0, 1, 0x0000181c },
{ 0x6, 0, 0, 0x00040000 },
{ 0x6, 0, 0, 0x00000000 },

tcpdump 提供了 -d 选项来阐述这段数字的意义

bash 复制代码
tcpdump -d -i lo port 6172
bash 复制代码
(000) ldh      [12]
(001) jeq      #0x86dd          jt 2    jf 10
(002) ldb      [20]
(003) jeq      #0x84            jt 6    jf 4
(004) jeq      #0x6             jt 6    jf 5
(005) jeq      #0x11            jt 6    jf 23
(006) ldh      [54]
(007) jeq      #0x181c          jt 22   jf 8
(008) ldh      [56]
(009) jeq      #0x181c          jt 22   jf 23
(010) jeq      #0x800           jt 11   jf 23
(011) ldb      [23]
(012) jeq      #0x84            jt 15   jf 13
(013) jeq      #0x6             jt 15   jf 14
(014) jeq      #0x11            jt 15   jf 23
(015) ldh      [20]
(016) jset     #0x1fff          jt 23   jf 17
(017) ldxb     4*([14]&0xf)
(018) ldh      [x + 14]
(019) jeq      #0x181c          jt 22   jf 20
(020) ldh      [x + 16]
(021) jeq      #0x181c          jt 22   jf 23
(022) ret      #262144
(023) ret      #0

其中 ld是加载某位的数据,jeq是做相等比较

bash 复制代码
(000) ldh      [12]      // 加载数据包的第12个字节
(001) jeq      #0x86dd   jt 2    jf 10    // 判断是否为IPv6数据包,如果是,跳转到第2行,否则跳转到第10行
(002) ldb      [20]      // 加载数据包的第20个字节
(003) jeq      #0x84     jt 6    jf 4     // 判断是否为ICMPv6数据包,如果是,跳转到第6行,否则跳转到第4行
(004) jeq      #0x6      jt 6    jf 5     // 判断是否为TCP数据包,如果是,跳转到第6行,否则跳转到第5行
(005) jeq      #0x11     jt 6    jf 23    // 判断是否为UDP数据包,如果是,跳转到第6行,否则跳转到第23行
(006) ldh      [54]      // 加载数据包的第54个字节,即TCP或UDP源端口
(007) jeq      #0x181c   jt 22   jf 8     // 判断源端口是否为6172,如果是,跳转到第22行,否则跳转到第8行
(008) ldh      [56]      // 加载数据包的第56个字节,即TCP或UDP目标端口
(009) jeq      #0x181c   jt 22   jf 23    // 判断目标端口是否为6172,如果是,跳转到第22行,否则跳转到第23行
(010) jeq      #0x800    jt 11   jf 23    // 判断是否为IPv4数据包,如果是,跳转到第11行,否则跳转到第23行
(011) ldb      [23]      // 加载数据包的第23个字节,即IPv4或IPv6协议版本号
(012) jeq      #0x84     jt 15   jf 13    // 判断是否为ICMPv6数据包,如果是,跳转到第15行,否则跳转到第13行
(013) jeq      #0x6      jt 15   jf 14    // 判断是否为TCP数据包,如果是,跳转到第15行,否则跳转到第14行
(014) jeq      #0x11     jt 15   jf 23    // 判断是否为UDP数据包,如果是,跳转到第15行,否则跳转到第23行
(015) ldh      [20]      // 加载数据包的第20个字节,即IP协议字段
(016) jset     #0x1fff   jt 23   jf 17    // 判断IP协议字段的值是否满足条件,如果满足,跳转到第23行,否则跳转到第17行
(017) ldxb     4*([14]&0xf)  // 根据数据包的第14个字节计算偏移量
(018) ldh      [x + 14]  // 加载偏移量位置的字节
(019) jeq      #0x181c   jt 22   jf 20    // 判断该字节是否为6172,如果是,跳转到第22行,否则跳转到第20行
(020) ldh      [x + 16]  // 加载偏移量+16位置的字节
(021) jeq      #0x181c   jt 22   jf 23    // 判断该字节是否为6172,如果是,跳转到第22行,否则跳转到第23行
(022) ret      #262144   // 匹配成功,返回262144
(023) ret      #0        // 匹配失败,返回0
相关推荐
yuyanjingtao9 分钟前
CCF-GESP 等级考试 2025年9月认证C++一级真题解析
c++·青少年编程·gesp·csp-j/s
xzk2012100219 分钟前
洛谷 P1438 无聊的数列 题解
c++·算法·树状数组
00后程序员张22 分钟前
C++ string 类使用攻略
开发语言·c++
OKkankan25 分钟前
list的使用和模拟实现
数据结构·c++·算法·list
keep intensify1 小时前
Redis基础指令全解析:从入门到精通
linux·数据库·c++·redis
爱吃生蚝的于勒1 小时前
【Linux】零基础学会linux环境基础开发工具使用(yum,vim,makefile,gdb)
linux·服务器·数据结构·c++·蓝桥杯·编辑器·vim
R-G-B1 小时前
【34】MFC入门到精通——MFC 控件 ComboBox 运行点击控件下拉框 “终止“、“重试“、“忽略“、“引发异常”
c++·mfc·combobox“引发异常”·“终止“·“重试“·“忽略“·“引发异常”
零基础的修炼1 小时前
Linux---线程封装
linux·c++·算法
给大佬递杯卡布奇诺2 小时前
FFmpeg 基本API avio_read函数内部调用流程分析
c++·ffmpeg·音视频
liulilittle2 小时前
Y组合子剖析:C++ 中的递归魔法
开发语言·c++·编程语言·函数式编程·函数式·函数编程·y组合子