golang hack插件开发动态链接库实例探究
作者:45度技术宅
这篇文章主要为大家介绍了golang hack插件开发动态链接库实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
准备工作
1. go1.8以上才支持动态库
2. linux 下动态库编译 go build -buildmode=plugin
3. shard 下 go build -buildmode=c-shared
go加载动态库的过程
1.调用plugin.Open(filename) 打开共享对象文件,创建一个*plugin.Plugin实例
2. 在*plugin.Plugin实例上调用Lookup(symbolName string)
3. 使用类型断言将泛型symbol转换为所需类型
根据需要使用生成转换对象
package main
import (
"fmt"
"goplugin/scanner"
"io/ioutil"
"log"
"os"
"plugin"
)
// 插件调用
const PluginDir = "./plugins/" // 定义放.so 文件的目录
func main() {
var (
files []os.FileInfo
err error
p *plugin.Plugin
n plugin.Symbol
check scanner.Checker
res *scanner.Result
)
// 获取插件目录所有文件
if files, err = ioutil.ReadDir(PluginDir); err != nil {
log.Fatalln(err)
}
// 遍历所有的插件
for idx := range files {
fmt.Println("插件名", files[idx].Name())
// 读取插件
if p, err = plugin.Open(PluginDir + files[idx].Name()); err != nil {
log.Fatal(err)
}
// 加载插件中的New函数
if n, err = p.Lookup("New"); err != nil {
log.Fatalln(err)
}
newFunc, ok := n.(func() scanner.Checker) //类型断言,检查获取到的n的类型,并返回
if !ok {
log.Fatal("new 函数检查出错")
}
check = newFunc() // 调用newfunc
res = check.Check("202.108.22.103", 80) // 调用插件中接口的check方法
if res.Vulnerable {
log.Println(res.Details)
} else {
log.Println("host not avalable")
}
}
}goplugins/scanner
package scanner
// 插件的约束,插件实现对一个域名和port 的扫描,返回result
type Checker interface {
Check(host string, port uint64) *Result
}
type Result struct {
Vulnerable bool
Details string
}以上就是golang hack插件开发动态链接库实例探究的详细内容,更多关于golang hack动态链接库的资料请关注脚本之家其它相关文章!
