Zeek 中 IRC 文件传输提取与 Files 框架集成:深入 base/protocols/irc/files.zeek
网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载本文以 Zeek 仓库中的 base/protocols/irc/files.zeek 脚本及其 Zeekygen 参考文档doc/scripts/base/protocols/irc/files.zeek.rst为核心系统讲解 Zeek 如何为 IRC 协议接入 Files 文件分析框架从记录扩展、文件句柄fuid生成、协议注册到 DCC 传输中文件名与 MIME 类型的自动补全再到集群环境下的注意事项。读完本文你将理解 IRC 会话日志irc.log中fuid字段的来源与含义掌握IRC::get_file_handle的自定义方式并能借助 Files 框架对 IRC 传输的文件做溯源与深度分析。一、背景IRC 分析器与文件分析框架的衔接点Zeek 的 IRC 支持由module IRC承载核心会话脚本位于 scripts/base/protocols/irc/main.zeek它定义了IRC::Info记录含ts、uid、id、nick、user、command、value、addl等字段并通过Log::create_stream(..., $pathirc)将 IRC 命令与会话信息写入irc.log同时用Analyzer::register_for_ports在默认端口 6666/6667/6668/6669/tcp 上启用 IRC 分析器。然而IRC 传输的真正“内容”往往不是命令文本而是通过 DCCDirect Client-to-Client协议传输的文件。要让 Zeek 像对待 HTTP、FTP 那样对 IRC 承载的文件进行提取、重组、MIME 嗅探和深度分析就必须让 IRC 分析器与 Files 框架对接。这正是files.zeek的职责所在它是 IRC 协议与 base/frameworks/files 框架之间的“适配层”。该脚本通过三个load指令建立依赖./dcc-sendDCC 传输预期管理、base/utils/conn-ids连接标识工具、base/frameworks/files文件框架本体。从源码结构看files.zeek本身不直接分析文件内容而是负责两件事一是为 Files 框架提供生成文件句柄的回调二是在文件事件中把 DCC 上下文文件名、MIME 类型回填到 IRC 会话记录。二、记录扩展IRC::Info.fuid与fa_file.ircfiles.zeek的export块首先对两个记录做了redef扩展这是它与 Files 框架交互的数据基础redef record Info { ## File unique ID. fuid: string log optional; }; redef record fa_file { irc: IRC::Info optional; };IRC::Info.fuidstring log optional文件唯一 IDFile Unique ID。它是 Files 框架分配给每个被跟踪文件句柄的标识符与文件分析框架产生的files.log中的fuid一一对应。正因为它带log属性irc.log的每条记录都能携带本次会话关联文件的fuid从而把 IRC 会话日志与文件分析日志files.log、文件内容日志串联起来——这是溯源“谁在 IRC 上传了什么文件”的关键字段。fa_file.ircIRC::Info optional反向挂在 Files 框架的fa_file记录上让每个被跟踪的文件都能携带其所属的 IRC 会话信息。optional表示该字段并非每个文件都存在例如非 IRC 来源的文件就没有此字段脚本中通过f?$irc这样的字段存在性判断来安全访问。这种“双向挂接”的设计体现了 Zeek 脚本常见的扩展模式在源记录上增加输出字段在框架记录上增加上下文引用二者在事件处理阶段完成拼接。三、文件句柄提供者IRC::get_file_handle文档摘要中列出的唯一函数是IRC::get_file_handle其类型签名在源码中声明并实现如下global get_file_handle: function(c: connection, is_orig: bool): string; function get_file_handle(c: connection, is_orig: bool): string { return cat(Analyzer::ANALYZER_IRC_DATA, c$start_time, c$id, is_orig); }该函数接收连接c与方向标志is_orig返回一个字符串作为文件的唯一句柄。其实现将ANALYZER_IRC_DATA分析器标签、连接开始时间、连接四元组c$id和方向拼接起来cat。从源码结构看这样生成的句柄天然具备两个特性唯一性连接标识加时间戳足以区分同一连接上不同方向、不同时间段的文件可复现性给定相同的连接与方向信息生成的句柄稳定一致便于跨日志关联。值得注意的是IRC::Info.fuid正是这个返回值。在后续file_over_new_connection事件中脚本执行irc$fuid f$id;——f$id即 Files 框架为文件分配的唯一 ID它由get_file_handle回调产生详见第五节从而把 IRC 会话记录与文件 ID 正式绑定。自定义文件句柄策略时可以用redef覆盖IRC::get_file_handle注意需保持相同签名例如在集群环境中把 worker 节点信息加入句柄以避免不同 worker 之间 fuid 冲突。四、协议注册zeek_init与Files::register_protocolfiles.zeek通过zeek_init事件优先级 5把 IRC 的 DATA 分析器注册进 Files 框架event zeek_init() priority5 { Files::register_protocol(Analyzer::ANALYZER_IRC_DATA, Files::ProtoRegistration($get_file_handle IRC::get_file_handle)); }Files::register_protocol的签名与ProtoRegistration记录定义在 scripts/base/frameworks/files/main.zeektype ProtoRegistration: record { ## A callback to generate a file handle on demand when ## one is needed by the core. get_file_handle: function(c: connection, is_orig: bool): string; ## A callback to describe a file. ... describe: function(f: fa_file): string defaultfunction(f: fa_file): string { return ; }; }; global register_protocol: function(tag: Analyzer::Tag, reg: ProtoRegistration): bool;要点解读注册以分析器标签为键ANALYZER_IRC_DATA是 IRC 数据通道即 DCC 文件传输所用连接的分析器标签每个协议只能为同一标签注册一次回调重复注册时register_protocol返回false。ProtoRegistration至少需要get_file_handle回调describe回调带默认实现返回空字符串IRC 未提供自定义描述这与 HTTP 用 URL 描述文件的策略不同——从源码看IRC 的文件描述保持默认空值。注意注册的是ANALYZER_IRC_DATA而非ANALYZER_IRC这体现了 IRC 分析器的“双连接”模型——命令通道IRC与数据通道IRC_DATA即 DCC 文件传输被区分对待只有数据通道上的流量才会被 Files 框架追踪为文件。五、Files 框架的底层回调机制理解get_file_handle何时被调用需要看 Files 框架核心脚本 scripts/base/frameworks/files/main.zeek 中的同名事件get_file_handleevent get_file_handle(tag: Analyzer::Tag, c: connection, is_orig: bool) priority5 { if ( tag !in registered_protocols ) { if ( ! missing_get_file_handle_warned[tag] ) { missing_get_file_handle_warned[tag] T; Reporter::warning(fmt(get_file_handle() handler missing for %s, tag)); } set_file_handle(fmt(%s-fallback-%s-%s-%s, tag, c$uid, is_orig, network_time())); return; } local handler registered_protocols[tag]; set_file_handle(handler$get_file_handle(c, is_orig)); }这一实现揭示了三条重要事实每当 Files 核心需要为新连接上的文件生成句柄时就会触发该事件并通过set_file_handle落地若某分析器标签没有注册回调框架会发出get_file_handle() handler missing告警并退回到一个“fallback”格式的句柄tag-fallback-uid-is_orig-时间——这正是files.zeek必须在zeek_init中抢先注册回调的原因已注册的回调通过registered_protocols[tag]表查找并执行IRC::get_file_handle的返回值最终成为文件 ID 并回填到fuid。此外file_new优先级 10与file_over_new_connection优先级 10事件是 Files 框架侧更高优先级的通用处理器负责set_info(f)、重组缓冲区设置等基础设施工作IRC 脚本的处理器特意取优先级 5保证在框架基础工作完成后、其他低优先级处理器之前执行。六、事件联动把 DCC 上下文回填到文件files.zeek通过两个文件事件完成 IRC 上下文与文件对象的融合event file_over_new_connection(f: fa_file, c: connection, is_orig: bool) priority5 { if ( [c$id$resp_h, c$id$resp_p] !in dcc_expected_transfers ) return; local irc dcc_expected_transfers[c$id$resp_h, c$id$resp_p]; irc$fuid f$id; if ( irc?$dcc_file_name ) f$info$filename irc$dcc_file_name; f$irc irc; } event file_sniff(f: fa_file, meta: fa_metadata) priority5 { if ( f?$irc meta?$mime_type ) f$irc$dcc_mime_type meta$mime_type; }file_over_new_connection当一个文件与新连接关联时触发。逻辑分三步用连接响应方地址/端口[c$id$resp_h, c$id$resp_p]查询dcc_expected_transfers表——该表由 dcc-send.zeek 维护记录了“预期将要发生的 DCC 传输”若命中说明这条连接就是 IRC 信令中预告过的 DCC 传输把文件 ID 写入 IRC 会话记录irc$fuid f$id若预告信息中含文件名dcc_file_name则把它设置为文件的filename元数据f$info$filename使后续文件分析能直接使用原始文件名最后将整个 IRC 记录挂到f$irc。file_sniff文件内容经 MIME 嗅探后触发。若文件确实来自 IRCf?$irc且嗅探出了 MIME 类型则回填f$irc$dcc_mime_type。这一步让irc.log在文件分析完成后能记录“这个 DCC 文件实际是什么类型”与预告的文件名相互印证。七、与 DCC 传输预告机制的协作files.zeek的功能高度依赖 dcc-send.zeek 的预告机制。该脚本注释中给出了一个典型的 DCC 触发示例PRIVMSG my_nick :^ADCC SEND whateverfile.zip 3640061780 1026 41709^Airc_dcc_message事件优先级 5解析出dcc_type、文件名argument、目标地址address、端口dest_port与大小size后仅对SEND类型做处理c$irc$dcc_file_name argument; c$irc$dcc_file_size size; local p count_to_port(dest_port, tcp); Analyzer::schedule_analyzer(0.0.0.0, address, p, Analyzer::ANALYZER_IRC_DATA, 5 min); dcc_expected_transfers[address, p] c$irc;关键机制梳理预期表dcc_expected_transfers: table[addr, port] of Info read_expire5mins以“目标地址端口”为键记录 5 分钟内到期自动清理表中保存的Info随后成为f$irc的内容来源调度分析器Analyzer::schedule_analyzer(0.0.0.0, address, p, Analyzer::ANALYZER_IRC_DATA, 5 min)主动在目标地址/端口上调度 IRC DATA 分析器让 Zeek 即使在该连接尚未建立时也知道该跟踪什么容量防护max_dcc_expected_transfers: count 5000 redef设为 0 可禁用检查超过上限时上报irc_max_dcc_expected_transfers_exceededweird防止被攻击者用大量假 DCC 预告撑爆表服务标记scheduled_analyzer_applied优先级 10命中预期表时为连接添加c$service[irc-dcc-data]服务标签并注册连接移除钩子finalize_irc_data用于在连接结束时清理残留的预期状态。集群模式下的关键注意点源码注释中明确警告DCC 预告A 对 B 说与实际传输连接B 与 C 之间可能落在不同 worker上。为此 dcc-send.zeek 采用 proxy/manager 中转worker 发现irc_dcc_message后把预告发布到代理轮询话题Cluster::rr_topic(Cluster::proxy_pool, dcc_transfer_rr_key)manager/proxy 再向所有 worker 广播dcc_transfer_add同样地dcc_transfer_remove、连接移除钩子中的清理也会通过集群发布同步。若单机运行或传输连接恰在同 worker则直接写本地表并调度分析器。八、测试验证与实战使用仓库测试目录提供了 IRC DCC 功能的直接验证素材testing/btest/scripts/base/protocols/irc/basic.test用$TRACES/irc-dcc-send.pcapng重放 DCC 传输并处理irc_dcc_send_ack事件打印已接收字节数testing/btest/scripts/base/protocols/irc/events.test同样基于irc-dcc-send.pcapng逐一触发并输出 IRC 相关事件testing/btest/scripts/base/protocols/irc/max-dcc-send-expected.zeek通过redef IRC::max_dcc_expected_transfers 15;压测预期表容量限制验证irc_max_dcc_expected_transfers_exceededweird 的触发路径dcc-first-command.zeek、malformed-dcc.zeek覆盖 DCC 命令顺序异常与畸形主机/端口等边界场景。你可以用仓库内的 pcap 痕迹快速验证完整链路离线模式即可无需真实网络zeek -b -r testing/btest/Traces/irc/irc-dcc-send.pcapng scripts/base/protocols/irc运行后观察输出irc.log中应出现带fuid、dcc_file_name、dcc_file_size、dcc_mime_type的记录files.log中对应fuid的文件条目与之一致若同时加载文件分析策略如scripts/policy/frameworks/files/下的提取脚本还能看到实际提取出的文件内容。九、扩展实践基于 fuid 的跨日志溯源利用IRC::Info.fuid这一设计可以实现典型的“IRC 文件溯源”查询以irc.log中的fuid为键在files.log中查找同一fuid即可获得文件大小、MIME 类型、分析器标签、甚至files.log关联的文件内容 IDsource/fuid链配合files.log中total_bytes、seen_bytes等字段可评估传输完成度。若需要自定义句柄生成策略例如集群中按 worker 区分命名空间可按如下方式覆盖保持签名一致redef IRC::get_file_handle function(c: connection, is_orig: bool): string { return cat(my-irc, c$start_time, c$id, is_orig); };需要注意fuid同时被写入irc.log与files.log自定义时必须保证同连接同方向的返回值稳定一致否则两条日志将无法关联。十、小结base/protocols/irc/files.zeek是理解 Zeek 协议分析器与 Files 框架协作方式的极佳范例它的核心贡献可归纳为三点记录扩展为IRC::Info增加fuid输出字段为fa_file增加irc上下文字段打通会话日志与文件日志句柄提供通过IRC::get_file_handle生成稳定唯一的文件 ID并经zeek_init注册到Files::register_protocol使 Files 核心在有需要时回调上下文回填利用file_over_new_connection与file_sniff事件把 DCC 预告的文件名与实际嗅探的 MIME 类型写入 IRC 会话记录。结合 dcc-send.zeek 的预期传输表、集群发布机制与 main.zeek 的底层回调实现读者既能直接上手使用也能照此模式为其他自定义协议编写自己的文件集成脚本。赞分享网络安全网络IDS【免费下载链接】zeekZeek is a powerful network analysis framework that is much different from the typical IDS you may know.项目地址https://gitcode.com/gh_mirrors/ze/zeek点击查看免费下载相关推荐Zeek 的 IRC 协议分析base/protocols/irc 包结构、日志模型与 DCC 文件提取实战指南Zeek 的 IRC 协议分析base/protocols/irc 包结构、日志模型与 DCC 文件提取实战指南 本指南围绕 Zeek 仓库中 base/pr网络安全网络IDSZeek 文件提取实战深入解析 base/files/extract 框架与 FileExtract 模块Zeek 文件提取实战深入解析 base/files/extract 框架与 FileExtract 模块 导读 本文围绕 Zeek 内置脚本包 base/f网络安全网络IDSZeek 智能框架Intel Framework的文件分析集成base/frameworks/intel/files.zeek 深度解析Zeek 智能框架Intel Framework的文件分析集成 base/frameworks/intel/files.zeek 深度解析 base/fr网络安全网络IDS上一篇rkt 生产环境用户案例全览从 BlaBlaCar 到 Kubernetes 的落地实践下一篇Flutter Go终极指南掌握go-cli命令行工具快速开发Flutter组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Kun Design 模式深度指南:AI 设计工作台与设计→代码一体化闭环

Kun Design 模式深度指南:AI 设计工作台与设计→代码一体化闭环

人工智能AI Agent自主智能体桌面应用MCP Clients 【免费下载链接】Kun Local-first AI agent workspace for coding, writing, design, research, and automation — one runtime for desktop GUI and TUI. 项目地址: https://gitcode.com/gh_mirrors/de/Kun 点击查…

2026/10/10 4:01:54 阅读更多 →
context-mode实战:为AI编程与多项目开发打造干净的上下文环境

context-mode实战:为AI编程与多项目开发打造干净的上下文环境

1. 先搞清楚 context-mode 到底解决什么问题老实说,我第一次在工具链里看到context-mode这个参数时,第一反应是"又一个装腔作势的配置项"。但真把它用起来之后,我反而觉得这个名字起得相当准——它不是在堆功能,而是在管…

2026/10/10 4:01:58 阅读更多 →
计算机网络笔试高频考点解析:从OSI模型到子网划分实战

计算机网络笔试高频考点解析:从OSI模型到子网划分实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 4:02:01 阅读更多 →

最新新闻

博客系统测试实战:从功能到安全的完整复盘

博客系统测试实战:从功能到安全的完整复盘

如果你接到一个博客系统的测试任务,最怕的不是用例写不完整,而是测了半天没抓到重点,最后报告写得像流水账。最近我完整测了一套从零搭建的博客系统,从用户登录、文章发布、评论互动,到并发压测、浏览器兼容和基础安全…

2026/10/10 12:07:43 阅读更多 →
商城接口安全设计:签名验签、防重放与越权校验怎么落地

商城接口安全设计:签名验签、防重放与越权校验怎么落地

商城接口被改价,是上线后最容易出、也最难查的一类安全问题。客户端提交订单时把 price 从 199 改成 0.01,服务端直接信任这个值入库;或者抓一次下单请求原样重发几百次,把优惠券、积分、库存刷穿。很多团队的第一反应是"我们…

2026/10/10 12:07:43 阅读更多 →
高效测试用例设计指南:从等价类到场景法的完整实践

高效测试用例设计指南:从等价类到场景法的完整实践

写了这么多年测试用例,我最深的感受是:大多数人不是不会写用例,而是把“写用例”当成了“填空题”——按照模板把字段填满,评审一过,就扔进用例库吃灰。等版本上线出了线上故障,回来看用例库,发…

2026/10/10 12:07:43 阅读更多 →
2026跨境卖家生死局:平台新政下,这类店铺正在被批量清退

2026跨境卖家生死局:平台新政下,这类店铺正在被批量清退

2026年下半年,跨境电商行业迎来新一轮平台规则密集调整。与以往小范围灰度测试不同,本轮新政直接指向店铺的底层经营资质与履约能力,多个主流平台同步升级了审核模型,清退动作从“个别警告”转向“批量执行”。 清退重点&#xff…

2026/10/10 12:07:43 阅读更多 →
BEM模型实战:从战略解码到人才需求推导的完整操作流程

BEM模型实战:从战略解码到人才需求推导的完整操作流程

简介:这份PPT资料聚焦华为BEM业务战略执行力模型,面向企业管理者、战略规划与运营岗位人员,以及希望系统理解战略解码方法的学习者,帮助解决战略目标难以分解落地、组织KPI与重点工作脱节等实际问题。压缩包内共1个pptx文件&#…

2026/10/10 12:07:43 阅读更多 →
小模型干大事路线图:从 GLiNER v2 60M 到 340M Decide,轻量 NER 路线的三招可复制打法

小模型干大事路线图:从 GLiNER v2 60M 到 340M Decide,轻量 NER 路线的三招可复制打法

小模型干大事路线图:从 GLiNER v2 60M 到 340M Decide,轻量 NER 路线的三招可复制打法 【免费下载链接】GLiNER2.5-Decide 项目地址: https://ai.gitcode.com/hf_mirrors/fastino/GLiNER2.5-Decide 过去两年,中文技术社区讨论"小…

2026/10/10 12:06:42 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →