徐濤
摘 要:軟件的開發(fā)需要大量的人力與智力的投入,提高軟件的安全性才能保障開發(fā)者的合法權(quán)益。對軟件進行加密是保護軟件知識產(chǎn)權(quán)的最好方法,在軟件內(nèi)部實現(xiàn)加密技術(shù)容易被進行跟蹤、分析、反編譯等手段破解?;赨SB接口硬件加密狗以其通用性好、成本低等優(yōu)勢在小型軟件中得到廣泛應(yīng)用。軟件破解技術(shù)也隨著加密技術(shù)提高而進步,任何加密技術(shù)都不能確保絕對的安全。通過實例分析加密狗應(yīng)用中的就安全問題,探討結(jié)合其他加密技術(shù)增強軟件的防破解能力。
關(guān)鍵詞:加密狗;反編譯; 加殼;軟件安全;知識產(chǎn)權(quán)
中圖分類號:TP309.7 文獻標(biāo)識碼:A 文章編號:1009-3044(2016)07-0081-03
The Application of Software Protection Based on Dongle
XU Tao
(Open University of Kunshan, Kunshan 215300, China)
Abstract:Software developments need a large number of manpower and intellectual investments. Only when the security of software is improved, will legitimate rights and interests of software developers be protected.The encryption software is the best way to protect the intellectual property of software; however internal encryption technology is easy to be decrypted by tracking, analysis and decompilation. With the advantages of high versatility and low cost, USB interface hardware dongles are applicated in small softwares widely.With the developments of encryptions, the decryptions are improved as well, so that all encryptions cannot ensure absolute safety.By instance analysis the safety issues of dongles, with other encryptions, to enhance the anti-crack abilities of softwares.
Key words:dongle; decompile; software packing; software security; intellectual property right
1 概述
軟件產(chǎn)品凝聚著開發(fā)者的智慧與勞動,由于軟件產(chǎn)品的特殊性,軟件的非法拷貝會給開發(fā)者帶來經(jīng)濟上巨大的損失。 雖然國家在法律層面對軟件的知識產(chǎn)權(quán)進行了保護,但軟件自身通過技術(shù)手段加密保護同樣重要。加密后的軟件要花費破解者大量的精力進行破解和修改,增加了破解的門檻與成本。
常見的軟件保護方法有:硬件加密和軟件加密兩種。硬件加密是通過采用加密狗、盤保護等硬件實現(xiàn)加密,也有通過對CPU 序列號、硬盤序列號、MAC 等硬件的唯一性綁定來實現(xiàn)對軟件的保護。常見的軟件保護有:軟件水印、注冊驗證、軟件加殼保護等。
沒有任何加密是絕對安全的,解密技術(shù)也隨著加密技術(shù)一同進步,傳統(tǒng)的軟件保護方法遇到越來越多的挑戰(zhàn),需要提出更新的軟件保護方式應(yīng)對。
2 加密狗介紹
加密狗是利用儲存在硬件中的信息對軟件進行加密保護, 軟件通過特殊指令對USB接口的加密狗讀取和校驗,由于加密狗硬件不易復(fù)制,保護性能較好。
任何加密技術(shù)都不是絕對安全的,加密狗同樣也有存在補破解的問題,常見破解加密狗的方法有三種:1) 通過硬件方式克隆或者復(fù)制出同樣的加密狗;2)利用Debug工具調(diào)試跟蹤軟件,將加密、判斷等代碼跳過或修改;3)編寫程序仿真軟件狗,攔截軟件和加密狗之間的通信。
3 加密狗安全漏洞實例
大多數(shù)硬件加密狗公司會提供加密狗的一些DLL的連接或簡單的API調(diào)用,通過反編譯、改寫程序,容易便加密狗也失去作用。以某款jsp網(wǎng)站為例,軟件中的登錄頁為Login.jsp,很容易看出其中的loginAction.action為登錄動作。按照常規(guī)的登錄流程可知,在登錄時必定要進行加密狗的訪問從而判斷是否合法登錄,JSP可對加密狗訪問判斷模塊封閉成class,當(dāng)找到其LoginAction.class類文件對其進行反編譯得到源文件如下:
public class LoginAction //LoginAction登錄動作類
{public LoginAction()
String dog = DogUtil.validate( );//讀取加密狗驗證狀態(tài)信息方法
if(!"1".equals(dog)) //判斷加密狗的讀取狀態(tài)
{request.setAttribute("errorMessage", "xxxx");//未驗證成功則返回錯誤提示信息
return "login"; }//錯誤返回重新登錄
...... } //其他代碼略
很顯然DogUtil類是負(fù)責(zé)進行加密狗驗證, 成員函數(shù)validate( )用以返回驗證加密狗的狀態(tài)結(jié)果。找到DogUtil.class類文件,同樣通過反編譯得到其類的源代碼如下:
public class DogUtil //加密狗讀取類
{ public DogUtil() //構(gòu)造函數(shù)
{ }
public static String validate()
{ IET99 ET99;
int tokenCount[];
byte pid[];
ET99 = new CET99();
String chPid = "";
tokenCount = new int[1];
pid = new byte[8];
char charPid[] = new char[8];
try
{ chPid = ReadConfigXML.read(); //讀取加密狗信息
EncryptUtils des = new EncryptUtils("xxxx");
chPid = des.decrypt(chPid); }
catch(Exception e1) //異常處理
{ return "0"; }
for(int i = 0; i < 8; i++)
{ charPid[i] = chPid.charAt(i);
pid[i] = (byte)charPid[i]; }
ET99.FindToken(pid, tokenCount); //判斷加密狗信息
System.out.println(tokenCount[0]);
if(tokenCount[0] != 0) //根據(jù)判斷確定返回加密狗狀態(tài)信息
return "1";
else return "0";
.... }//部分代碼略
public static void main(String args[ ])
{ validate( ); } }
只要有java編程經(jīng)驗的人都可以很明顯的看出:以上if…else…語句是實現(xiàn)對讀加密狗取后信息的判斷,如果吻合則return "1",反之則return "0".通過validate()成員函數(shù)通過改寫則可以繞開驗證,最簡單的改寫方式如:
public static String validate()
{ return "1"; }
將以上源文件進行編譯得到的類去覆蓋原始文件,這樣無論軟件是否帶狗運行都永遠(yuǎn)認(rèn)為是通過了合法驗證。
也有開發(fā)者用利如:java obfuscator混編器來把程序進行打亂,給破解者設(shè)置障礙,但這種方法容易被軟件重新整理,所以也不安全。
4 軟件“加殼”技術(shù)
“加殼”技術(shù)是對可執(zhí)行程序進行壓縮來實現(xiàn)對程序的保護,它利用特殊算法對可執(zhí)行程序中的代碼和資源進行壓縮。壓縮后的文件可獨立運行,解壓在內(nèi)存中完成,解壓過程隱蔽。加殼后的程序可直接運行, 只有經(jīng)過脫殼才可以看到程序的源代碼。外殼程序被執(zhí)行后會將原程序解壓到內(nèi)存中,解壓后的程序與被加殼前功能完全相同,解壓后外殼程會把控制權(quán)交還給脫殼后的程序。由于加殼后程序以加密的形式存在,在執(zhí)行時才在內(nèi)存中還原,可有效防止對程序進行靜態(tài)反編譯和篡改。
加殼后的程序執(zhí)行時由Loader加載器將程序載入內(nèi)存進行解密、還原等操作,再將控制權(quán)交還給原的程序。許多加密狗會附帶的加殼工具,可以利用加密狗實現(xiàn)對程序的加密,更加便捷和高效的實現(xiàn)軟件的加密。
5 軟件“脫殼”技術(shù)
加殼后的軟件同樣會有被逆向脫殼的問題,常見的有手工脫殼或利用專門的脫殼軟件實現(xiàn)自動脫殼兩種,脫殼后的程序容易被破解。
應(yīng)用常采用以下方法提高被脫殼的難度:
5.1 多次加殼技術(shù)
采用不同的加殼軟件對程序文件進行多次加殼,從而達(dá)到增強軟件的保護強度。
5.2 偽裝加殼技術(shù)
通過改變程序的特征屬性來偽裝程序,干擾軟件破解者。使破解者無法正確分辨軟件的外殼類型。
5.3 添加“花指令”
加殼時也常在原程序的代碼段里中加入無用的數(shù)據(jù),反匯編時這些數(shù)據(jù)迷惑反編譯引擎,提高破解的難度。
6 結(jié)束語
“加殼”會增加程序?qū)?nèi)存占用和CPU的處理量,在速度與安全之間選擇畢竟安全更為重要。只使用加密狗而未對程序進行回加殼容易通過對程序的逆向工程破解加密狗讀寫模塊,將加密代碼內(nèi)置在程序中進行加殼容易被通過脫殼后破解。采用加密狗與加殼技術(shù)結(jié)合將程序加殼密碼外置到加密狗中的方式無疑給程序的破解增加了難度,使程序得到更多一層安全保護。
軟件破解與防破解是軟件安全領(lǐng)域的一個永恒話題,軟件破解技術(shù)也將伴隨著保護技術(shù)的發(fā)展而進步。沒有哪技術(shù)能保證軟件的絕對安全,只能通過對軟件的破解增加難度與復(fù)雜度來提高軟件的相對安全性。
參考文獻:
[1] 李文.基于殼技術(shù)的軟件保護研究[D].成都: 電子科技大學(xué),2012.
[2] 林漢玲.密碼技術(shù)在 Java 類文件保護技術(shù)中的新應(yīng)用[J].現(xiàn)代電子技術(shù),2013,36 (3) :102-103.
[3] 吳德會,王志毅.基于混沌保密的 USB 軟件加密狗及其反解密研究[J].微計算機息,2005(8):12-13.
[4] 楊波.現(xiàn)代密碼學(xué)[M].北京:清華大學(xué)出版社,2003:15-16.
[5] 許永和.8051單片機USB接口程序設(shè)計[M].北京:北京航空航天大學(xué)出版社,2004.
[6] 楊新柱.可執(zhí)行文件格式分析與應(yīng)用[D].北京:北京郵電大學(xué),2009:30-34.
[7] 蔣陽,黃志葵.智能型并口用軟件加密狗的設(shè)計[J].電子技術(shù),2002(6):23-24
[8] 蘭勇,龔捷,劉亦歆.軟件保護機制研究[J].電腦知識與技術(shù),2014,10(5):1083-1084.