淺析嵌入式加密技術(shù)
如何對(duì)付解密者利用內(nèi)存中斷機(jī)制去截獲真正的程序代碼,是構(gòu)造一個(gè)好的加密軟件的關(guān)鍵,在對(duì)現(xiàn)有加密技術(shù)進(jìn)行分析研究的基礎(chǔ)上,提出了一種新的加密技術(shù)——嵌入式加密技術(shù)。
嵌入式加密技術(shù)不是簡(jiǎn)單地建立“加密外殼”,而是將加密程序代碼直接嵌入到程序的內(nèi)部。具體而言,就是把對(duì)指紋的檢驗(yàn)過(guò)程直接加入到所需加密的程序內(nèi)部。這樣,解密者就不可能通過(guò)駐留程序去生成解密后的程序代碼。也不可能獲得整個(gè)程序的代碼,至多也只能得到一部分程序而已,而這部分程序當(dāng)然不能運(yùn)行,因?yàn)樗赡軠p少初始化成分,或因目標(biāo)碼的重定向部分出錯(cuò)等等??傊?,解密者不可能通過(guò)非跟蹤的方式去獲得加密前的程序代碼。

那么如何將加密程序嵌入到程序內(nèi)部呢?
首先,加密軟件加加載待加密的應(yīng)用軟件,根據(jù)文件頭部信息獲得該軟件的長(zhǎng)度、重定位信息和軟件的加載運(yùn)行時(shí)的起始地址等信息,而后修改文件頭內(nèi)容,增加文件的長(zhǎng)度,重新生成一個(gè)臨時(shí)文件。
然后,根據(jù)上述記錄的一些信息對(duì)開(kāi)始的一段程序進(jìn)行分析,具體來(lái)說(shuō)是把程序讀入內(nèi)存,然后對(duì)其代碼進(jìn)行分析,重點(diǎn)是記錄有CALL、JMP、JZ等指令的地方。找到這些地方的目的是準(zhǔn)備將加密檢測(cè)程序部分嵌入,也就是插入到這些斷點(diǎn),記錄下位置和此處的程序代碼,為安全起見(jiàn),可以記錄多個(gè)斷點(diǎn)。

最后,將指紋檢驗(yàn)程序嵌入到被加密程序的內(nèi)部,實(shí)現(xiàn)步驟如下:
1、保存所用的斷點(diǎn)出的程序代碼,并保存該斷點(diǎn)的下一條指令的地址。
2、修改斷點(diǎn)存處的指令代碼,使斷點(diǎn)處的指令代碼為一個(gè)長(zhǎng)跳指令,即JMP、FAR……指令,而將其指向指紋檢驗(yàn)程序處。
3、在指紋檢驗(yàn)程序的結(jié)束處再恢復(fù)斷點(diǎn)處以及斷點(diǎn)以下的指令代碼,并使程序重新跳回到斷點(diǎn)處繼續(xù)運(yùn)行。
這樣,我們就將加密程序嵌入帶程序內(nèi)部了。
為了防止解密者利用DEBUG、TD、SOFTICE等動(dòng)態(tài)調(diào)試工具進(jìn)行跟蹤,可以將嵌入式加密技術(shù)和加密外殼式加密技術(shù)結(jié)合使用。這樣,解密者一方面不能夠簡(jiǎn)單地利用駐留軟件去截獲程序代碼,另一方面他為了破譯軟件不得不花費(fèi)大量的時(shí)間去分析那些反跟蹤代碼。這樣,解密者就會(huì)變得素手無(wú)策,從而達(dá)到加密的目的。







