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工具, 代码混淆, 日志审计, 源码保护, 私有化部署, 编译工具, 防御规避