Skip to main content

插件概述:定义与基础类型

Yakit 插件是与 Yak 语言深度绑定的一套体系。理论上来说,任意一段 Yak 代码均可以被封装成一个 Yakit 模块,分发给用户使用。

插件系统本质

插件系统的核心流程一般来说都是 yak 引擎通过 '热加载' 或者 '封装注入依赖' 等手段来执行一段 yak 代码,让代码中的行为与引擎与数据库发生交互。

常见插件类型#

yaklang.io 中定义 Yakit 的插件类型目前分为三种

  1. 以 Webhook 为通信媒介的原生 Yak 模块,通过核心引擎启动新的 yak 执行进程来控制执行过程;
  2. 以 MITM 劫持过程为基础 Hook 点的 Yak 模块,
  3. 以 Yaml 为媒介封装 Nuclei PoC 的模块,本质上也是执行一段 Yak 代码,原理与(1)相同,本文将不再赘述。

原理分类:独立模块与嵌入模块#

独立模块#

独立模块的核心是一段 Yak 脚本,一般来说使用 Webhook 与 Database 为通信媒介,通过控制进程的生命周期来控制执行任务的生命周期。

一般独立模块用于提供相对独立的整体功能。

独立模块启动进程目的
  1. 防止和引擎核心进程发生不期望的交互导致内存泄露
  2. 不期望的崩溃影响到主进程

嵌入式模块#

嵌入式模块的核心原理是把一段 Yak 代码发送到引擎,加载到内存,在一个特定的主功能执行的过程中,在特定的情况下执行用户 "热加载" 的代码。

MITM 插件就是一个典型的 "热加载" 模块,可以在 "任何新请求到来时执行用户代码 / 新网站被发现时执行用户代码 / 新参数发现时执行代码 ..."。

嵌入式模块与主核心通信直接通过内存进行通信,通信速度相对更快。

注意

但是根据我们上面的说法,这种情况可能会有内存泄漏的风险。所以我们需要编写嵌入式模块时进行充分测试,确保可用性。

典型应用分类#

Yak 原生模块#

我们使用 Yak 原生模块是最容易理解的模块,我们对 "概论" 中的图进行一部分修改,即可得到核心原理。

MITM 原生模块#

MITM 是 "热加载" 插件的典型模块,我们使用这个模块的过程中,将会对 MITM 的过程进行插桩,在恰当的点触发恰当的函数。

我们使用一个时序图来向大家展示 MITM 模块的调用 / 执行过程

当我们理解 MITM 插件的运作流程之后,发现他其实是一个非常非常典型的被动扫描器的模型架构。

In a Nutshell

MITM 平台劫持了用户流量,同时可以把用户流量作为参数,执行用户自定义的流量处理和分析函数。

总结#

我们理解了 Yakit 插件的执行流程之后,非常有助于我们之后使用 Yakit 自助编写插件。

在使用过程中,我们尤其会对 "MITM 插件" 的略微复杂的执行流程有更清醒的认识