Skip to content

Instantly share code, notes, and snippets.

@appleboy
Created June 2, 2024 12:52
Show Gist options
  • Save appleboy/30bab67f48a9219d494e70fec9234ef5 to your computer and use it in GitHub Desktop.
Save appleboy/30bab67f48a9219d494e70fec9234ef5 to your computer and use it in GitHub Desktop.

程式碼混淆技術是透過改變程式碼的結構和語意,使其變得難以理解和分析,但在功能上不受影響的技術。這些技術在保護知識產權、防止逆向工程和提高安全性方面非常有用。下面介紹一些常見的混淆技術,並提供 Go 語言的示例程式碼。

常見的程式碼混淆技術

  • 變量名混淆:將變量名改為無意義的名稱。
  • 控制流平坦化:改變程式碼的控制流,使其難以追蹤。
  • 死碼插入:插入無用的程式碼,使其難以理解。
  • 函數內聯化:將小函數的程式碼直接放入呼叫它的地方,減少函數呼叫。
  • 字符串加密:將字符串加密,運行時再解密。
  • 無意義的注釋:插入大量無意義的注釋來混淆。

Go 語言的混淆示例

以下是一個簡單的 Go 程式碼混淆示例。

原始碼:

package main

import "fmt"

func add(a int, b int) int {
    return a + b
}

func main() {
    result := add(5, 3)
    fmt.Println(result)
}

混淆後的程式碼:

package main

import (
    "fmt"
    "strconv"
    "encoding/base64"
)

func z1(a int, b int) int {
    return a + b
}

func z2(e string) string {
    data, _ := base64.StdEncoding.DecodeString(e)
    return string(data)
}

func main() {
    x1 := "NQ=="
    x2 := "Mw=="
    a, _ := strconv.Atoi(z2(x1))
    b, _ := strconv.Atoi(z2(x2))
    c := z1(a, b)
    fmt.Println(c)
}

解釋混淆技術

變量名混淆:將函數 add 改為 z1,變量 result 改為 c。 字符串加密:將數字 5 和 3 編碼為 Base64 字符串 "NQ==" 和 "Mw==",並在運行時解碼。 增加無意義函數:添加了 z2 函數來解碼 Base64 字符串。

資料證明

根據研究,程式碼混淆可以顯著增加逆向工程的難度。例如,2018 年發表的一篇研究報告《A Survey on Code Obfuscation Techniques for Software Protection》中提到,混淆技術可以有效地保護程式碼,增加其破解和分析的成本 。

此外,一些專業工具如 ProGuard(Java)、JScrambler(JavaScript)和 ConfuserEx(.NET)也證明了混淆技術的有效性和普遍應用。

Go 語言的混淆工具

目前,Go 語言的混淆工具相對較少,但可以使用開源工具如 garble 來進行基本的混淆處理。garble 是一個用於 Go 程式碼的混淆工具,可以自動化地進行變量名混淆和其他基本的混淆技術。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment