跳到主要内容

hook

hook 库是 Yakit 插件调用框架,把 yak 插件按其声明的 Hook 点(如 mirrorNewWebsitePathhandle 等)装载并驱动,常用于在脚本中复用现有插件、构建 MITM/扫描的插件调用链。

典型使用场景:

  • 管理器:hook.NewManager 创建调用管理器,hook.LoadYakitPlugin / hook.LoadYakitPluginByName / hook.LoadYakitPluginByID 按类型/名称/ID 装载插件,hook.RemoveYakitPluginByName 卸载。
  • 混合调用器:hook.NewMixPluginCaller / hook.NewMixPluginCallerWithFilter 创建可同时驱动多类插件(端口/MITM/Web)的调用器。
  • 直接调用:hook.CallYakitPluginFunc 调用插件中导出的某个函数。

与相邻库的关系:hook 通常与 db.CreateTemporaryYakScript(创建临时插件)、mitm(流量劫持)、fuzz/poc(请求处理)协同,把"一段检测逻辑"以插件形式插入到流量/扫描链路中。

共 10 个函数

函数索引

函数参数返回值说明
hook.CallYakitPluginFuncscriptName string, hookName stringany, error跨插件调用指定插件中导出的函数(导出名为 hook.CallYakitPluginFunc)
hook.NewManager-*YakToCallerManagerNewYakToCallerManager 创建一个插件回调管理器(导出名为 hook.NewManager)
hook.NewMixPluginCaller-*MixPluginCaller, error创建一个混合插件调用器(导出名为 hook.NewMixPluginCaller)
hook.NewMixPluginCallerWithFilterwebFilter filter.Filterable*MixPluginCaller, error创建带自定义网站过滤器的混合插件调用器(导出名为 hook.NewMixPluginCallerWithFilter)

可变参数函数索引

函数参数返回值说明
hook.LoadYakitPluginmng *YakToCallerManager, scriptType string, hookNames ...stringerrorloadScript 按插件类型批量加载 Yakit 插件到回调管理器(导出名为 hook.LoadYakitPlugin)
hook.LoadYakitPluginByIDmng *YakToCallerManager, id any, hookNames ...stringerrorloadScriptByID 按插件数据库 ID 或 UUID 加载插件(导出名为 hook.LoadYakitPluginByID)
hook.LoadYakitPluginByIDContextmng *YakToCallerManager, ctx context.Context, id any, hookNames ...stringerrorloadScriptByIDCtx 按插件 ID/UUID 加载插件(带上下文,导出名为 hook.LoadYakitPluginByIDContext)
hook.LoadYakitPluginByNamemng *YakToCallerManager, scriptName string, hookNames ...stringerrorloadScriptByName 按插件名加载 Yakit 插件到回调管理器(导出名为 hook.LoadYakitPluginByName)
hook.LoadYakitPluginContextmng *YakToCallerManager, ctx context.Context, scriptType string, hookNames ...stringerrorloadScriptCtx 按插件类型批量加载插件(带上下文,导出名为 hook.LoadYakitPluginContext)
hook.RemoveYakitPluginByNamemng *YakToCallerManager, scriptNames ...string-removeScriptByNameCtx 从回调管理器中移除指定名称的插件(导出名为 hook.RemoveYakitPluginByName)

函数详情

CallYakitPluginFunc

CallYakitPluginFunc(scriptName string, hookName string) (any, error)

跨插件调用指定插件中导出的函数(导出名为 hook.CallYakitPluginFunc)

仅可在 yak your-file.yak 方式运行的脚本中使用,不可在 MITM/WebFuzzer 热加载中使用

参数

参数名类型说明
scriptNamestring目标插件名称
hookNamestring插件中要调用的函数/变量名

返回值

序号类型说明
r1any被调用函数对应的值
r2error错误信息

示例

// 示意性示例,需要本地插件数据库与预置引擎
pluginFn = hook.CallYakitPluginFunc("my-plugin", "analyze")~
pluginFn("target")

NewManager

NewManager() *YakToCallerManager

NewYakToCallerManager 创建一个插件回调管理器(导出名为 hook.NewManager)

管理器用于加载插件、维护 hook 回调表并按需触发插件回调

返回值

序号类型说明
r1*YakToCallerManager插件回调管理器对象

示例

// 示意性示例,需要本地插件数据库
mng = hook.NewManager()
err = hook.LoadYakitPlugin(mng, "mitm")

NewMixPluginCaller

NewMixPluginCaller() (*MixPluginCaller, error)

创建一个混合插件调用器(导出名为 hook.NewMixPluginCaller)

调用器内置网站/路径/参数等过滤器,便于按 MITM 流量统一调度多类插件

返回值

序号类型说明
r1*MixPluginCaller混合插件调用器对象
r2error错误信息

示例

// 示意性示例,需要本地插件数据库
caller, err = hook.NewMixPluginCaller()
if err != nil { die(err) }
caller.LoadPlugin("my-plugin")

NewMixPluginCallerWithFilter

