golang hack插件开发动态链接库实例探究

 更新时间:2024年01月22日 14:28:46   作者: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动态链接库的资料请关注脚本之家其它相关文章!

相关文章

  • go内存队列list VS slice实现方式对比分析

    go内存队列list VS slice实现方式对比分析

    这篇文章主要为大家介绍了go内存队列list VS slice实现方式对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 在 Go 语言中使用 regexp 包处理正则表达式的操作

    在 Go 语言中使用 regexp 包处理正则表达式的操作

    正则表达式是处理字符串时一个非常强大的工具,而 Go 语言的 regexp 包提供了简单而强大的接口来使用正则表达式,本文将介绍如何在 Go 中使用 regexp 包来编译和执行正则表达式,以及如何从文本中匹配和提取信息,感兴趣的朋友一起看看吧
    2023-12-12
  • Go语言Mock单元测试的实现示例

    Go语言Mock单元测试的实现示例

    Go语言Mock单元测试通过模拟外部依赖实现隔离测试,解决传统测试中的环境依赖、结果不稳定和效率问题,感兴趣的可以了解一下
    2025-11-11
  • Go 语言中的空接口(推荐)

    Go 语言中的空接口(推荐)

    这篇文章主要介绍了Go 语言中的空接口的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 详解Go中处理时间数据的方法

    详解Go中处理时间数据的方法

    在许多场合,你将不得不编写必须处理时间的代码。在Go中处理时间数据需要你从Go标准库中导入 time 包。这个包有很多方法和类型供你使用,但我选取了最常用的方法和类型,并在这篇文章中进行了描述,感兴趣的可以了解一下
    2023-04-04
  • golang日志包logger的用法详解

    golang日志包logger的用法详解

    这篇文章主要介绍了golang日志包logger的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go疑难杂症讲解之为什么nil不等于nil

    Go疑难杂症讲解之为什么nil不等于nil

    在日常开发中,可能一不小心就会掉进 Go 语言的某些陷阱里,而本文要介绍的 nil ≠ nil 问题,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-10-10
  • Go中unsafe.Pointer类型的使用小结

    Go中unsafe.Pointer类型的使用小结

    unsafe.Pointer 是 Go 语言标准库 unsafe 包中的一个特殊类型,用于在不同类型的指针之间进行 无类型转换,允许你绕过 Go 的类型系统进行底层操作,感兴趣的可以了解一下
    2026-02-02
  • Go 语言中和类型Sum Types的创新实现方案详解

    Go 语言中和类型Sum Types的创新实现方案详解

    本文介绍了Go语言中如何通过ProjectionStructs和SafeUnsafeConversion来实现和类型(SumTypes),该方案通过内存布局相同的多个结构体投影同一块数据,实现零自定义编解码、编译时类型安全和IDE自动补全友好,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • go zero微服务框架logx日志组件剖析

    go zero微服务框架logx日志组件剖析

    这篇文章主要为大家介绍了go zero微服务框架logx日志组件剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09

最新评论