让右键菜单只留下常用工具:Yakit 新版右键插件上手指南
原创 Yakit 2026-09-11 17:15 四川

把常用动作留在流量和数据包旁边。


💡从 CODEC 的右键扩展,到独立插件类型与按场景管理:把常用动作留在流量和数据包旁边。
一:以前的右键插件,为何需要重新整理?
分析一条 HTTP 流量时,我们经常想顺手做点事:提取几个字段,把一组响应汇总成表,或者处理当前请求。如果每次都复制数据、切换页面、粘贴运行,动作越小,来回切换越显得麻烦。
过去,带有特定右键标签的 CODEC 插件可以出现在菜单里。这个方式用起来直接,但编码转换与流量上下文动作混在同一种插件里;安装的工具多了,菜单里哪些常用、哪些偶尔才用,也缺少统一整理入口。
这次更新,给“在当前流量上执行一个动作”一个独立的位置:右键插件。
新版新增「Yak-右键插件」类型,并提供独立的「右键插件设置」页面。你可以按场景挑选插件、调整顺序、配置快捷键,还能决定新类型插件的结果放在弹窗、抽屉还是新页签中。

在流量列表中直接调用右键插件,常用工具触手可及
二:三类上下文,把插件放到合适的位置
新类型插件通过自己实现的 Hook 声明适用场景。一个插件可以只处理单条流量,也可以同时支持多条流量和数据包;管理页按场景分别展示可用动作。
场景 | 插件拿到什么 | 适合写什么工具 |
|---|---|---|
History 单选 | 上下文 ctx + 一条 HTTPFlow | 展示 URL、方法、状态码,提取当前流量特征 |
History 多选 | 上下文 ctx + 多条 HTTPFlow | 汇总选中流量、统计或生成表格 |
HTTP 数据包 | 上下文 ctx + 请求、响应字节数据 | 解析报文,生成可应用的数据包修改 |
这里的“上下文”很实用:插件可以知道自己从哪个页面触发、是右键还是快捷键触发、请求或响应是否存在,以及本次操作的 HTTPS 状态和参数。数据包场景不保证请求、响应同时存在,编写插件时需要分别判断。
💡插件实现了某个场景的入口函数后,才会出现在对应场景的可选列表中。安装或保存插件后,还需要在管理页添加到相应场景,才能从右键菜单调用。
三、怎么用?从安装到执行
可以先按下面的步骤,给 History 单选场景配置一个最常用的插件。
打开 Yakit 并连接引擎,进入 History 流量列表。
安装或创建右键插件。没有可用插件时,可从“获取插件”进入插件市场;自己编写时,在插件编辑器选择「Yak-右键插件」类型并保存。
回到 History,选中流量并打开右键菜单,点击「右键插件」菜单中的「管理右键插件」,打开「右键插件设置」页签。页面左侧标题为「编辑右键插件」,会定位到相应场景;数据包编辑器也有对应入口。
左侧选择“history右键插件(单选)”“history右键插件(多选)”或“数据包右键插件”。在右侧搜索插件名称、说明或 Hook,再点击添加,或拖到中间已选列表。
拖拽中间列表调整顺序,移除不常用的项。移除的是这个场景中的菜单绑定,不等于卸载插件。核心插件受保护,不能停用或移除。
在已选插件的设置菜单中点击「设置快捷键」;「Yak-右键插件」还可以通过「设置结果展示」选择「弹窗」「右侧抽屉」或「新页签」。
返回对应流量或数据包,右键点击插件即可执行。配置了快捷键后,在匹配场景、正确焦点和选中状态下可直接触发;它不是操作系统级的全局热键。
💡每个场景最多添加 15 个自定义插件,内置核心插件不占这个额度。History 多选插件一次最多处理 200 条选中的流量。

按场景管理右键插件,自由添加、移除,并设置结果展示方式。
带参数的插件可以从右键子菜单中的「修改参数」调整选项,再点击「执行插件」。再次使用时会复用已设置的参数;需要换一组条件时,重新修改参数即可。

处理 Web Fuzzer 请求时,插件可以先展示修改摘要,点击「应用修改」后直接回填请求编辑器,无需复制粘贴。如果执行后又手动改过请求,请重新执行插件,避免使用过时的修改结果。

