golang hack插件開發(fā)動(dòng)態(tài)鏈接庫實(shí)例探究
準(zhǔn)備工作
1. go1.8以上才支持動(dòng)態(tài)庫
2. linux 下動(dòng)態(tài)庫編譯 go build -buildmode=plugin
3. shard 下 go build -buildmode=c-shared
go加載動(dòng)態(tài)庫的過程
1.調(diào)用plugin.Open(filename) 打開共享對(duì)象文件,創(chuàng)建一個(gè)*plugin.Plugin實(shí)例
2. 在*plugin.Plugin實(shí)例上調(diào)用Lookup(symbolName string)
3. 使用類型斷言將泛型symbol轉(zhuǎn)換為所需類型
根據(jù)需要使用生成轉(zhuǎn)換對(duì)象
package main
import (
"fmt"
"goplugin/scanner"
"io/ioutil"
"log"
"os"
"plugin"
)
// 插件調(diào)用
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函數(shù)
if n, err = p.Lookup("New"); err != nil {
log.Fatalln(err)
}
newFunc, ok := n.(func() scanner.Checker) //類型斷言,檢查獲取到的n的類型,并返回
if !ok {
log.Fatal("new 函數(shù)檢查出錯(cuò)")
}
check = newFunc() // 調(diào)用newfunc
res = check.Check("202.108.22.103", 80) // 調(diào)用插件中接口的check方法
if res.Vulnerable {
log.Println(res.Details)
} else {
log.Println("host not avalable")
}
}
}goplugins/scanner
package scanner
// 插件的約束,插件實(shí)現(xiàn)對(duì)一個(gè)域名和port 的掃描,返回result
type Checker interface {
Check(host string, port uint64) *Result
}
type Result struct {
Vulnerable bool
Details string
}以上就是golang hack插件開發(fā)動(dòng)態(tài)鏈接庫實(shí)例探究的詳細(xì)內(nèi)容,更多關(guān)于golang hack動(dòng)態(tài)鏈接庫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析
這篇文章主要為大家介紹了go內(nèi)存隊(duì)列l(wèi)ist VS slice實(shí)現(xiàn)方式對(duì)比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
在?Go?語言中使用?regexp?包處理正則表達(dá)式的操作
正則表達(dá)式是處理字符串時(shí)一個(gè)非常強(qiáng)大的工具,而?Go?語言的?regexp?包提供了簡(jiǎn)單而強(qiáng)大的接口來使用正則表達(dá)式,本文將介紹如何在?Go?中使用?regexp?包來編譯和執(zhí)行正則表達(dá)式,以及如何從文本中匹配和提取信息,感興趣的朋友一起看看吧2023-12-12
Go語言Mock單元測(cè)試的實(shí)現(xiàn)示例
Go語言Mock單元測(cè)試通過模擬外部依賴實(shí)現(xiàn)隔離測(cè)試,解決傳統(tǒng)測(cè)試中的環(huán)境依賴、結(jié)果不穩(wěn)定和效率問題,感興趣的可以了解一下2025-11-11
Go 語言中和類型Sum Types的創(chuàng)新實(shí)現(xiàn)方案詳解
本文介紹了Go語言中如何通過ProjectionStructs和SafeUnsafeConversion來實(shí)現(xiàn)和類型(SumTypes),該方案通過內(nèi)存布局相同的多個(gè)結(jié)構(gòu)體投影同一塊數(shù)據(jù),實(shí)現(xiàn)零自定義編解碼、編譯時(shí)類型安全和IDE自動(dòng)補(bǔ)全友好,感興趣的朋友跟隨小編一起看看吧2026-02-02

