Golang二進制文件混淆保護操作
Go實在是太棒了。一處編譯,處處運行,沒有依賴,毫無麻煩!
不過麻煩的事情來了。我們寫一個程序,就是想在別人的電腦上運行的。然而,Go語言的默認機制,會泄漏我們的一些信息,雖然不多,但也有點尷尬。
本文結(jié)合網(wǎng)上的一些常用方法,總結(jié)出一套通用的簡單易行的保護措施。
1、刪除調(diào)試符號
默認情況下go編譯出的程序在運行出錯時會輸出自己在哪個線程哪個文件哪個函數(shù)哪行出的錯,就像這樣,
圖片來源StackOverflow
DWARF信息對于小黑客們可是如獲至寶,這些關(guān)鍵信息不能留下。而且去掉這些東西也非常簡單:
go build -ldflags "-s -w” [<your/package]
(需要Go版本大于1.7)
這里的 -ldflags 參數(shù)最終會在 go tool link 的時候傳給它, go tool link -h解釋如下
...
-s disable symbol table
-w disable DWARF generation
刪除掉調(diào)試符號的另一個好處就是,顯著減小了文件大?。ㄆ骄?0%)
-rwxr-xr-x 1 tim staff 1636736 May 5 11:59 bin/hello <- 標準編譯
-rwxr-xr-x 1 tim staff 1190272 May 5 11:59 hello <- stripped
再加一個UPX殼,還可以壓縮到原文件大小的五分之一!不知道為啥,go語言的二進制特別好壓!
2、刪除trace文件信息
在go中觸發(fā) panic 時,上圖的文件目錄也是泄漏信息的一部分。比如上圖就包括了小黑客用的操作系統(tǒng)(Linux),小黑客的名字(nikos),如果你用homebrew版本的Go還會泄漏你的編譯器版本。所以這些當然也要刪掉!
這些信息的來源是編譯器運行時所處環(huán)境的環(huán)境變量。
上圖中的函數(shù)編譯時,環(huán)境變量就是這樣。
GOROOT=/opt/goGOPATH=/home/nikos/projects/goGOROOT_FINAL=$GOROOT
這幾個都是可以改的哦。根據(jù)參考資料,編譯時GO會從$GOPATH尋找我們自己的代碼,從$GOROOT提取標準庫,在打包時將GOROOT改寫為GOROOT_FINAL并作為trace信息的一部分寫入目標文件。改寫$GOPATH的方式也很簡單,在一個不起眼的目錄里對真實的GOPATH創(chuàng)建一個軟鏈接(快捷方式),編譯器在尋找時就會把快捷方式的目錄名寫到最終文件里,從而達到我們隱藏自己的目的。
話不多說,上代碼。放到自己的.bash_profile或.zshrc中即可
ACTUAL_GOPATH="~/Programming/go" export GOPATH='/tmp/go' export GOROOT_FINAL=$GOPATH [ ! -d $GOPATH ] && ln -s "$ACTUAL_GOPATH" "$GOPATH" [[ ! $PATH =~ $GOPATH ]] && export PATH=$PATH:$GOPATH/bin
我個人把GOROOT_FINAL也寫入為GOPATH,其實這個字符串可以是任意值,但寫成一樣的話,可以讓逆向人員無法分辨,調(diào)用的庫是我們自己寫的還是go語言的標準庫。非常猥瑣哦~
這樣一來,生成的二進制文件就相當于其他語言編譯時的Release版本了。再發(fā)散一下,自己寫一個庫,將關(guān)鍵的字符串做成外部資源并在調(diào)用時解密,代碼中不保留明文,再破解就只能人肉跟蹤函數(shù)了。滿分!
3.使用 UPX 給程序加殼
UPX 不僅能大幅壓縮 Golang 靜態(tài)編譯的二進制程序,更能有效的增加反匯編的難度。具體命令為:
upx --brute [ binary ]
UPX 副作用是會增加程序的啟動時間,但也無妨啦!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
云端golang開發(fā),無需本地配置,能上網(wǎng)就能開發(fā)和運行
這篇文章主要介紹了云端golang開發(fā),無需本地配置,能上網(wǎng)就能開發(fā)和運行的相關(guān)資料,需要的朋友可以參考下2023-10-10Golang中g(shù)oroutine和channel使用介紹深入分析
一次只做一件事情并不是完成任務(wù)最快的方法,一些大的任務(wù)可以拆解成若干個小任務(wù),goroutine可以讓程序同時處理幾個不同的任務(wù),goroutine使用channel來協(xié)調(diào)它們的工作,channel允許goroutine互相發(fā)送數(shù)據(jù)并同步,這樣一個goroutine就不會領(lǐng)先于另一個goroutine2023-01-01關(guān)于golang監(jiān)聽rabbitmq消息隊列任務(wù)斷線自動重連接的問題
這篇文章主要介紹了golang監(jiān)聽rabbitmq消息隊列任務(wù)斷線自動重連接,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03Go中字符串處理?fmt.Sprintf與string.Builder的區(qū)別對比分析
在Go語言中,我們通常會遇到兩種主要的方式來處理和操作字符串:使用fmt.Sprintf函數(shù)和string.Builder類型,本文給大家介紹它們在性能和用法上有一些關(guān)鍵區(qū)別,感興趣的朋友跟隨小編一起看看吧2023-11-11Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說明
這篇文章主要介紹了Golang中基礎(chǔ)的命令行模塊urfave/cli的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Golang實現(xiàn)文件夾的創(chuàng)建與刪除的方法詳解
這篇文章主要介紹了如何利用Go語言實現(xiàn)對文件夾的常用操作:創(chuàng)建于刪除。文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2022-05-05