go下的插件化实现

lz520520@深蓝攻防实验室

前言

插件化能够使一个工程的功用扩展更简单;代码的解耦,更易用维护,我们在很多工具中都能看到这个构造。同时插件化,也使得工程能够有更多人一同投入开发,不时去扩展更新工程的功用,也就是社区化开发。
像burpsuite中的插件使得该工具的功用被不时优化完善,大大进步我们的效率,像一些被动漏扫插件,考证码辨认插件,越权测试插件等等。这些插件都是由burp运用者开发而非官方,不同人在工作学习中会有不同的idea,而假如仅仅依托一个人或者一个小团队,可能是没那么多精神和想法去做到人人都能称手的工具,所以社区化很重要。
除此之外,像goby的poc、exp也是完成了插件化。而我看到的比拟多的插件化是应用在java项目中的,这个主要缘由是java强大的JVM,不需求重新编译主程序,即可动态加载class以及jar包,来完成功用扩展;而主程序只需求设计好插件的接口,插件开发者依据接口设计去完成特定功用就行了,这也是多态的表现。

参考一篇文章的解释

  • 编译型言语就是需求运用编译器,在程序运转之前将代码编译成操作系统可以直接辨认的机器码文件。运转时,操作系统直接拉起该文件,在 CPU 中直接运转
  • 解释型言语则是在代码运转之前,需求先拉起一个解释程序,运用这个程序在运转时就能够依据代码的逻辑执行

编译型言语的典型例子就是 汇编言语、C、C++、Objective-C、Go、Rust等等。
解释型言语的典型例子就是 JavaScript、PHP、Shell、Python、Lua 等等。
至于 Java,从 JVM 的角度,它是一个编译型言语,由于编译出来的二进制码能够直接在 JVM 上执行。但从 CPU 的角度,它仍然是一个解释型言语,由于 CPU 并不直接运转代码,而是间接地经过 JVM 解释 Java 二进制码从而完成逻辑运转。
所谓的 “脚本言语” 则是另外的一个概念,这普通指的是设计初衷就是用来开发一段小程序或者是小逻辑,然后运用预设的解释器解释这段代码并执行的程序言语。这是一个程序言语功用上的定义,理论上一切解释型言语都能够很便当的作为脚本言语,但是实践上我们并不会这么做,比方说 PHPJS就很少作为脚本言语运用。

能够看到,解释型言语天生合适作为脚本言语,由于它们本来就需求运用运转时来解释和运转代码。将运转时稍作改造或封装,就能够完成一个动态拉起脚本的功用。
那么如今就有一个问题,像编译型言语,该如何完成这种插件化呢,那就是将编译型言语变成脚本言语。

探究

由于我自身开发的一款工具是用基于go的,所以后续探究基于go的插件化。如上所言go也是一种编译型言语,而goby也是基于go开发的,所以我事前调研了goby是如何做的。
功用插件:主要是功用扩展,用js编写,相似chrome的插件方式。
exp插件:扩展破绽poc/exp,有两种计划,json格式以及go代码。 官方文档https://cn.gobies.org/exp.html#
而我的目的也是做exp/poc插件,所以着重看了这局部

搜索了关键词
\"GobyQuery\",其实和xray的yaml差不多,分为ScanSteps和ExploitSteps,需求填写一些参数,和xray的yaml差不多,这个还复杂些,估量是由于思索适用人群范围要更大些,所以需求更多信息填写。

go代码编写
关键词:*scanconfig.SingleScanConfig
这个会更灵敏应对复杂破绽,poc和exp对应如下签名,然后经过ExpManager.AddExploit添加,这个算是编译型言语里常用的一种注册方式。

func(exp *jsonvul.JsonVul, u *httpclient.FixUrl, ss *scanconfig.SingleScanConfig) bool 
func(expResult *jsonvul.ExploitResult, ss *scanconfig.SingleScanConfig) *jsonvul.ExploitResult
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞5赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片