注意: 本文内容于 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 main
import (
"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 main
import (
_ "embed"
"log"
"os"
"os/exec"
"path/filepath"
"runtime"
)
//go:generate go build -o app.exe app.go
//go:embed app.exe
var bin []byte
func 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.Stderr
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
}
编译、运行
# 编译app.exe
go generate ./...
# 编译main.exe
go build main.go
# 运行
main.exe
上述只是一个最简单的示例。
我最终实现的启动器的流程如下