學習過了名稱混淆,最近又看了一些字元串加密方面的東西。
在混淆保護和加密殼中都有字元串加密保護功能。
總體上字元串加密可以分為兩類,
第一類是混淆保護中的字元串加密技術。主要特征是修改代碼執行路徑。
大部分混淆保護工具的字元串加密都是這一類。
第二類就是加密殼中的字元串加密技術。這種不用修改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)
怎麼還原,其實很簡單,我們已經知道了decode的代碼,而且已經能實作字元串的解密了。得到了字元串的對應表。
直接将
替換為
ldstr "Hellow World"
即可。寫一個小工具使用正規表達式搜尋替換就可以了。
第二類字元串加密保護:
實作就是直接對中繼資料中的String流進行加密。
這類保護有一個缺陷,程式運作後 中繼資料中的String流會解密後在記憶體中完整還原。在我前面的文章裡面有介紹中繼資料的dump。這裡就不重複羅嗦了。
對于第一類字元串加密保護,還有其它的形式,如 Helper.Decode這個函數可以是一個native的函數。
或者是和流程混淆結合。