學習過了名稱混淆,最近又看了一些字符串加密方面的東西。
在混淆保護和加密殼中都有字符串加密保護功能。
總體上字符串加密可以分為兩類,
第一類是混淆保護中的字符串加密技術。主要特征是修改代碼執行路徑。
大部分混淆保護工具的字符串加密都是這一類。
第二類就是加密殼中的字符串加密技術。這種不用修改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的函數。
或者是和流程混淆結合。