一個CrackMe的破解以及序號產生器的製作 (4千字)

看雪資料發表於2001-08-16

一個CrackMe的破解以及序號產生器的製作

    自從研究CCG的CrackMe之後 便開始對CrackMe這個東西很感興趣,所以跑到DDXia前輩的主頁上逛了一圈準備借鑑
一下別人的優秀思想,完善一下自己正在醞釀中的CrackMe,太難的破不了,太簡單的又沒有意思,找了一箇中等難度的東西Down了下來,回來一看,正好適合寫偏教程給初學者講講 ^_^ 說不定以後FCG的考試也要用CrackMe了呢

這個東西的註冊方法很普遍 就是Name/SN的格式 先進入註冊視窗 輸入姓名:NYDoll 註冊碼:38383838 執行TRW下斷點BPX HMEMCPY 然後回到程式點選註冊按鈕,被TRW欄下,清除斷點BC * 輸入PMODULE到程式領空 然後要按一陣F10之後來到這裡:

:004479A6 837DF400                cmp dword ptr [ebp-0C], 00000000
:004479AA 0F8428020000            je 00447BD8
:004479B0 8BB338030000            mov esi, dword ptr [ebx+00000338]
:004479B6 807E0500                cmp byte ptr [esi+05], 00
:004479BA 0F8420010000            je 00447AE0

//省略一部分程式碼

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004479BA(C)
|
:00447AE0 33F6                    xor esi, esi
:00447AE2 8D55F4                  lea edx, dword ptr [ebp-0C]
:00447AE5 8B83D4020000            mov eax, dword ptr [ebx+000002D4]
:00447AEB E868BDFDFF              call 00423858
:00447AF0 8B45F4                  mov eax, dword ptr [ebp-0C]
:00447AF3 E83CBFFBFF              call 00403A34 
:00447AF8 85C0                    test eax, eax
:00447AFA 7E4B                    jle 00447B47
:00447AFC 8D55F4                  lea edx, dword ptr [ebp-0C]
:00447AFF 8B83D4020000            mov eax, dword ptr [ebx+000002D4]
:00447B05 E84EBDFDFF              call 00423858
:00447B0A 8B45F4                  mov eax, dword ptr [ebp-0C] //載入使用者名稱
:00447B0D E822BFFBFF              call 00403A34
:00447B12 8BF8                    mov edi, eax //得到使用者名稱的字元數
:00447B14 85FF                    test edi, edi //比較使用者名稱是否為空
:00447B16 7C2F                    jl 00447B47 //跳走就死翹翹了 :(
:00447B18 47                      inc edi
:00447B19 C745F800000000          mov [ebp-08], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00447B45(C)
|
:00447B20 8D55F4                  lea edx, dword ptr [ebp-0C]
:00447B23 8B83D4020000            mov eax, dword ptr [ebx+000002D4]
:00447B29 E82ABDFDFF              call 00423858
:00447B2E 8B45F4                  mov eax, dword ptr [ebp-0C] //載入使用者名稱
:00447B31 8B55F8                  mov edx, dword ptr [ebp-08] //記錄迴圈次數
:00447B34 0FB64410FF              movzx eax, byte ptr [eax+edx-01] //將使用者名稱的第一位以ASCII碼形式存到EAX,第一次迴圈值為零。
:00447B39 03F0                    add esi, eax    //與上一次迴圈後得到的累加值相加
:00447B3B 03B314030000            add esi, dword ptr [ebx+00000314] //當前字元的十進位制值加上11111
:00447B41 FF45F8                  inc [ebp-08]
:00447B44 4F                      dec edi //計數器
:00447B45 75D9                    jne 00447B20 //使用者名稱全部計算完畢則跳走

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00447AFA(C), :00447B16(C)
|
:00447B47 8D55FC                  lea edx, dword ptr [ebp-04]
:00447B4A 8BC6                    mov eax, esi //將累加值壓入EAX暫存器
:00447B4C E857FBFBFF              call 004076A8
:00447B51 FFB30C030000            push dword ptr [ebx+0000030C]
:00447B57 FF75FC                  push [ebp-04]
:00447B5A FFB310030000            push dword ptr [ebx+00000310]
:00447B60 8D45FC                  lea eax, dword ptr [ebp-04]
:00447B63 BA03000000              mov edx, 00000003
:00447B68 E887BFFBFF              call 00403AF4
:00447B6D 8D55F4                  lea edx, dword ptr [ebp-0C]
:00447B70 8B83D8020000            mov eax, dword ptr [ebx+000002D8]
:00447B76 E8DDBCFDFF              call 00423858
:00447B7B 8B55F4                  mov edx, dword ptr [ebp-0C] //EDX中為我輸入的註冊碼
:00447B7E 8B45FC                  mov eax, dword ptr [ebp-04] //EAX中為剛才迴圈完後的累加值
:00447B81 E8BEBFFBFF              call 00403B44
:00447B86 7528                    jne 00447BB0  //如果不相等就死了 :(

//到此為止,整個CrackMe的演算法已經完全弄明白了,為了使大家加深印象我再綜合的復訴一邊:
//舉例說明NYDoll是如何產生出正確的註冊碼78339的
//(1)依次去NYDoll中的字元,並將它以ASCII碼的形式儲存
//(2)ASCII碼的值加上11111,再儲存起來
//(3)若使用者名稱沒有取完則迴圈,第二次ASCII碼值加上11111的結果和第一次的累加值相加
//(4)若第一次迴圈,則累加值為11111
//即註冊過程的中間資料為:11111+(78+11111)+(89+11111)+(68+11111)+(111+11111)+(108+11111)+(108+11111)
//結果等於78339即為正確的註冊碼了


                                            By 娃娃(NYDoll)
今天太困了 明天貼序號產生器! Bye For Now

相關文章