本文的目的是提出一種在軟件中添加注冊碼的方法。至于所提出的方法是否有效,能否經(jīng)受住一些逆向大師的破解,還有待驗(yàn)證。我只是發(fā)表我的個人意見。
一、目標(biāo)。
目標(biāo)很明確,就是注冊軟件的個人信息,并根據(jù)需要生成注冊碼。而軟件本身必須能夠驗(yàn)證注冊碼是否有效。并且可以防止他人逆向計(jì)算驗(yàn)證算法,生成注冊機(jī);可以防止他人使用暴力破解方法直接修改軟件執(zhí)行代碼繞過注冊。
二、方法論
要實(shí)現(xiàn)上述目標(biāo),有兩個方面尤為重要。首先是注冊碼生成算法的選擇;二是讓軟件有自己的驗(yàn)證機(jī)制,防止可執(zhí)行程序被篡改。下面我們分別討論這兩點(diǎn)。
1. 注冊碼生成算法的選擇
現(xiàn)在很多軟件都有注冊機(jī),主要原因是軟件本身的注冊碼生成算法過于簡單。破解者可以很容易地從反匯編代碼中提取注冊算法,并且可以很容易地將其還原為C代碼。這些餅干算不上高手,但也算是高手了。我也學(xué)習(xí)了相關(guān)知識。反匯編代碼不難理解。難的是在大量的匯編代碼中找到彼此之間的調(diào)用關(guān)系,并且能夠逆向?qū)懗鱿鄳?yīng)的代碼;當(dāng)然有些懶人直接把里面的匯編代碼拉出來就可以達(dá)到破解的目的,不用了解詳細(xì)的執(zhí)行過程。
言歸正傳,不管別人怎么NB,他至少要拆機(jī),至少看匯編代碼。如果我們的算法足夠強(qiáng)大,它們就完成了。縱觀當(dāng)今的標(biāo)準(zhǔn)加密算法,無非是對稱加密和非對稱加密。我們不必再創(chuàng)建自己的算法,不要做一些吃力不討好的事情。我們設(shè)計(jì)的算法的安全性遠(yuǎn)不如現(xiàn)在常用的算法。我將簡要列出常用的算法并解釋我們?yōu)槭裁催x擇我們想要的算法。
一種。有兩種流行的對稱加密算法:DES 和 AES。DES算法廣泛應(yīng)用于銀行業(yè)。AES出現(xiàn)較晚,但其安全性優(yōu)于DES。所謂對稱是指只有一個密鑰,加解密使用相同的密碼,所以稱為對稱加密。如果我們用它來生成一個注冊密鑰,那么我們的 軟件 必須存儲這個密鑰。無論密鑰在哪里,它始終存在于一個地方,我們無法保證這個密鑰的安全性。原因很簡單,只要破解者跟著代碼走,他就知道我們在哪里讀到了密鑰。
灣。非對稱加密包括RSA、橢圓曲線等mfc軟件加注冊機(jī),最流行的是RSA。橢圓曲線的效率和安全性雖然比RSA好,但是比較復(fù)雜,原理我還是沒看懂,呵呵。它被稱為非對稱,因?yàn)樗袃蓚€密鑰,一個稱為公鑰,一個稱為私鑰。公鑰可以對外發(fā)布,私鑰自己保管。用公鑰加密必須用私鑰解密;相反,用私鑰加密必須用公鑰解密。所以,我們知道可以把公鑰的內(nèi)容保存在軟件中,可以公開(當(dāng)然要隱藏在軟件里面,總之可以公開難破解大家可以試試)。然后,我們可以將私鑰留給自己。別人拿不到私鑰,根本無法計(jì)算注冊碼。
2.至此,我們知道可以使用RSA算法,并且可以保證軟件的安全性。至少注冊機(jī)不能生成,因?yàn)閯e人沒有私鑰。但是具體怎么做,我們可以按照下面的流程進(jìn)行。
一種。注冊碼生成流程:
注冊信息(包括用戶名等信息)--->RSA私鑰加密--->注冊碼。
灣。軟件驗(yàn)證注冊碼流程:
注冊碼--->RSA公鑰解密--->注冊信息。
3. 解決了第一個目標(biāo),我們還是很難防止別人直接篡改二進(jìn)制可執(zhí)行文件,從而繞過注冊碼的驗(yàn)證。然而,總有辦法。為了解決這個問題,我想到了一個方法:軟件的自檢。具體做法如下:
一種。我們?yōu)槲覀冏约旱?軟件 生成一個檢查值,它使用摘要算法。最常用的摘要算法是MD5,相信大家都聽說過,這里不再詳述。我們只需要在軟件執(zhí)行的時候讀取可執(zhí)行程序(下面,它自己的可執(zhí)行文件是可讀的。,但是如果你想自己重寫,沒辦法)并計(jì)算校驗(yàn)值。
灣。接下來我們可以判斷校驗(yàn)值是否正確,如果不正確,我們軟件可以直接自殺。
但是這里有一個問題,我們?nèi)绾螌⒄_的校驗(yàn)和存儲在 軟件 中?不可能保存在文件或注冊表中,所以遲早會被人知道。其他人可以直接修改校驗(yàn)值,使其與錯誤校驗(yàn)值相同,從而欺騙軟件的校驗(yàn)。這是一個方法:回退到(點(diǎn)1、2)中描述的方法。如何返回?我們繼續(xù)。
4. 保存軟件的校驗(yàn)值:將校驗(yàn)值寫入注冊碼。我們修改后的(第 2 點(diǎn))流程如下:
一種。注冊碼生成流程:
注冊信息(包括用戶名等信息)+軟件校驗(yàn)值--->RSA私鑰加密--->注冊碼。
灣。軟件驗(yàn)證注冊碼流程:
注冊碼--->RSA公鑰解密--->注冊信息+軟件校驗(yàn)值。
這樣我們就可以判斷軟件是否注冊成功了。首先按照上面的步驟,計(jì)算出注冊信息和軟件校驗(yàn)值,然后將兩者與當(dāng)前用戶信息和計(jì)算出的校驗(yàn)值進(jìn)行比較。如果匹配金舟流程圖,則表示 軟件 已成功注冊。
5. 嘗試破解。
如果知道詳細(xì)過程,如何破解這個軟件?首先,我們知道注冊機(jī)不能再寫了。唯一的辦法就是破解暴利,但是破解暴利,軟件增加了自查。不過,百密間總有疏,破巨利還是可以做到的。我們先回顧一下,如果我們按照上面的方法添加注冊碼驗(yàn)證。所以我們的代碼幾乎是這樣寫的:
int ( 字符 * sn ){
該函數(shù)計(jì)算軟件的校驗(yàn)值,根據(jù)注冊碼sn解密校驗(yàn)值和用戶信息QQ拼音輸入法截圖軟件,然后比較返回校驗(yàn)是否通過。
}
……
在軟件啟動時,我們調(diào)用了上面的函數(shù)。
if( ( sn ) ){ 這里如果驗(yàn)證失敗就退出(0), 呵呵~
}
但阿喀琉斯之踵在上述①位置。因?yàn)棰傥恢玫慕M裝幾乎是這樣的:
耶 xxxxx
……
……
只是一個跳轉(zhuǎn)語句,然后破解者直接把它改成jne或者其他jmp指令就搞定了,我們的努力都白費(fèi)了。在這種情況下,我們的代碼一定不能這樣寫,或者我們的方法不應(yīng)該這么簡單。至少,我們可以這樣做:
1. 不要把驗(yàn)證算法寫成統(tǒng)一接口。
2. 不要只在一個地方評判。這實(shí)際上非常簡單有效。如果你愿意,可以在軟件中對效率不高的地方多加幾個判斷,這對破解者來說是相當(dāng)痛苦的,至少他不能同時搜索到所有關(guān)鍵位置. 只要有一個地方?jīng)]有更改成功,那么我們的自我驗(yàn)證就會起作用,然后我們就有權(quán)進(jìn)行后續(xù)的操作。比如直接刪除自己的程序(當(dāng)然這里必須關(guān)閉自己,然后調(diào)用另一個進(jìn)程刪除軟件)等等。
3. 一個更“便宜”的方法是啟動一個附加進(jìn)程,與主進(jìn)程相互監(jiān)控和驗(yàn)證。如果驗(yàn)證對方注冊異常,則殺掉對方mfc軟件加注冊機(jī),殺掉對方的可執(zhí)行程序。聽起來很便宜圖片批量壓縮工具(,但它不起作用,我不知道。
4. 如果想防止一個注冊碼到處亂用(中國人互幫互助,呵呵),可以在注冊信息中添加目標(biāo)機(jī)器的信息,添加到注冊信息中。
4.等等,這些方法有很多,大家可以自由發(fā)揮。
三. 總結(jié)
經(jīng)過上面的討論,我覺得沒有絕對的安全,有時候如果你的軟件不想被黑,那你就只能罵那些不道德的人了。但是我們可以讓他們更慘,至少菜鳥不能亂來。在中國,如果你寫一些軟件,它是開源的,它是免費(fèi)的,不要指望用它來養(yǎng)家糊口。
四. 附件
RSA加解密實(shí)現(xiàn)代碼