文章名稱:hellfire2000破解過程及序號產生器的編寫(上)
作者:夜月
e_mail:luoyi.ly@yeah.net
oicq:36606500
目的:幫助和我一樣的廣大初學者。
軟體名稱:hellfire2000
軟體簡介:很酷的螢幕保護軟體。與流行的那些幾張圖片換來換去的屏保完全不同。它可以完全讓你的桌面“燃燒”
起來,還有很逼真的背景音效。如果能再加上一點嗅覺的刺激的話,呵呵...你可能真的會以為你的寶貝
compute燒起來了呢!
保護分析:1.時間保護分析:
該軟體把它的時間資訊儲存在:
[HKEY_CLASSES_ROOT\AppID\HCB1CD94CF]下,(埋得好怪呀!呵呵..)過期後,將該鍵刪除,就可以
繼續使用了。
2.註冊保護分析:
在它的設定項裡面就有三個輸入框,分別是輸入:user name,company,reg.key.用trw2000的萬能中斷
hmemcpy+pmodule很容易找到關鍵的比較處。它會先判斷reg.key的長度是否為偶數,不是的話直接出
錯。是的話,再繼續判斷是否為12位數字。不是的話,又是直接出錯,而且它的這個判斷和平常我們常
見的用ecx計數的判斷不同(下面我會提到),只有過了這兩關,才能到達計算註冊碼的核心程式碼處。
算出來的註冊嗎以兩位一組的形式和你輸入的reg.key比較,而且是數字比較,不是ascii碼比較。用
d命令不能直接在記憶體視窗的右邊看到註冊碼。它以整數的形式存放在左邊。
註冊成功後,註冊資訊儲存在:
[HKEY_CURRENT_USER\SOFTWARE\FP SOFTWARE\HELLFIRE-2000\HELLFIRE\CONFIG]下的:
LicenseCompany
LicenseKEY
LicenseUSER
三個鍵中。刪除後程式又可以重新註冊。
3.程式自我保護分析:
我曾試圖用暴力破解法改動一個位元組使程式註冊,(具體地點後面我會提到)但是第二次程式執行時,
提示我:可執行檔案被修改。小弟功力不夠,不能夠破解這個“地雷”,那位大蝦有興趣幫小弟一把,
小弟感激不盡!
教程正文:
1.輸入註冊資訊:
user name:luoyi
company: upc
reg.key: 654321
2.用trw2000跟蹤,可找到如下程式碼:
:00405EAA C784249400000000000000 mov dword ptr [esp+00000094], 00000000
:00405EB5 E806FDFFFF call
00405BC0 <---------CALL1
:00405EBA 83C40C
add esp, 0000000C
:00405EBD 85C0
test eax, eax
:00405EBF 0F84FD000000 je 00405FC2
:00405EC5 8D4C2410
lea ecx, dword ptr [esp+10]
:00405EC9 E8620B0000 call
00406A30 <---------CALL2
:00405ECE 85C0
test eax, eax
:00405ED0 0F84EC000000 je 00405FC2
:00405ED6 53
push ebx
可以看出:程式有兩個子程式來判斷註冊碼的正確與否。可是,就我跟蹤的結果來看,好像只有
CALL1起了判斷作用。好了,用F8跟入CALL1,繼續跟蹤,會看到如下程式碼:
:00405BE6 6800010000 push
00000100
:00405BEB 50
push eax
:00405BEC 51
push ecx
:00405BED E8DEFDFFFF call
004059D0 <----------CALL3
:00405BF2 83C40C
add esp, 0000000C
:00405BF5 83F806
cmp eax, 00000006 <-----------reg.key的位數比較
:00405BF8 7417
je 00405C11
大家看到了吧,一般的長度比較,都是用ecx作計數器來進行的,可是這個程式有點不一樣,它是把
長度的一半作為比較依據。(小弟在此耗時1個小時,才搞清楚eax是什麼東東,5555...真丟人!)
OK!長度的地雷已經排除了,下面進入正式的註冊碼計算階段:
:00405C6F 6A06
push 00000006
:00405C71 51
push ecx
:00405C72 E869FCFFFF call
004058E0 <---------關鍵演算法所在處
:00405C77 83C40C
add esp, 0000000C
:00405C7A 85C0
test eax, eax
:00405C7C 752B
jne 00405CA9
大家千萬不要被這個TEST EAX,EAX所迷惑,在這個關鍵演算法的CALL裡,出口的EAX總是為1。也就是
說,程式在此總是會往下面跳,跳到哪?呵呵....當然就是下面的這一段關鍵比較了:
:00405CA9 33C0
xor eax, eax
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00405CBE(C)
|
:00405CAB 8A540408
mov dl, byte ptr [esp+eax+08] --------------------
:00405CAF 8A8C0408010000 mov cl, byte ptr
[esp+eax+00000108]
:00405CB6 3AD1
cmp dl, cl <-----------看到註冊碼的比較了嗎?
:00405CB8 75C4
jne 00405C7E
:00405CBA 40
inc eax
:00405CBB 83F806
cmp eax, 00000006 迴圈6次,正好比完12位數,只要有一個
:00405CBE 72EB
jb 00405CAB 不對,就...嘿嘿....------------------
:00405CC0 8D4C2400
lea ecx, dword ptr [esp]
:00405CC4 C7842410020000FFFFFFFF mov dword ptr [esp+00000210], FFFFFFFF
:00405CCF E8F10A0100 call
004167C5
:00405CD4 8B8C2408020000 mov ecx, dword
ptr [esp+00000208]
我在開始的時候說的改動一個位元組註冊,到了這時候,大家應該都明白了吧?就是把405CB8處的JNE
改成JE就OK了!可惜....呵呵...不過,這點困難還難不到我們,我們既然找到了關鍵演算法的CALL
那我們能不能寫出序號產生器呢?(其實,這個時候,在記憶體視窗已經可以看到註冊碼了)。
出於長度的原因,軟體的演算法分析及序號產生器的編寫我就寫到這篇文章的(下)中去了!