unixpickle/gobfuscate

GitHub: unixpickle/gobfuscate

gobfuscate 通过对包名、符号名和字符串进行哈希与转换混淆,使编译后的 Go 二进制文件难以被逆向还原出源码信息。

Stars: 1573 | Forks: 163

# gobfuscate 当你编译一个 Go binary 时,它会包含大量关于源代码的信息:字段名、字符串、包路径等。如果你想发布一个 binary 而不泄露此类信息,你该怎么做? 使用 gobfuscate,你可以通过混淆后的源代码来编译 Go binary。这使得许多信息难以或无法从 binary 中破译。 # 如何使用 ``` go get -u github.com/unixpickle/gobfuscate gobfuscate [flags] pkg_name out_path ``` `pkg_name` 是从你的 $GOPATH/src 到要混淆的包的相对路径(通常类似于 domain.tld/user/repo) `out_path` 是写入 binary 的路径 ### Flags ``` Usage: gobfuscate [flags] pkg_name out_path -keeptests keep _test.go files -noencrypt no encrypted package name for go build command (works when main package has CGO code) -nostatic do not statically link -outdir output a full GOPATH -padding string use a custom padding for hashing sensitive information (otherwise a random padding will be used) -tags string tags are passed to the go compiler -verbose verbose mode -winhide hide windows GUI ``` # 它的工作原理 目前,gobfuscate 会处理包名、全局变量和函数名、类型名、方法名以及字符串。 ### 包名混淆 当 gobfuscate 构建你的程序时,它会构建你的 GOPATH 子集的副本。然后,它通过对包名和路径进行哈希处理来重构此 GOPATH。因此,像 "github.com/unixpickle/deleteme" 这样的包会变成类似 "jiikegpkifenppiphdhi/igijfdokiaecdkihheha/jhiofoppieegdaif" 的名称。这有助于从可执行文件中移除诸如 Github 用户名之类的信息。 **限制:** 目前,使用 CGO 的包无法重命名。我怀疑这是由于 Go 的重构 API 中的一个 bug 造成的。 ### 全局名称 Gobfuscate 会对全局变量、常量和函数的名称进行哈希处理。它还会对任何新定义类型的名称进行哈希处理。 由于重构 API 的限制,这不适用于包含汇编文件或使用 CGO 的包。它也不适用于由于构建约束而多次出现的名称。 ### Struct 方法 Gobfuscate 会对大多数 struct 方法的名称进行哈希处理。但是,它不会重命名与任何导入的 interface 方法相匹配的方法。这主要是由于重构引擎的内部限制。从理论上讲,大多数 interface 也可以被混淆(标准库中的除外)。 由于重构 API 的限制,这不适用于包含汇编文件或使用 CGO 的包。它也不适用于由于构建约束而多次出现的名称。 ### 字符串 字符串通过将其替换为函数来进行混淆。一个字符串将被转换为如下所示的表达式: ``` (func() string { mask := []byte{33, 15, 199} maskedStr := []byte{73, 106, 190} res := make([]byte, 3) for i, m := range mask { res[i] = m ^ maskedStr[i] } return string(res) }()) ``` 由于 `const` 声明不能包含函数调用,gobfuscate 会尝试将所有 `const` 字符串更改为 `var`。它适用于如下任何声明: ``` const MyStr = "hello" const MyStr1 = MyStr + "yoyo" const MyStr2 = MyStr + (MyStr1 + "hello1") const ( MyStr3 = "hey there" MyStr4 = MyStr1 + "yo" ) ``` 但是,它不适用于混合 const/int 块: ``` const ( MyStr = "hey there" MyNum = 3 ) ``` # 许可证 本项目采用 BSD 2-clause 许可证。请参阅 [LICENSE](LICENSE)。
标签:EVTX分析, Go, Ruby工具, 代码混淆, 日志审计, 源码保护, 私有化部署, 编译工具, 防御规避