注意: 本文内容于 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实现程序启动器,目的是为了隐藏真实内容