hellfire2000破解過程及序號產生器的編寫(上) (4千字)

看雪資料發表於2001-01-19

文章名稱: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
      那我們能不能寫出序號產生器呢?(其實,這個時候,在記憶體視窗已經可以看到註冊碼了)。
      出於長度的原因,軟體的演算法分析及序號產生器的編寫我就寫到這篇文章的(下)中去了!

相關文章