本文將介紹軟件加密鎖的一些編程技巧,以及軟件開發(fā)者將如何編寫安全可靠的代碼,如何對付各種各樣的加密狗破解,編寫加密程序時應(yīng)該盡量避免的一些問題等等。以下是全文。
一、加密狗加密的基本原理
開發(fā)商程序通過調(diào)用硬件加密狗的接口模塊對硬件加密狗操作,硬件加密狗響應(yīng)該操作并通過接口模塊將相應(yīng)數(shù)據(jù)返回給開發(fā)商的應(yīng)用程序。開發(fā)商的應(yīng)用程序可以對返回值進(jìn)行判定并采取相應(yīng)的動作。如果返回?zé)o效的響應(yīng),表明沒有正確的狗,開發(fā)商可以將應(yīng)用程序終止運(yùn)行,或者讓應(yīng)用程序以錯誤的方式執(zhí)行。簡要示意如下:
二、常用的解密方法
1、反匯編后靜態(tài)分析: W32Dasm、IDA Pro
2、用調(diào)試工具跟蹤動態(tài)分析:SoftICE、TRW2000
3、針對各種語言的反匯編工具:VB、Delphi、Java等
4、其他監(jiān)視工具:FileMon、RegMon 等
三、如何提高加密強(qiáng)度
下面,我們以Sentinel SuperPro加密鎖為例,詳細(xì)介紹一下使用如何在編程的過程中提高加密強(qiáng)度的方法。
1、反DEBUG解密的編程方法和技巧
訪問狗之后不要立即做判斷,判斷狗不正確后,不要立即提示,或者不提示。開發(fā)商在程序各個部分插入校驗(yàn)算法的代碼,用以增加程序代碼的復(fù)雜性,防止解密者輕易跟蹤發(fā)現(xiàn)全部的校驗(yàn)代碼。校驗(yàn)代碼插入程序的頻率越高,破解難度越大,軟件就越安全。
重要的字符串不要在程序中以明文出現(xiàn),應(yīng)該使用算法動態(tài)生成。
在不影響程序效率的情況下,盡量多寫一些查狗的函數(shù),彼此要有區(qū)別,使用不同的算法,多一些查狗出錯的標(biāo)志,讓這些標(biāo)志參與運(yùn)算,在不同的模塊中,使用不同的查狗函數(shù)。
針對某一具體查詢校驗(yàn),都有三步驟組成:查詢得到響應(yīng)串;比較響應(yīng)串和查詢串是否匹配;根據(jù)校驗(yàn)結(jié)果執(zhí)行相應(yīng)的步驟。建議三個步驟要延時執(zhí)行。最好將三步驟相互遠(yuǎn)離些,甚至放到不同的子程序或函數(shù)中。例如:執(zhí)行“查詢得到響應(yīng)串”后,相隔50行執(zhí)行“比較響應(yīng)串和查詢串是否匹配”,假如程序需要調(diào)用一個函數(shù)。那么就在這個函數(shù)里執(zhí)行“執(zhí)行相應(yīng)的步驟”。解密者在跟蹤過程中,即使發(fā)現(xiàn)了其中一部分程序代碼,但很難發(fā)現(xiàn)另外兩部分代碼和全部三部分之間的關(guān)聯(lián)。程序難于被破解。
將加密鎖返回的“響應(yīng)串”作為程序中的參數(shù)使用。例如:算法單元返回“響應(yīng)串”是“87611123”,而程序中需要使用“123”這個參數(shù)。程序中得到“響應(yīng)串”后,將“響應(yīng)串”減去“87611000”得到參數(shù)。如果解密者修改代碼跳過查詢校驗(yàn)加密鎖部分,參數(shù)將是錯誤值,從而會使程序運(yùn)行紊亂。
程序在驗(yàn)證加密算法過程中,一般情況下驗(yàn)證數(shù)據(jù)不正確程序就會選擇退出。這樣一來很容易被解密者發(fā)現(xiàn)代碼特征,跳過查詢校驗(yàn)部分。開發(fā)商設(shè)計(jì)查詢校驗(yàn)部分時,如果程序校驗(yàn)數(shù)據(jù)不正確,程序也不退出可以繼續(xù)執(zhí)行一些無用的操作使程序紊亂,用以隱蔽代碼迷惑解密者。
開發(fā)商的軟件可能有多個模塊,查狗的模塊或接口不要用顯而易見的名字來命名,這樣會令解密者更容易找到加密點(diǎn),當(dāng)然也可以利用一些名字來迷惑解密者,尤其是dll,引出函數(shù)時甚至可以不用函數(shù)名。
給查狗函數(shù)加入一定的隨機(jī)性,例如,隨機(jī)地執(zhí)行某一API函數(shù),或者在狗的存儲區(qū)中劃定一小塊區(qū)域作隨機(jī)讀寫,讀寫地址、讀寫內(nèi)容、讀寫長度都是隨機(jī)取的,這樣可以很好地防止那些模擬工具。
試用版與正式版要分開,試用版不提供的功能,代碼已經(jīng)刪掉,使得不可能利用試用版破解得到正式版。
在大多數(shù)情況下,破解是通過更改exe 或 dll 文件實(shí)現(xiàn)的,要在程序中檢查exe或dll文件的完整性,即利用某種算法計(jì)算出整個文件的校驗(yàn)和,在程序中比較,如果文件被更改,校驗(yàn)和就會變化,這類算法網(wǎng)上有很多,可以查得到。另外,exe和dll之間要相互認(rèn)證,一方面防止dll被替換,另一方面防止非法exe訪問dll。
小結(jié):應(yīng)該盡量避免的問題
訪問狗、做判斷、提示用戶寫在一起
重要的字符串在程序中以明文出現(xiàn)
在狗中存放字符串,程序中讀出比較
調(diào)用同一函數(shù)或判斷同一個全局標(biāo)志查狗
試用版軟件同正式版軟件是同一份
查狗的模塊或接口名字太明顯
程序無隨機(jī)性,每次運(yùn)行執(zhí)行路徑都一樣
沒有檢查exe 或 dll 文件的完整性,exe 和 dll 之間也沒有相互認(rèn)證
2、反“監(jiān)聽仿真”軟件保護(hù)鎖的編程方法
隨機(jī)查詢法:開發(fā)商使用SuperPro開發(fā)工具生成大量查詢、響應(yīng)對,如:1000 對,并在程序中使用這些校驗(yàn)數(shù)據(jù)。在程序運(yùn)行過程中,從1000 對查詢、響應(yīng)對之中,隨機(jī)的抽出其中一對驗(yàn)證SuperPro加密算法。因?yàn)?,校?yàn)數(shù)據(jù)很多,每次驗(yàn)證加密算法使用的“查詢響應(yīng)對”可能不同,“監(jiān)聽仿真”軟件即使紀(jì)錄了一部分“查詢響應(yīng)對”,但無法紀(jì)錄全部“查詢響應(yīng)對”。軟件每次運(yùn)行時,都可能使用新的查詢響應(yīng)校驗(yàn)數(shù)據(jù),“監(jiān)聽仿真”軟件無法響應(yīng)這些新的查詢。因此,“監(jiān)聽仿真”也就失去了模擬、仿真SuperPro軟件保護(hù)鎖的作用。
延時法:開發(fā)商可以事先使用開發(fā)工具生成大量的校驗(yàn)數(shù)據(jù),即:“查詢、響應(yīng)”對,比如:200000 組“查詢、響應(yīng)”對,開發(fā)程序過程中,開發(fā)商設(shè)計(jì)定時查詢、校驗(yàn)加密鎖的機(jī)制。在程序運(yùn)行過程中,每10分鐘查詢并校驗(yàn)加密鎖一次,使用過的校驗(yàn)數(shù)據(jù),4年內(nèi)不再重復(fù)使用。即使監(jiān)聽軟件24小時記錄數(shù)據(jù),也需要4年才能紀(jì)錄完畢。4年后,軟件早已過了“熱賣期”了,使用監(jiān)聽軟件的解密者也就失去了行動意義。
分組、分時法:開發(fā)商可以在程序中把查詢響應(yīng)對分組,比如:1200 對校驗(yàn)數(shù)據(jù)可分為12組,每100對一組。程序在一年中的第一月使用第一組校驗(yàn)數(shù)據(jù),第二月使用第二組校驗(yàn)數(shù)據(jù),以此類推。監(jiān)聽軟件就算記錄了第一月的校驗(yàn)數(shù)據(jù),第二個三個月以后校驗(yàn)數(shù)據(jù)沒有紀(jì)錄,在以后的時間段軟件仍然無法正常使用,從而“監(jiān)聽仿真”失去意義。
隨機(jī)噪聲數(shù)據(jù)法:開發(fā)商可以在程序中隨機(jī)產(chǎn)生查詢數(shù)據(jù),隨機(jī)數(shù)據(jù)和真實(shí)數(shù)據(jù)混合在一起,監(jiān)聽軟件即使記錄了查詢數(shù)據(jù),也會被其隨機(jī)性所迷惑,同時也無法仿真另一個次軟件運(yùn)行產(chǎn)生的隨機(jī)數(shù),加密軟件也就無法破解