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

发布于:2025-08-05 ⋅ 阅读:(20) ⋅ 点赞:(0)

注意: 本文内容于 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

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

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

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


网站公告

今日签到

点亮在社区的每一天
去签到