golang hack插件開發(fā)動態(tài)鏈接庫實(shí)例探究
準(zhǔn)備工作
1. go1.8以上才支持動態(tài)庫
2. linux 下動態(tài)庫編譯 go build -buildmode=plugin
3. shard 下 go build -buildmode=c-shared
go加載動態(tài)庫的過程
1.調(diào)用plugin.Open(filename) 打開共享對象文件,創(chuàng)建一個(gè)*plugin.Plugin實(shí)例
2. 在*plugin.Plugin實(shí)例上調(diào)用Lookup(symbolName string)
3. 使用類型斷言將泛型symbol轉(zhuǎn)換為所需類型
根據(jù)需要使用生成轉(zhuǎn)換對象
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)對一個(gè)域名和port 的掃描,返回result type Checker interface { Check(host string, port uint64) *Result } type Result struct { Vulnerable bool Details string }
以上就是golang hack插件開發(fā)動態(tài)鏈接庫實(shí)例探究的詳細(xì)內(nèi)容,更多關(guān)于golang hack動態(tài)鏈接庫的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
GoLang中Json?Tag用法實(shí)例總結(jié)
這篇文章主要給大家介紹了關(guān)于GoLang中Json?Tag用法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02go語言編程之美自定義二進(jìn)制文件實(shí)用指南
這篇文章主要介紹了go語言編程之美自定義二進(jìn)制文件實(shí)用指南2023-12-12golang?基于?mysql?簡單實(shí)現(xiàn)分布式讀寫鎖
這篇文章主要介紹了golang?基于mysql簡單實(shí)現(xiàn)分布式讀寫鎖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09Go文件操作(新建打開寫入讀取刪除關(guān)閉)學(xué)習(xí)筆記
這篇文章主要為大家介紹了Go文件操作(新建打開寫入讀取刪除關(guān)閉)學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01go從指定的URL下載圖片并保存到本地的代碼實(shí)現(xiàn)
這段代碼定義了一個(gè)名為 downloadImage 的函數(shù),其目的是從指定的URL下載圖片并保存到本地文件系統(tǒng),本文是對代碼功能的詳細(xì)描述,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-08-08golang獲取當(dāng)前時(shí)間、時(shí)間戳和時(shí)間字符串及它們之間的相互轉(zhuǎn)換方法
這篇文章主要介紹了golang獲取當(dāng)前時(shí)間、時(shí)間戳和時(shí)間字符串及它們之間的相互轉(zhuǎn)換,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-04-04