NewMixPluginCallerWithFilter(webFilter filter.Filterable) (*MixPluginCaller, error)

创建带自定义网站过滤器的混合插件调用器(导出名为 hook.NewMixPluginCallerWithFilter)

参数

参数名类型说明
webFilterfilter.Filterable自定义的网站去重/过滤器

返回值

序号类型说明
r1*MixPluginCaller混合插件调用器对象
r2error错误信息

示例

// 示意性示例,需要本地插件数据库
caller, err = hook.NewMixPluginCallerWithFilter(filter.NewFilter())
if err != nil { die(err) }
caller.LoadPlugin("my-plugin")

可变参数函数详情

LoadYakitPlugin

LoadYakitPlugin(mng *YakToCallerManager, scriptType string, hookNames ...string) error

loadScript 按插件类型批量加载 Yakit 插件到回调管理器(导出名为 hook.LoadYakitPlugin)

必填参数

参数名类型说明
mng*YakToCallerManager插件回调管理器
scriptTypestring插件类型,如 "mitm"、"port-scan"

可选参数

参数名类型说明
hookNames...string可选,仅加载指定的 hook 名称

返回值

序号类型说明
r1error错误信息

示例

// 示意性示例,需要本地插件数据库
mng = hook.NewManager()
err = hook.LoadYakitPlugin(mng, "mitm")
if err != nil { die(err) }

LoadYakitPluginByID

LoadYakitPluginByID(mng *YakToCallerManager, id any, hookNames ...string) error

loadScriptByID 按插件数据库 ID 或 UUID 加载插件(导出名为 hook.LoadYakitPluginByID)

支持数值类型的数据库 ID,或字符串类型的 UUID

必填参数

参数名类型说明
mng*YakToCallerManager插件回调管理器
idany插件数据库 ID 或 UUID

可选参数

参数名类型说明
hookNames...string可选,仅加载指定的 hook 名称

返回值

序号类型说明
r1error错误信息

示例

// 示意性示例,需要本地插件数据库
mng = hook.NewManager()
err = hook.LoadYakitPluginByID(mng, 1)
if err != nil { die(err) }

LoadYakitPluginByIDContext

LoadYakitPluginByIDContext(mng *YakToCallerManager, ctx context.Context, id any, hookNames ...string) error

loadScriptByIDCtx 按插件 ID/UUID 加载插件(带上下文,导出名为 hook.LoadYakitPluginByIDContext)

必填参数

参数名类型说明
mng*YakToCallerManager插件回调管理器
ctxcontext.Context上下文对象,用于控制取消
idany插件数据库 ID 或 UUID

可选参数

参数名类型说明
hookNames...string可选,仅加载指定的 hook 名称

返回值

序号类型说明
r1error错误信息

示例

// 示意性示例,需要本地插件数据库
mng = hook.NewManager()
ctx = context.Background()
err = hook.LoadYakitPluginByIDContext(mng, ctx, 1)
if err != nil { die(err) }

LoadYakitPluginByName

LoadYakitPluginByName(mng *YakToCallerManager, scriptName string, hookNames ...string) error

loadScriptByName 按插件名加载 Yakit 插件到回调管理器(导出名为 hook.LoadYakitPluginByName)

必填参数

参数名类型说明
mng*YakToCallerManager插件回调管理器
scriptNamestring插件名称

可选参数

参数名类型说明
hookNames...string可选,仅加载指定的 hook 名称

返回值

序号类型说明
r1error错误信息

示例

// 示意性示例,需要本地插件数据库
mng = hook.NewManager()
err = hook.LoadYakitPluginByName(mng, "my-plugin")
if err != nil { die(err) }

LoadYakitPluginContext

LoadYakitPluginContext(mng *YakToCallerManager, ctx context.Context, scriptType string, hookNames ...string) error

loadScriptCtx 按插件类型批量加载插件(带上下文,导出名为 hook.LoadYakitPluginContext)

必填参数

参数名类型说明
mng*YakToCallerManager插件回调管理器
ctxcontext.Context上下文对象,用于控制取消
scriptTypestring插件类型

可选参数

参数名类型说明
hookNames...string可选,仅加载指定的 hook 名称

返回值

序号类型说明
r1error错误信息

示例

// 示意性示例,需要本地插件数据库
mng = hook.NewManager()
ctx = context.Background()
err = hook.LoadYakitPluginContext(mng, ctx, "mitm")
if err != nil { die(err) }

RemoveYakitPluginByName

RemoveYakitPluginByName(mng *YakToCallerManager, scriptNames ...string)

removeScriptByNameCtx 从回调管理器中移除指定名称的插件(导出名为 hook.RemoveYakitPluginByName)

必填参数

参数名类型说明
mng*YakToCallerManager插件回调管理器

可选参数

参数名类型说明
scriptNames...string要移除的插件名称列表

示例

// 示意性示例,需要本地插件数据库
mng = hook.NewManager()
hook.RemoveYakitPluginByName(mng, "my-plugin")