言成言成啊 | Kit Chen's Blog

Go实现程序启动器进而实现隐藏真实内容

发布于2025-08-03 01:10:35,更新于2025-08-03 01:50:09,标签:go  文章会持续修订,转载请注明来源地址:https://meethigher.top/blog

突发奇想,我的程序,想将真实内容隐藏掉,只有在运行时,才把真实内容吐出来,运行结束后再将真实内容销毁掉。

对于用户而言,只需要启动我提供的这个启动器即可实现如上步骤。

当然了,这只算是个奇技淫巧,本质并未解决任何问题,而且也只是防小白不防大神。

比如我有一些数据、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"
)

//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)
}
}

编译、运行

1
2
3
4
5
6
7
8
# 编译app.exe
go generate ./...
# 编译main.exe
go build main.go


# 运行
main.exe

上述只是一个最简单的示例。

我最终实现的启动器的流程如下

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

发布:2025-08-03 01:10:35
修改:2025-08-03 01:50:09
链接:https://meethigher.top/blog/2025/go-embed-launcher/
标签:go 
付款码 打赏 分享
Shift+Ctrl+1 可控制工具栏