Skip to content

Instantly share code, notes, and snippets.

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

使用Go語言進行反編譯,使程式碼難以理解和分析的過程稱為混淆(obfuscation)。混淆是一種安全技術,用於使編譯後的程式碼變得複雜、難以閱讀和分析,以防止逆向工程和破解。以下是如何使用Go語言進行混淆的步驟,以及一些工具和方法來證明程式碼的混淆效果。

混淆前後的比較

混淆前的程式碼和編譯的二進制文件較為直觀和容易理解。混淆後,變數名、函數名等會被替換為無意義的名稱,使得程式碼難以閱讀和逆向工程。

證明混淆效果

反編譯前的二進制文件:

你可以使用 go tool objdump 來反編譯原始未混淆的二進制文件,並查看反編譯的輸出:

go tool objdump -s "main" original_binary

反編譯後的二進制文件:

對混淆後的二進制文件進行同樣的反編譯,並比較輸出:

go tool objdump -s "main" obfuscated_binary

反編譯示例:

假設原始未混淆的程式碼生成以下反編譯輸出:

TEXT main.main(SB) /path/to/main.go
    main.go:5        0x104def0       64488b0c25f8ffffff      MOVQ GS:0xfffffff8, CX
    main.go:5        0x104def9       488d4424f8              LEAQ -0x8(SP), AX
    ...

而混淆後的程式碼生成的反編譯輸出可能變得難以理解:

TEXT main.main(SB) /path/to/main.go
    main.go:5        0x104def0       64488b0c25f8ffffff      MOVQ GS:0xfffffff8, CX
    main.go:5        0x104def9       488d4424f8              LEAQ -0x8(SP), AX
    ...

混淆後的變數名、函數名等都會被替換為無意義的名稱,使得反編譯後的程式碼幾乎不可讀,這樣可以達到防止逆向工程的效果。

資料證明一式

可以利用以下工具生成混淆前後的比較資料,證明程式碼已被成功混淆。

源碼控制(如Git):

將混淆前後的程式碼及其反編譯輸出保存到Git倉庫中進行對比。

文件比較工具:

使用 diff 或其他文件比較工具來比較混淆前後的反編譯結果,展示具體變化。

例如:

diff -u original_binary_disassembly.txt obfuscated_binary_disassembly.txt

這樣可以清楚地看到混淆前後的差異,證明程式碼已被有效混淆。

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