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动态链接库的资料请关注脚本之家其它相关文章!