程式名稱:Audio Sphere v2.57
作者: LaptoniC
目標下載地址: http://www.svet-soft.com
軟體型別: Sound application
工具: SoftICE,IDA
前言:
越來越多的程式在他們的註冊碼驗證流程中使用了密碼學演算法。不過,雖然他們大部分使用的是著名的強度很高的演算法,或者是HASH函式,但是,它們在實現這些演算法的時候存在著很多的漏洞和弱點。在這篇文章中,我將告訴你,如何在幾分鐘之內破解一個強度極高的註冊碼驗證演算法。
正文:
我們的目標是AudioSphere.就我所知,這個公司所有的程式都使用同一個演算法加密。這個軟體的老版本已
經做出了序號產生器。這個公司的職員們監視著各個破解站點,在了他們一個版本的軟體的序號產生器發布之後,
他們就會升級他們的程式。並且他們的有些軟體內部還有CRC校驗。例如:George's Notes。由於這些軟
件都是用Dephi寫的,所以,要跟蹤分析程式的程式碼有一些難度。所以,你需要使用Dede和IDA來幫助你
更好地分析程式。好了,讓我們來嘗試著註冊它。
在註冊對話方塊中,隨便輸入一些數字。跟蹤程式的流程。你會看到把名字和註冊碼都進行了一些運算,把
結果存放到登錄檔中。所以,我們最好關閉程式,在它啟動的時候對登錄檔操作下斷點,那樣,我們可以更快地到達演算法的核心。
程式從SOFTWARE\Svetlana Software\AudioSphere中讀取rName和rKey兩個鍵值,所以,我們的斷點設定
如下:
bpx RegQueryValueExA IF *(ESP->8) == 'rKey' DO "D ESP->14;"
當你開啟程式的時候,你會被中斷2次,在第二次中斷以後,你可以看到程式對登錄檔裡的值進行了一些
運算,還原得到我們輸入的數值。然後,你會看到如下程式碼:
mov edx, offset aAusp2471492081
; "AUSP2471-4920818318240628-66436089" call LStrCmp
jz loc_48C61A
lea ecx, [ebp+var_30]
mov eax, [ebp+var_4]
mov edx, [eax+454h]
mov eax, [ebp+var_4]
call sub_485760
mov eax, [ebp+var_30]
mov edx, offset aAusp0765983246
; "AUSP0765-9832461809369656-14032654" call LStrCmp
jz short loc_48C61A
lea ecx, [ebp+var_34]
mov eax, [ebp+var_4]
mov edx, [eax+454h]
mov eax, [ebp+var_4]
call sub_485760
mov eax, [ebp+var_34]
mov edx, offset aAusp5902329790
; "AUSP5902-3297905884364589-44425670" call LStrCmp
程式把我們輸入的數值和黑名單中的進行比較。這樣,我們就可以知道正確的註冊碼的格式了。我按照這
個格式輸入了一個假的註冊碼:AUSP0123-123456789012345-12345678,然後繼續跟蹤。為了減少跟蹤的
時間,我們可以在註冊碼上面設一個bpm斷點。中斷後,我們可以看到如下程式碼:
MOV EAX,[EBP-10] ;
Here our serial is at eax
CALL 004914D8
我跟進了這個Call,發現在這裡,它把我們輸入的註冊碼分成2部分,然後呼叫44DB38處的子程式對它們
進行處理,我跟進44DB38處的子程式,在這個子程式的第一個Call裡頭,我看到如下程式碼:
push ebx
add esp, 0FFFFFFF0h
mov ebx, eax
mov [esp+10h+var_10],
67452301h
mov [ESP+10h+var_C],
0EFCDAB89h
mov [ESP+10h+var_8],
98BADCFEh
mov [ESP+10h+var_4],
10325476h
lea edx, [ebx+7Ch]
mov eax, ESP
mov ecx, 4
call Move_int
很明顯,這些數是MD5和MD4演算法初始化中要用到的。我猜這個程式在這裡使用的是MD5對我們註冊碼的一
半進行Hash運算。為了驗證我的猜測,在這個Call執行完後,我檢查了AUSP0123-12345678的MD5值,結果
和程式運算的結果:d1c40a23337b9c55905e64ddfa460305完全一樣.程式把這個結果和它內部的3,5百個
值進行比較,如果有相等的,就認為正確。對我們註冊碼的第2部分也進行同樣操作。
由於作比較的值有300-500個,而且註冊碼是以AUSP開頭的,所以,我們可以用窮舉法搜尋合適的註冊
碼。我從AUSP0000-00000000 窮舉到 AUSP0000-99999999。在PIII 450上,我用了13-15分鐘完成窮舉。
如果你想自己寫一個窮舉程式的話,我建議你使用SSLeay庫,因為它作了一些最佳化,可以加快我們的速
度。
其實,如果你僅僅是想註冊這個程式的話,並不需要窮舉的。程式就是把你序列號的MD5值和內部的一些
數進行比較,所以,你只要把黑名單中的註冊碼都分成兩部分,進行一下新的組合,就可以得到10多個
可用的序列號了。
後記:今天在Fravia閒逛,看到這篇文章,覺得真的很不錯。於是拿著蹩腳的E文翻譯了一下,推薦給大
家,主要是介紹一個新的思路。我覺得,對於一個初學者,從這裡至少能學到如下幾點東西:
1.)條件斷點的設定。斷點的設定,很大程度上取決於個人對逆向工程的理解程度,一個好的斷點,會
給你的工作帶來很大的便利。Trw雖然也可以設定條件斷點,不過總的來說功能沒有Sice強大。
2.)如何識別程式使用了何種加密演算法。當然,這個問題不是一兩篇文章就能說的清楚的。要認出程式
使用的演算法,自己首先要對該演算法很熟悉,才能從一些蛛絲馬跡中推測出來。就我的經驗,要識別
出演算法主要有2個方法:
a.)反彙編
b.)看演算法初始化
前者是靜態的分析,後者是動態的跟蹤。
我發現有些初學者拿到一個軟體,不管三七二十一,拿著Trw就Load,然後一步一步地跟蹤。忽略了
對目標軟體的考察,這樣是非常不利於提高自己的水平的。至少,用FileInfo考察檔案資訊,然後
用W32dasm或者Dede進行反彙編。我覺得這兩步是必不可少的。
3.)不要忽視軟體的黑名單。有時它會起到意想不到的作用。最重要的就是我們可以用它得到序列號的 格式。這對於破解來說很重要。
最後給出幾個可能初學者不太熟悉的名詞的解釋,算是科普吧?呵呵……
Hash:把輸入進行運算,得到定長的輸出。最大的特點是不可逆。著名的Hash演算法有MD5,SHA1等
SSLeay:一個數學運算庫,主要應用在大數運算領域。著名的運算庫還有:FreeLip,Miracl等。