插件生成修改摘要,点击「应用修改」即可将结果回填到 Web Fuzzer 请求编辑器,无需手动复制。

四、写一个自己的右键插件
下面沿用Yakit内置的单条流量模板:选中一条 History 记录,右键输出它的基本信息。创建插件时选择「Yak-右键插件」,保存后添加到单选场景,再从真实流量触发。
handleOneHTTPFlow = func(ctx, flow) {
table = yakit.NewTable("字段", "值")
table.Append("URL", flow.Url)
table.Append("Method", flow.Method)
table.Append("Status", flow.StatusCode)
table.Append("HTTPS", ctx.HttpsState())
yakit.Output(table)
}YAK
4.1 三个 Hook 分别做什么?
Hook 就是插件的入口函数:你从哪个场景调用插件,Yakit 就执行对应的函数。按需求实现一个或多个入口即可,函数名和参数顺序保持如下写法。
入口函数 | 何时执行 参数是什么 | 适合做什么 |
|---|---|---|
handleOneHTTPFlow(ctx, flow) | 在 History 选中一条流量执行。ctx 是本次操作的上下文,flow 是这一条流量,可读取 URL、请求方法、状态码等信息。 | 提取字段、查看流量摘要、分析单条请求或响应。 |
handleMultiHTTPFlows(ctx, flows) | 在 History 勾选多条流量执行。flows 是本次选中的流量集合,可逐条遍历。 | 接口去重、状态码统计、批量提取和汇总表格。 |
handleHTTPPacket(ctx, request, response) | 在数据包编辑器执行。request 和 response 分别是请求、响应的原始内容;用 ctx.HasRequest()、ctx.HasResponse() 判断本次是否提供了相应数据。 | 整理请求头、处理参数、输出报文分析结果,或返回修改后的请求。 |
// History 单选:读取一条流量
handleOneHTTPFlow = func(ctx, flow) {
yakit.Output(flow.Url)
}
// History 多选:遍历本次选中的流量
handleMultiHTTPFlows = func(ctx, flows) {
for flow in flows {
yakit.Output(flow.Url)
}
}
// 数据包:先检查请求是否存在,再处理请求内容
handleHTTPPacket = func(ctx, request, response) {
if !ctx.HasRequest() {
return nil
}
yakit.Output(string(request))
}三个函数都能通过 yakit.Output(...) 展示结果。数据包入口如果需要改写 Web Fuzzer 请求,还要返回请求修改结果,具体写法见下方「联调请求整理器」。仅输出文本不会修改编辑器中的请求。
💡右键插件依赖真实上下文。当前编辑器会提示“保存后从右键菜单执行”,不要照搬普通脚本编辑器的直接运行方式。结果内容由插件输出,弹窗、抽屉或页签由用户配置,通常不需要为三种展示方式各写一份插件。
五、实战:批量选中流量,一键生成接口
看完单条流量的小例子,再做一个日常分析中能直接用上的工具:把选中的流量整理成接口清单。同一个接口翻了几页、返回过哪些状态码,不用再挨条复制和统计。
💡这个插件只读取选中的 HTTPFlow 并输出表格,不发送请求,不改写数据包。按“请求方法 + 去掉查询参数和片段后的完整 URL”聚合:同一站点下相当于按方法和路径去重,同时避免把不同站点的同名路径混在一起。次数仅统计本次选中的流量。
YAK
5.1 先把它放进多选右键菜单
新建插件,名称填写「接口清单」,类型选择「Yak-右键插件」,粘贴下方代码并保存。
打开「管理右键插件」入口,在「右键插件设置」页签左侧选择「history右键插件(多选)」,找到「接口清单」,点击添加或拖到中间已选列表。
在插件的设置菜单中选择「设置结果展示」→「右侧抽屉」,方便一边看清单,一边对照 History。
回到 History,勾选同一批次的几条演示流量,在「右键插件」菜单中执行「接口清单」。请勾选具体记录,当前批量入口最多处理 200 条。


