學習過了名稱混淆,最近又看了一些字串加密方面的東西。
在混淆保護和加密殼中都有字串加密保護功能。
總體上字串加密可以分為兩類,
第一類是混淆保護中的字串加密技術。主要特徵是修改程式碼執行路徑。
大部分混淆保護工具的字串加密都是這一類。
第二類是加密殼中的字串加密技術。這種不用修改IL代碼,直接對元資料中的字串加密。
這一類以remotesoft,maxtocode為代表。
先看第一類,加密實作大致如下。
加密前:
MessageBox.Show("Hellow World!");
加密後:
MessageBox.Show(Helper.Decode("A34579dfbbeyu346563345/=="));
簡單的說法就是將原來使用字串的地方,將直接使用字串改為間接使用字串。
在這裡保護軟體將字串"Hellow World!" 進行加密得到結果"A34579dfbbeyu346563345/==" 。
Helper.Decode 是保護軟體提供的解密函數,它實現將"A34579dfbbeyu346563345/==" 還原為"Hellow World!" 。
因為是混淆保護,所以我們可以分析得到Decode 的程式碼。然後直接用這個函數的程式碼寫一個小工具將程式集中所有加密的字串都還原。產生一個字串對應表。以方便代碼閱讀和調試。
如果再深入,可以實現自動將字串還原到原始程式集中。
再來看上面例子的IL程式碼。
加密前:
ldstr "Hellow World!"
call MessageBox.Show(string)
加密後:
ldstr "A34579dfbbeyu346563345/=="
call string Helper.Decode(string)
call MessageBox.Show(string)
怎麼還原,其實很簡單,我們已經知道decode的程式碼,而且已經能實現字串的解密了。得到了字串的對應表。
直接將
ldstr "A34579dfbbeyu346563345/=="
call string Helper.Decode(string)
替換為
ldstr "Hellow World"
即可。寫一個小工具使用正規表示式搜尋替換就可以了。
第二類字串加密保護:
實作就是直接對元資料中的String流進行加密。
這類保護有一個缺陷,程式運行後元資料中的String流會解密後在記憶體中完整還原。在我前面的文章裡面有介紹元資料的dump。這裡就不重複囉嗦了。
對於第一類字串加密保護,還有其它的形式,如Helper.Decode這個函數可以是一個native的函數。
或是和流程混淆結合。