突发奇想,我的程序,想将真实内容隐藏掉,只有在运行时,才把真实内容吐出来,运行结束后再将真实内容销毁掉。
对于用户而言,只需要启动我提供的这个启动器即可实现如上步骤。
当然了,这只算是个奇技淫巧,本质并未解决任何问题,而且也只是防小白不防大神。
比如我有一些数据、bash脚本、Jar包等其他非加密的内容,我这些东西,是不想直接对用户开放的。了解了下相关技术,Go的embed 就完美解决了这个问题。
下面给出一个embed的简易示例
app.go
: 编译app.exe
,模拟我们想隐藏的内容。main.go
: 编译main.exe
,模拟启动器。
main.exe
内部使用go embed
技术嵌入app.exe
的字节数组,运行时将app.exe
写入到一个临时文件,运行完立即把这个临时文件删除掉。以此达到隐藏真实程序的效果。
app.go
,模拟真实程序
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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
,模拟启动器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| package main
import ( _ "embed" "log" "os" "os/exec" "path/filepath" "runtime" )
var bin []byte
func main() { pattern := "525d9a751ec3381b5d75278d509f9272-*" if runtime.GOOS == "windows" { pattern += ".exe" }
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()
if err := os.Chmod(tmpName, 0o700); err != nil { log.Fatal(err) }
cmd := exec.Command(tmpName) cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr if err := cmd.Run(); err != nil { log.Fatal(err) } }
|
编译、运行
1 2 3 4 5 6 7 8
| go generate ./...
go build main.go
main.exe
|
上述只是一个最简单的示例。
我最终实现的启动器的流程如下

源码参考meethigher/go-embed-launcher: Go实现程序启动器,目的是为了隐藏真实内容