Golang代码混淆的正确方法是什么

Golang代码混淆的正确方法是什么 我正在尝试为用Go语言编写的二进制文件进行代码混淆,请帮助我。

6 回复

二进制文件不是已经混淆过了吗?

更多关于Golang代码混淆的正确方法是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我还没做

在编写Go程序时,需要进行代码混淆以防止源代码泄露。

你实际上需要哪种混淆?你的威胁模型是什么?

你好 @bluefire,代码混淆并不能防止源代码泄露,它只是让逆向工程代码更加困难

例如,可以看看这些论坛主题:

标题: 你是否知道任何用于 Go 的混淆方法/工具? 引用内容: 你好,我有一家社交媒体管理初创公司,之前是用 JavaScript 编写的,我现在正在完全用 Go 重写,因为我真的非常厌倦 Node.js 的单线程非阻塞 I/O 机制(所有东西都必须是异步的,所以你首先得考虑如何用 Node 的方式思考,而不是思考算法本身,我讨厌这一点)。 嗯,有时在构建过程中,我会将二进制文件分发给外包的前端或设计人员,我已经在使用 ldflags 来剥离二进制文件,但无论如何,Go 似乎很容易被逆向…

标题: 我需要逆向工程保护工具 引用内容: 我需要用于基于 Go 语言应用程序的逆向工程工具。 以及用于基于 Go 语言应用程序的逆向工程保护工具。 你能尽快给我解决方案吗?

以及 golang-nuts 中的这个帖子:

是否有解决方案可以隐藏我用 Go 编写的源代码并将其制作成一个库,以便同样用 Go 进行开发

来自上述来源的一些建议:

  • 不要向客户交付二进制文件,而是将其作为 Web 服务提供
  • 如果你无法信任当前的客户,就去寻找更好的客户
  • 通过法律手段保护你的权利

话虽如此,周围确实有一些混淆项目。在网上搜索“golang code obfuscation”时,我找到了 burrowers/garble: Obfuscate Go buildsunixpickle/gobfuscate: Obfuscate Go binaries and packages,可能还有更多,但说真的,不要把希望都寄托在混淆上。

在Go语言中进行代码混淆,主要有以下几种方法:

1. 使用字符串加密

对代码中的字符串进行加密,运行时解密:

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "encoding/base64"
    "fmt"
)

func decrypt(key, ciphertext string) string {
    data, _ := base64.StdEncoding.DecodeString(ciphertext)
    block, _ := aes.NewCipher([]byte(key))
    gcm, _ := cipher.NewGCM(block)
    nonceSize := gcm.NonceSize()
    nonce, ciphertext := data[:nonceSize], data[nonceSize:]
    plaintext, _ := gcm.Open(nil, nonce, ciphertext, nil)
    return string(plaintext)
}

func main() {
    // 加密后的字符串
    encryptedStr := "9B2Z7d8/...加密后的base64..."
    key := "32字节长度的密钥..."
    
    // 运行时解密
    realStr := decrypt(key, encryptedStr)
    fmt.Println(realStr)
}

2. 使用garble工具

garble是Go官方推荐的混淆工具:

# 安装garble
go install mvdan.cc/garble@latest

# 使用garble构建
garble build -o myapp main.go

# 启用所有混淆功能
garble -literals -tiny build -o myapp main.go

3. 控制流扁平化

通过switch-case结构打乱代码执行顺序:

func obfuscatedFunction(input int) int {
    state := 0
    result := 0
    
    for state != -1 {
        switch state {
        case 0:
            result = input * 2
            state = 1
        case 1:
            result += 10
            state = 2
        case 2:
            if result > 50 {
                state = 3
            } else {
                state = 4
            }
        case 3:
            result /= 2
            state = -1
        case 4:
            result *= 3
            state = -1
        }
    }
    return result
}

4. 函数名和变量名混淆

使用构建标签和代码生成:

//go:generate go run obfuscate.go
package main

var a1b2c3 = "重要数据"  // 混淆后的变量名
func x9y8z7() {        // 混淆后的函数名
    // 函数实现
}

5. 使用第三方混淆工具

  • garble: mvdan.cc/garble
  • obfuscator: github.com/unixpickle/obfuscator
  • go-obfuscate: github.com/amoghe/go-obfuscate

6. 完整示例:结合多种技术

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "strings"
)

// 加密的关键配置
var (
    c1 = "encrypted_config_1"
    c2 = "encrypted_config_2"
)

func init() {
    // 运行时解密配置
    c1 = decrypt(c1)
    c2 = decrypt(c2)
}

func main() {
    // 扁平化控制流
    dispatcher(1, "normal operation")
}

func dispatcher(cmd int, data string) {
    next := 0
    for next >= 0 {
        switch next {
        case 0:
            if cmd == 1 {
                next = 1
            } else {
                next = 2
            }
        case 1:
            processData(data)
            next = -1
        case 2:
            fmt.Println("invalid command")
            next = -1
        }
    }
}

func processData(d string) {
    // 实际处理逻辑
    fmt.Println("Processing:", d)
}

构建命令

# 使用garble进行混淆构建
garble -literals -tiny -seed=random build \
    -ldflags="-s -w" \
    -o output_binary \
    ./main.go

# 进一步压缩
upx --brute output_binary

这些方法可以单独或组合使用,garble工具是目前最全面且维护良好的Go代码混淆解决方案。

回到顶部