Go最新Zeek学习 —— IP协议解析_zeek 协议识别,2024年最新怒肝三个月啃完这110道面试题
在Zeek中,IP协议解析的核心函数是IP_Protocol::parse_ip_protocol
,它负责解析IP包头,识别上层协议类型,并调用相应的解析函数。以下是该函数的核心代码片段:
module IP;
type IP_Hdr: record {
ihl: uint4;
version: uint4;
tos: uint8;
len: uint16;
id: uint16;
flags: uint32 &log;
frag_off: uint16;
ttl: uint8;
proto: uint8;
checksum: uint16 &checksum;
src: addr;
dst: addr;
options: vector of uint8 &length=ihl*4 - 20;
};
event ip_packet(hdr: IP_Hdr, payload: string) &priority=-5;
function parse_ip_protocol(hdr: IP_Hdr, payload: string): bool {
local proto = hdr$proto;
local len = |payload|;
local parsed = F;
# 根据IP头部协议字段,调用相应的解析函数
case proto of {
0 -> {
# 处理协议: 本地网络
event ip_proto_reserved(hdr=hdr, payload=payload);
parsed = T;
}
1 -> {
# 处理协议: ICMP
ICMP::parse_icmp(hdr, payload);
parsed = T;
}
2 -> {
# 处理协议: IGMP
IGMP::parse_igmp(hdr, payload);
parsed = T;
}
6 -> {
# 处理协议: TCP
TCP::parse_tcp(hdr, payload);
parsed = T;
}
8 -> {
# 处理协议: EGP
event ip_proto_egp(hdr=hdr, payload=payload);
parsed = T;
}
9 -> {
# 处理协议: IGRP
event ip_proto_igrp(hdr=hdr, payload=payload);
parsed = T;
}
17 -> {
# 处理协议: UDP
UDP::parse_udp(hdr, payload);
parsed = T;
}
41 -> {
# 处理协议: IPv6
event ip_proto_ipv6(hdr=hdr, payload=payload);
parsed = T;
}
89 -> {
# 处理协议: OSPF
event ip_proto_ospf(hdr=hdr, payload=payload);
parsed = T;
}
}
# 如果没有匹配到协议,则发出未知协议的事件
if (! parsed)
event ip_proto_unknown(hdr=hdr, payload=payload);
return parsed;
}
这段代码展示了如何在Zeek中解析IP协议头并根据上层协议类型调用相应的解析函数。如果没有找到匹配的协议,它会发出一个ip_proto_unknown
事件。这个函数是协议识别的核心,对于学习网络协议分析的开发者来说具有很好的示例价值。
评论已关闭