YAK
5.2 完整代码:一次汇总选中的流量和验证
只需实现多选场景的 handleMultiHTTPFlows(ctx, flows)。代码先分组计数,再把结果一次性输出为 Yakit 表格;接口与状态码按输入中首次出现的顺序列出。
handleMultiHTTPFlows = func(ctx, flows) {
groups = {}
order = []
for flow in flows {
// 去掉查询参数和片段,保留站点,避免跨站点误合并
endpoint = str.SplitN(str.SplitN(flow.Url, "#", 2)[0], "?", 2)[0]
method = str.ToUpper(flow.Method)
key = method + " " + endpoint
if groups[key] == nil {
groups[key] = {"method": method, "endpoint": endpoint,
"count": 0, "statuses": [], "seen": {}}
order = append(order, key)
}
item = groups[key]
item["count"] = item["count"] + 1
status = sprintf("%v", flow.StatusCode)
if flow.StatusCode == 0 {
status = "未记录状态码"
}
if item["seen"][status] == nil {
item["seen"][status] = true
item["statuses"] = append(item["statuses"], status)
}
}
table = yakit.NewTable("方法", "接口(不含查询参数)", "状态码", "次数")
for key in order {
item = groups[key]
table.Append(item["method"], item["endpoint"],
str.Join(item["statuses"], ", "), item["count"])
}
yakit.Output(table)
}YAK
5.3 再多走一步:设置快捷键
回到「接口清单」的设置菜单,点击「设置快捷键」,录入一个未被占用的组合键。然后回到 History,勾选同一批流量,让焦点回到表格,按快捷键执行。


后续直接选择相应流量以后,使用设置好的快捷键即可快速调用插件。
六、进阶实战:整理联调请求,确认后直接回填 Web Fuzzer
右键插件还可以直接改写当前编辑器中的请求。例如,把抓到的请求整理成联调模板:去掉当前账号的认证信息和 URL 令牌,加上统一调试标记,再按需填入测试凭据发送。以前要逐处查找、删除和添加的内容,现在可以由一个动作完成。
同类能力也适合统一请求头、切换测试环境参数,或在修改业务参数后重新计算签名。下面先实现一个边界清楚的「联调请求整理器」:只处理指定头部与 URL 参数,保留请求体,并让用户确认后回填。
💡不用复制粘贴。本例的执行顺序是:插件生成修改后的请求和摘要 → 点击结果界面的「应用修改」→ Yakit前端替换原请求编辑器的内容。插件不调用发包接口,回填也不会自动发送;发送由你在 Web Fuzzer 中另行操作。
YAK
6.1 这个插件一次做哪些事?
参数或行为 | 效果 |
|---|---|
调试标记 | 设置 X-Debug-Tag,例如 replay-demo;只保留一个同名调试头。 |
移除指定认证头 | 启用后删除 Authorization、Cookie、X-API-Key。 |
移除指定 URL 令牌参数 | 启用后删除 access_token、token、api_key;匹配这些确切参数名,保留其他查询参数。 |
修改摘要 | 输出处理项目,不把删除的凭据值打印到结果里。 |
确认回填 | 返回请求替换结果,点击「应用修改」后由Yakit前端写回。 |
为减少对原请求的干扰,本例不解析或重新序列化 JSON,也不主动修改请求体业务字段;分块或压缩请求会提示后退出。它用于普通请求的联调整理,不适合要求报文字节完全不变的签名或特殊报文实验。
YAK
6.2 完整代码
创建「Yak-右键插件」,名称填写「联调请求整理器」,粘贴下面的代码并保存。调试标记和两个清理开关会显示在「修改参数」面板中。
debugTag = cli.String("debug-tag", cli.setDefault("replay-demo"),
cli.setVerboseName("调试标记"))
stripAuth = cli.Bool("strip-auth", cli.setDefault(true),
cli.setVerboseName("移除指定认证头"))
stripTokens = cli.Bool("strip-query-tokens", cli.setDefault(true),
cli.setVerboseName("移除指定 URL 令牌参数"))
cli.check()
handleHTTPPacket = func(ctx, request, response) {
if !ctx.HasRequest() || len(request) == 0 {
yakit.Warn("请从可编辑的请求区域触发")
return nil
}
if !re.Match("^[A-Za-z0-9._-]{1,64}$", debugTag) {
yakit.Warn("调试标记仅允许 1–64 位字母、数字、点、下划线和短横线")
return nil
}
// 本例只处理普通请求,避免重建分块或压缩报文
if poc.GetHTTPPacketHeader(request, "Transfer-Encoding") != "" ||
poc.GetHTTPPacketHeader(request, "Content-Encoding") != "" {
yakit.Warn("本例不处理分块或压缩请求")
return nil
}
packet = request
summary = yakit.NewTable("修改项", "处理结果")
if stripAuth {
for name in ["Authorization", "Cookie", "X-API-Key"] {
packet = poc.DeleteHTTPPacketHeader(packet, name)
}
summary.Append("认证头", "已移除 Authorization / Cookie / X-API-Key(如存在)")
}
if stripTokens {
for name in ["access_token", "token", "api_key"] {
packet = poc.DeleteHTTPPacketQueryParam(packet, name)
}
summary.Append("URL 参数", "已移除 access_token / token / api_key(如存在)")
}
// 先删除旧值,避免保留多个同名调试头
packet = poc.DeleteHTTPPacketHeader(packet, "X-Debug-Tag")
packet = poc.ReplaceHTTPPacketHeader(packet, "X-Debug-Tag", debugTag)
summary.Append("X-Debug-Tag", debugTag)
summary.Append("请求体", "不主动修改业务字段")
summary.Append("下一步", "点击「应用修改」回填;不会自动发送")
yakit.Output(summary)
return context.NewPacketResult(
context.ReplaceRequest(packet),
context.RequireConfirmation(true),
)
}yakit.Output(summary) 负责展示摘要;真正触发回填的是 return context.NewPacketResult(...)。context.ReplaceRequest(packet) 指定替换请求,context.RequireConfirmation(true) 要求用户点击确认。只输出请求文本不会替换编辑器内容。
YAK
6.3 Yakit完整操作:从右键到原文替换
打开「右键插件设置」,选择「数据包右键插件」,添加「联调请求整理器」。可将结果展示设置成「弹窗」或「右侧抽屉」。
把需要整理的请求放入 Web Fuzzer 左侧可编辑的请求区域,也可以从 History 将请求发送到 Web Fuzzer。
展开「右键插件」中的「联调请求整理器」,点击「修改参数」,把调试标记设为 replay-demo,并确认两个移除选项均已启用,再执行插件。已有参数缓存时尤其要检查选项。

