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