Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > golang hack动态链接库

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

您可能感兴趣的文章:
阅读全文