结果中会展示修改摘要,并提示「插件返回了数据包修改」。此时先回到原编辑器看一眼,请求仍应保持原样。

点击「应用修改」,原编辑器中的认证头和指定 URL 参数被移除,出现 X-Debug-Tag。无需复制结果文本。
如果要继续发送,先检查并填入所需测试凭据,再使用 Web Fuzzer 的发送操作。这个插件本身不发送请求。
YAK
6.4 修改前后对照

YAK
6.5 自动替换与确认替换,怎么选?
需要先检查修改内容时,使用 context.RequireConfirmation(true):执行后查看摘要,再点击「应用修改」。如果希望插件执行后直接回填,将其改为 context.RequireConfirmation(false) 并保存;下次执行时无需再点击确认。这两种方式都不会自动发送请求。
如果执行插件后又手动修改了请求,请基于当前请求重新执行插件,再应用新结果。
请在 Web Fuzzer 可编辑的请求区域使用回填;结果列表中的只读报文查看器用于查看内容。
七、旧 CODEC 怎么办?
已有的 CODEC 插件可以继续使用。支持右键操作的旧插件仍可在对应场景中管理,无需为了整理菜单而重写插件。
新做编码、解码、纯文本转换工具,继续选择「Yak-Codec」。
新做依赖当前流量、批量选中记录或请求响应上下文的动作,选择「Yak-右键插件」,实现需要的 Hook。
旧 CODEC 插件可以设置快捷键,结果沿用原有展示方式;「弹窗/右侧抽屉/新页签」的切换适用于「Yak-右键插件」类型。
历史“数据包变形”CODEC 仍保留原入口,不应理解成全部统一搬进新右键菜单。
已在菜单中的旧插件可以按需保留或移除;新增的自定义右键插件,记得添加到对应场景。
从一个最常用的小动作开始,把它放到数据所在的位置。右键菜单整理好了,日常分析就少一次复制、少一次切页。
END
Memfit:是万径安全旗下Yaklang团队研发的面向长程渗透测试、漏洞挖掘、应急响应等全链路攻防任务的生产级安全领域Agent系统
Yakit:是万径安全旗下Yaklang 团队开源的一款完全国产的交互式安全测试平台
YAK官方资源

