注意: 本文內容于 2025-08-03 01:10:35 創建,可能不會在此平臺上進行更新。如果您希望查看最新版本或更多相關內容,請訪問原文地址:Go實現程序啟動器進而實現隱藏真實內容。感謝您的關注與支持!
突發奇想,我的程序,想將真實內容隱藏掉,只有在運行時,才把真實內容吐出來,運行結束后再將真實內容銷毀掉。
對于用戶而言,只需要啟動我提供的這個啟動器即可實現如上步驟。
當然了,這只算是個奇技淫巧,本質并未解決任何問題,而且也只是防小白不防大神。
比如我有一些數據、bash腳本、Jar包等其他非加密的內容,我這些東西,是不想直接對用戶開放的。了解了下相關技術,Go的embed 就完美解決了這個問題。
下面給出一個embed的簡易示例
app.go
: 編譯app.exe
,模擬我們想隱藏的內容。main.go
: 編譯main.exe
,模擬啟動器。
main.exe
內部使用go embed
技術嵌入app.exe
的字節數組,運行時將app.exe
寫入到一個臨時文件,運行完立即把這個臨時文件刪除掉。以此達到隱藏真實程序的效果。
app.go
,模擬真實程序
package mainimport ("fmt""runtime""time"
)func main() {fmt.Println("Go Version :", runtime.Version())fmt.Println("OS/Arch :", runtime.GOOS+"/"+runtime.GOARCH)fmt.Println("Now Time :", time.Now().Format("2006-01-02 15:04:05"))
}
main.go
,模擬啟動器
package mainimport (_ "embed""log""os""os/exec""path/filepath""runtime"
)//go:generate go build -o app.exe app.go//go:embed app.exe
var bin []bytefunc main() {// 1. 生成帶正確擴展名的臨時文件名模板pattern := "525d9a751ec3381b5d75278d509f9272-*"if runtime.GOOS == "windows" {pattern += ".exe"}// 2. 創建臨時文件并一次性寫入、關閉tmp, err := os.CreateTemp("", pattern)if err != nil {log.Fatal(err)}tmpName := tmp.Name()defer os.Remove(tmpName)if _, err := tmp.Write(bin); err != nil {_ = tmp.Close()log.Fatal(err)}_ = tmp.Close()// 3. 賦予可執行權限if err := os.Chmod(tmpName, 0o700); err != nil {log.Fatal(err)}// 4. 運行cmd := exec.Command(tmpName)cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderrif err := cmd.Run(); err != nil {log.Fatal(err)}
}
編譯、運行
# 編譯app.exe
go generate ./...
# 編譯main.exe
go build main.go# 運行
main.exe
上述只是一個最簡單的示例。
我最終實現的啟動器的流程如下
源碼參考meethigher/go-embed-launcher: Go實現程序啟動器,目的是為了隱藏真實內容