第七章-尋找軟體的註冊碼

看雪資料發表於2015-11-15

第七章-尋找軟體的註冊碼
我們來尋找軟體真正的註冊碼!
尋找軟體的註冊碼就像你小時玩的躲貓貓一樣,簡單又有趣,雖然後來你會不這樣覺的 第七章-尋找軟體的註冊碼
好的,我們開始。
我不知道你有沒有明白我前面在原理中講的那些東西,如果沒明白,我就再說一遍 第七章-尋找軟體的註冊碼
軟體通過你輸入的使用者名稱或者機器碼什麼的生成一個正確的註冊碼來與你輸入的註冊碼進行比較,如果兩個相同,也就是說你輸入的註冊碼是正確的話,那軟體就會完成註冊。如果你輸入的不正確,嘿嘿,當然就不會註冊成功。
好的,現在你已經知道軟體會有一個比較兩個註冊碼的過程,這就是關鍵所在。一般如果你遇到的是那種明碼比較的軟體,這會是一件非常另人愉快的事情的 第七章-尋找軟體的註冊碼
軟體會先計算出正確的註冊碼然後再與你輸入的那個進行比較,也就是說正確的註冊碼會被軟體自己算出來!嘿嘿,搜身你會嗎?雖然法律以及道德不允許我們去搜身,但… 第七章-尋找軟體的註冊碼
我接著說,雖然現在的軟體已經比以前要厲害上許多,但,那種用明碼比較的,還是大有人在的。所謂明碼比較,就是說軟體先算出正確的註冊碼,然後放到記憶體或你家的沙發下面,之後再得到你輸入的那個註冊碼,接著就比較了。呵呵,好理解吧,我們只要找到那個比較的地方,看一下軟體把註冊碼放到記憶體的哪裡了,再到相應的記憶體處瞧一瞧,就萬事OK了!
還記的對你說過的那些常見的(也是最菜的)比較嗎?我撿其中最簡單的一個來給你再解釋一下:
mov  eax [      ]   這裡可以是地址,也可以是其它暫存器 該條指令也可以是mov  eax [       ]
mov  edx [      ]   同上   通常這兩個地址就儲存著重要資訊  該指令也可以是 pop edx
call 00??????   關鍵call
jz(jnz)或  jne(je)  關鍵跳轉
第一條mov eax [   ]指令是將一個記憶體地址或另外一個暫存器(該暫存器中裝的是記憶體地址)裝入eax中。第二條指令與其相同,是將一個記憶體地址或另外一個暫存器中的記憶體地址裝入edx中。而這兩條指令是幹什麼的呢?嘿嘿嘿嘿…
這兩條指令就是用來存放真假兩個註冊碼的地址的,也就是說eax和edx這兩個暫存器中此時一個裝的是正確的註冊碼的記憶體地址,一個是你輸入的那個錯誤的註冊碼的記憶體地址。軟體在比較註冊碼前將兩個註冊碼的記憶體地址分別裝入到兩個暫存器中,然後就是關鍵Call出場。在這個關鍵Call中對註冊碼進行比較時,軟體會從相應的暫存器中取出兩個註冊碼來比較,接著出來就是一個關鍵跳轉,通過上面Call中的比較結果來做相應的跳轉…
你應該已經想到什麼了吧!沒錯,我們只要找到軟體的關鍵Call,然後在關鍵Call處來檢視相應的記憶體地址就可以找到正確的註冊碼了 第七章-尋找軟體的註冊碼 而這一切,都可以通過偵錯程式來完成。從某種意義上來說,如果你能自己一個人把你家的微波爐修好,那你就絕對會用偵錯程式 第七章-尋找軟體的註冊碼 我們在偵錯程式中,只要一步一步執行到關鍵Call處,然後用d eax和d edx就可以檢視兩個地址中放的兩個註冊碼,如果你發現其中的一個是你自己剛才輸入的,那麼另一條就是正確的 第七章-尋找軟體的註冊碼
而所謂的記憶體序號產生器呢?我這裡就不再多說了,它的原理就是自動在軟體註冊的時候中斷到相應的地方,並顯示相應記憶體處的值,當然它是需要配置的... 此類軟體有CRACKCODE2000和序號產生器編寫器keymake,具體用法你可以參考軟體的聯機幫助^_^
我們剩下的問題就是如何來找個這關鍵Call了,基本上來說你就用前邊給你講爆破時的那種方法就可以了,很簡單的 第七章-尋找軟體的註冊碼
但是就像你家後門的玻璃可能永遠擦不乾淨一樣,我們家後門的玻璃也從來沒擦乾淨過 第七章-尋找軟體的註冊碼 導演:NG!重說,就像所有事情都有例外一樣,有些軟體的關鍵Call會比較難找一點,但如果你掌握了適當的方法,同樣也會很好找的...
我們就來玩玩吧:
首先,我們還來用CHINAZIP這個軟體上上手^_^
它已經是我們的老朋友了,所以就不用再介紹它了吧 第七章-尋找軟體的註冊碼
好的,我們先裝上它(嘿嘿,偶就是喜歡說廢話,你打偶偶也要說^_^)接著我們點幫助-註冊,輸入Name:Suunb[CCG],Code:19870219
然後請出我們的老夥計TRW2000,下bpx hmemcpy 按F5點確定被攔:    
KERNEL?HMEMCPY  
0147:9e62  push     bp
0147:9e63  mov      bp,sp
0147:9e65  push     ds
0147:9e66  push     edi
0147:9e68  push     esi
0147:9e6a  cld    
0147:9e6b  mov      ecx,[bp+06]
0147:9e6f  jcxz     9ee9
    ...省略N多程式碼...
輸入bc *,刪除斷點。pmodule ,直接跳到程式領空:
0167:00436d13  mov      [ebx+0c],eax
0167:00436d16  mov      eax,[ebx]
0167:00436d18  cmp      eax,byte +0c
0167:00436d1b  jnz      00436d38
0167:00436d1d  mov      edx,[ebx+08]
0167:00436d20  push     edx
0167:00436d21  mov      ecx,[ebx+04]
0167:00436d24  mov      edx,eax
0167:00436d26  mov      eax,esi
0167:00436d28  call     00432b24
...省略N多程式碼...
按8下F12就會提示出錯,我們第二次就按7次 第七章-尋找軟體的註冊碼 接著我們再來按F10,按16下就會報錯,好的,我們再來:這一次我們按F10的時候,就按我前邊說過的方法,到與上次按的次數相差五六次的時候就慢下來。好的,我們按十來下的時候就慢下來仔細瞅瞅,呵呵,一下子就看到004f4dec處的那個跳轉以及它上面的關鍵CALL了 第七章-尋找軟體的註冊碼 我們按F10單步執行到004f4de7處(即關鍵CALL處)後下指令d edx就可看到真正的註冊碼,而d eax則可以看到我剛才輸入的19870219 第七章-尋找軟體的註冊碼 程式碼給你:
0167:004f4dc4  mov      eax,[ebp-08]      <---7下F12,1下F10就來到這裡(此時ebp-08處放的是剛才輸入的註冊碼19870219)
0167:004f4dc7  push     eax               <---將EAX壓棧;
0167:004f4dc8  lea      edx,[ebp-10]
0167:004f4dcb  mov      eax,[ebx+02e0]
0167:004f4dd1  call     00432f24          <---該CALL用來得到使用者輸入的使用者名稱,其實就是某個API函式,嘿嘿,好奇的話可以追進去看看 第七章-尋找軟體的註冊碼
0167:004f4dd6  mov      edx,[ebp-10]      <---將得到的使用者名稱放入EDX;
0167:004f4dd9  lea      ecx,[ebp-0c]
0167:004f4ddc  mov      eax,ebx
0167:004f4dde  call     004f4fac          <---該CALL用來計算出真正的註冊碼;
0167:004f4de3  mov      edx,[ebp-0c]      <---將計算出的真.註冊碼放入EDX,在下條指令時可用D EDX檢視;
0167:004f4de6  pop      eax               <---先前壓入的註冊碼出棧;
0167:004f4de7  call     0040411c          <---該CALL用來比較兩個註冊碼,罪魁禍首啊!;
0167:004f4dec  jnz      004f4e64          <---不相等則跳,跳必死,暴破將75改為74或EB,當然90也行;        
0167:004f4dee  mov      dl,01
0167:004f4df0  mov      eax,[00452558]
0167:004f4df5  call     00452658
0167:004f4dfa  mov      [ebp-04],eax
0167:004f4dfd  xor      eax,eax
0167:004f4dff  push     ebp
0167:004f4e00  push     dword 004f4e5d
0167:004f4e05  push     dword [fs:eax]
0167:004f4e08  mov      [fs:eax],esp
0167:004f4e0b  mov      cl,01
0167:004f4e0d  mov      edx,004f4ea8
0167:004f4e12  mov      eax,[ebp-04]
0167:004f4e15  call     0045283c
0167:004f4e1a  mov      ecx,004f4ecc
0167:004f4e1f  mov      edx,004f4ef4
0167:004f4e24  mov      eax,[ebp-04]
0167:004f4e27  call     00452c80
0167:004f4e2c  mov      eax,004f4f00
0167:004f4e31  call     00458b8c
0167:004f4e36  mov      eax,[0050306c]
0167:004f4e3b  mov      eax,[eax]
0167:004f4e3d  mov      edx,004f4f24
0167:004f4e42  call     00432f54
0167:004f4e47  xor      eax,eax
0167:004f4e49  pop      edx
0167:004f4e4a  pop      ecx
0167:004f4e4b  pop      ecx
0167:004f4e4c  mov      [fs:eax],edx
0167:004f4e4f  push     dword 004f4e6e
0167:004f4e54  mov      eax,[ebp-04]
0167:004f4e57  call     004030c4
0167:004f4e5c  ret    
0167:004f4e5d  jmp      00403824
0167:004f4e62  jmp      short 004f4e54
0167:004f4e64  mov      eax,004f4f48      <---由上面的0167:004f4dec處跳來,掛!;
0167:004f4e69  call     00458b8c
0167:004f4e6e  xor      eax,eax
整理:
 Name:Suunb[CCG]
 Code:SCCG5296
可以真接在TRW2000中下斷點bpx 004f4de6,中斷後用D EDX來檢視真.註冊碼。
另附:CRACKCODE2000的CRACKCODE.INI
[Options]
CommandLine=CHINAZIP.exe
Mode=2                            
First_Break_Address=4f4de7        
First_Break_Address_Code=E8      
First_Break_Address_Code_Lenth=5  
Second_Break_Address=404123      
Second_Break_Address_Code_Lenth=2
Save_Code_Address=EDX
呵呵,是不是很簡單?我說過了嘛,其實並不難的 第七章-尋找軟體的註冊碼
我不知道你有沒有發現,其實上面的軟體的關鍵CALL還是很好找的,相信你用W32Dasm就中以找出來,那為什麼不用呢?對於那些比較簡單的軟體,何必非請出偵錯程式呢?
給你貼個用W32Dasm找關鍵CALL的:
【軟體名稱】e族百變桌面
【軟體版本】4.0
【檔案大小】1316KB
【適用平臺】Win9x/Me/NT/2000
【軟體簡介】提供25種變換桌面的方式,讓你的桌面煥然一新。操作簡單,無需費力學習。支援多種Internet流行圖片格式。將桌布檔案打包,方便儲存、轉發。將桌布包展開,還原圖片檔案。
嘿嘿,我也懶的去折騰我的小貓了,我們們就還用電腦報2001年合訂本配套光碟上的軟體吧 第七章-尋找軟體的註冊碼 (2002年的偶沒有買)
首先裝上它(嘿嘿,你習慣了?為什麼不丟東西了? ^_^)執行一下該軟體先,該軟體自動生成了相應的機器碼,並停留在註冊項上,輸入註冊碼19870219,點確定,掛!
用fi檢查,該軟體為Delphi編譯,沒加殼。
用W32DASM開啟該執行檔案,參考-串式參考,在最下邊,見到了剛才彈出的"註冊碼不正確,請聯絡作者"。
用滑鼠雙擊,發現只有一處呼叫,在00488E97處,接著在串式參考對話方塊中在"註冊碼不正確,請聯絡作者"處向上找,找到"感謝您支援國產軟體,祝您好運"(說的我都不好意思了)   第七章-尋找軟體的註冊碼
用滑鼠雙擊,仍舊只有一處呼叫,在00488DF7處:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00488DCD(U)
|
:00488DD9 8B45FC                  mov eax, dword ptr [ebp-04]
:00488DDC 8B8020040000            mov eax, dword ptr [eax+00000420]
:00488DE2 35280BB61E              xor eax, 1EB60B28
:00488DE7 3B45F8                  cmp eax, dword ptr [ebp-08]  <---關鍵比較,? EAX來檢視軟體正確的註冊碼;
:00488DEA 0F85A0000000            jne 00488E90                 <---關鍵跳轉,不相等就跳,跳必掛!
:00488DF0 6A40                    push 00000040

* Possible StringData Ref from Code Obj ->"註冊成功"
                         |
:00488DF2 68D48E4800              push 00488ED4

* Possible StringData Ref from Code Obj ->"感謝您支援國產軟體,祝您好運!"
                         |
:00488DF7 68E08E4800              push 00488EE0                <---雙擊串式參考便跳到此行,我們向上找第一個跳轉處就是關鍵跳轉,關鍵跳轉上面就是關鍵比較;
:00488DFC 8B45FC                  mov eax, dword ptr [ebp-04]
:00488DFF E81CD2FBFF              call 00446020
:00488E04 50                      push eax
...省略程式碼若干...
向上看,00488DEA處有一跳轉,不相等便跳到00488E90處,跳必掛!還記的00488E97處的出錯對話方塊吧! 罪魁禍首啊!
在向上一行,看00488DE7處:cmp eax, dword ptr [ebp-08],此為關鍵比較。可用? EAX檢視軟體正確的註冊碼。
整理:
開啟該軟體,在註冊碼處輸入19870219,開啟TRW2000,下斷點bpx 00488DE7,點註冊被攔。輸入? EAX得到軟體正確的註冊碼。
機器碼:533226313
註冊碼:25061473
用序號產生器編寫器keymake編寫該軟體的序號產生器:
點其它-另類序號產生器(F8),軟體名稱輸入ePaper.exe,註冊碼選暫存器方式 EAX 十進位制。
新增斷點,中斷地址:00488DE7,中斷次數:1,第一位元組:3B,指令長度:3。
生成序號產生器後完工,萬事OK!
嘿嘿,現在是不是覺的找軟體的註冊碼越來越像小時候玩的躲貓貓了? 第七章-尋找軟體的註冊碼 可惜偶小時候沒有青梅竹馬那種型別的夥伴...
好的,我們這次講個有點兒名氣的軟體,WinZIP8.1,這個軟體相信大家都用過吧,反正偶是喜歡用RAR,不過也多少用過幾天這玩意兒...
如果你沒聽說過,那看介紹好了 第七章-尋找軟體的註冊碼
【軟體名稱】WinZIP
【軟體版本】8.1 Beta 2
【檔案大小】1757KB
【適用平臺】Win9x/Me/NT/2000
【軟體簡介】一個強大並且易用的壓縮實用程式,支援ZIP、CAB、TAR、GZIP、MIME,以及更多格式的壓縮檔案。其特點是緊密地與Windows資源管理器拖放整合,不用離開資源管理器而進行壓縮、解壓縮。
不用我說了吧,出處仍舊是電腦報2001年合訂本的配套光碟 第七章-尋找軟體的註冊碼
我之所以先擇它,是因為覺得它的關鍵CALL沒有前邊那兩個那樣好找(其實也就那樣了^_^)極具代表性,而且通過它可以讓你感受一下Ollydbg這個魅力比你家的荼幾還大的偵錯程式 第七章-尋找軟體的註冊碼
這裡之所以提到Ollydbg,是覺的它真是一個非常非常棒的偵錯程式...強烈建議你多玩幾次...(MP3好聽嗎? ^_^)
我們來吧,首先當然還是要裝上它(左閃術,右閃術),然後用Ollydbg來載入,此時介面會被分成四個部分,左上方是軟體反彙編後的程式碼,右上方是暫存器開會的地方,左下方是記憶體區,右下方顯示的則是堆疊的資訊。
我們來下斷點,按Alt+F4,之後選USER32,然後再滑鼠右鍵-->搜尋-->當前模組中的名稱,然後在那一大堆函式中找到GetDlgItemTextA,按F2來下斷點,它會提示你錯誤,並說無法設定中斷點,是不是很過癮?(嗚嗚嗚...大哥,我錯了,再也不敢了...)
呵呵,這個我也不知道什麼原因,明明是用了這個函式嘛,就是不讓斷,其實我對Ollydbg也不是太那個(關鍵是討厭它的下斷方式)看來還是用我們的萬能斷點吧,輸入註冊名Suunb[CCG],輸入註冊碼19870219,然後用TRW2000下斷bpx hmemcpy,斷到之後,pmodule返回領空後一次F12就會出錯,看來所有的東東就在這裡了...
我們用TRW2000再斷一下,返回領空之後記著第一條指令的地址0040bd5f,嗚嗚嗚...上條指令明明是呼叫GetDlgItemTextA,為什麼在Ollydbg中不讓下呢?
沒關係,我們記下這個地址後仍舊用Ollydbg來載入程式,之後在反彙編視窗中找到0040bd5f處,然後按下F2來下斷(會變為紅色),下斷之後便按F9來執行程式,接著輸入註冊名Suunb[CCG],註冊碼19870219後按確定,程式會被Ollydbg給斷到:
0040BD5F  |. 57             PUSH EDI
0040BD60  |. E8 F34A0500    CALL WINZIP32.00460858
0040BD65  |. 57             PUSH EDI                                 ; /Arg1
0040BD66  |. E8 164B0500    CALL WINZIP32.00460881                   ; \WINZIP32.00460881
0040BD6B  |. 59             POP ECX
0040BD6C  |. BE 1CCA4C00    MOV ESI,WINZIP32.004CCA1C
0040BD71  |. 59             POP ECX
0040BD72  |. 6A 0B          PUSH 0B                                  ; /Count = B (11.)
0040BD74  |. 56             PUSH ESI                                 ; |Buffer => WINZIP32.004CCA1C
0040BD75  |. 68 810C0000    PUSH 0C81                                ; |ControlID = C81 (3201.)
0040BD7A  |. 53             PUSH EBX                                 ; |hWnd
0040BD7B  |. FF15 F4C54A00  CALL DWORD PTR DS:[<&USER32.GetDlgItemTe>; \GetDlgItemTextA
0040BD81  |. 56             PUSH ESI
0040BD82  |. E8 D14A0500    CALL WINZIP32.00460858
0040BD87  |. 56             PUSH ESI
0040BD88  |. E8 F44A0500    CALL WINZIP32.00460881
0040BD8D  |. 803D F0C94C00 >CMP BYTE PTR DS:[4CC9F0],0
0040BD94  |. 59             POP ECX
0040BD95  |. 59             POP ECX
0040BD96  |. 74 5F          JE SHORT WINZIP32.0040BDF7
0040BD98  |. 803D 1CCA4C00 >CMP BYTE PTR DS:[4CCA1C],0
0040BD9F  |. 74 56          JE SHORT WINZIP32.0040BDF7
0040BDA1  |. E8 31F9FFFF    CALL WINZIP32.0040B6D7                   <--關鍵CALL,等會兒進去玩玩
0040BDA6  |. 84C0           TEST AL,AL                               <--根據關鍵CALL中比較的結果來做相應的測試
0040BDA8  |. 74 4D          JE SHORT WINZIP32.0040BDF7               <--跳走就沒戲!
0040BDAA  |. 57             PUSH EDI
0040BDAB  |. 68 08DE4B00    PUSH WINZIP32.004BDE08                   ;  ASCII "Name"
0040BDB0  |. FF35 1CC74A00  PUSH DWORD PTR DS:[4AC71C]               ;  WINZIP32.004BDDEC
0040BDB6  |. E8 8AFA0400    CALL WINZIP32.0045B845
0040BDBB  |. 56             PUSH ESI
0040BDBC  |. 68 C8EB4B00    PUSH WINZIP32.004BEBC8                   ;  ASCII "SN"
0040BDC1  |. FF35 1CC74A00  PUSH DWORD PTR DS:[4AC71C]               ;  WINZIP32.004BDDEC
0040BDC7  |. E8 79FA0400    CALL WINZIP32.0045B845
0040BDCC  |. FF35 18C74A00  PUSH DWORD PTR DS:[4AC718]               ; |Arg4 = 004BDDF4 ASCII "winzip32.ini"
0040BDD2  |. 6A 00          PUSH 0                                   ; |Arg3 = 00000000
0040BDD4  |. 6A 00          PUSH 0                                   ; |Arg2 = 00000000
0040BDD6  |. 68 14DE4B00    PUSH WINZIP32.004BDE14                   ; |Arg1 = 004BDE14 ASCII "rrs"
0040BDDB  |. E8 4CFA0400    CALL WINZIP32.0045B82C                   ; \WINZIP32.0045B82C
0040BDE0  |. A1 A8914C00    MOV EAX,DWORD PTR DS:[4C91A8]
0040BDE5  |. 83C4 28        ADD ESP,28
0040BDE8  |. 85C0           TEST EAX,EAX
0040BDEA  |. 74 07          JE SHORT WINZIP32.0040BDF3
0040BDEC  |. 50             PUSH EAX                                 ; /hObject => 000013F4 (font)
0040BDED  |. FF15 80C04A00  CALL DWORD PTR DS:[<&GDI32.DeleteObject>>; \DeleteObject
0040BDF3  |> 6A 01          PUSH 1
0040BDF5  |. EB 30          JMP SHORT WINZIP32.0040BE27
0040BDF7  |> E8 C3020000    CALL WINZIP32.0040C0BF
0040BDFC  |. 68 8E020000    PUSH 28E
0040BE01  |. E8 61470500    CALL WINZIP32.00460567
0040BE06  |. 50             PUSH EAX                                 ; |Arg3
0040BE07  |. 53             PUSH EBX                                 ; |Arg2
0040BE08  |. 6A 3D          PUSH 3D                                  ; |Arg1 = 0000003D
0040BE0A  |. E8 C8050400    CALL WINZIP32.0044C3D7                   ; \WINZIP32.0044C3D7

我們用Ollydbg斷到之後,可以像在TRW2000中一樣通過F8(這個偵錯程式跟我一樣,也不喜歡F4^_^)來單步執行程式,我們按32下F8後程式就會出錯,那我們在第二遍載入時按F8按到20多下時就仔細看看有沒有可疑的地方,你一眼就可以看到0040BDA1處的這個關鍵CALL,我們只要追到這裡時追進去就有可能看到軟體正確的註冊碼 第七章-尋找軟體的註冊碼
那還等什麼呢?我們就進去吧...
按F7跟進後你會看的眼花眼花繚亂,到處都是PUSH跟POP,到底哪個才是呢?現在知道我為什麼讓你用Ollydbg了吧(偶起初也是要用TRW2000的,但臨時改變主意 ^_^)用Ollydbg的一個最大好處就是可以真接看到暫存器中的值,特別是你通過F8來單步執行的時候,在反彙編程式碼的下邊,會有一個小窗體,在那裡可以顯示相關指令中所使用的暫存器的值,爽吧!
我們按76下F8之後,在0040B803處就可以第一次看到正確的註冊碼了,呵呵,我這邊兒是71C20EDC,然後你還會再陸續看到幾次,爽?
另外我還發現一個有趣的事情,在WinZIP8.1中,一個註冊名可以有兩個註冊碼,呵呵,不知道是不是還有為特別使用者準備的特別註冊碼以用來和普通的做區別 第七章-尋找軟體的註冊碼 當程式通過比較,發現你輸入的註冊碼不正確後竟然會再次算出另一個註冊碼來再比較一次,嘿嘿,我的第二個註冊碼是25170288
追入關鍵CALL裡的程式碼:
0040B6D7  /$ 55             PUSH EBP
0040B6D8  |. 8BEC           MOV EBP,ESP
0040B6DA  |. 81EC 0C020000  SUB ESP,20C
0040B6E0  |. 8065 FF 00     AND BYTE PTR SS:[EBP-1],0
0040B6E4  |. 803D F0C94C00 >CMP BYTE PTR DS:[4CC9F0],0
0040B6EB  |. 53             PUSH EBX
0040B6EC  |. 56             PUSH ESI
0040B6ED  |. 57             PUSH EDI
0040B6EE  |. 0F84 FB000000  JE WINZIP32.0040B7EF
0040B6F4  |. 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]
0040B6F7  |. 50             PUSH EAX
0040B6F8  |. 68 C0E84B00    PUSH WINZIP32.004BE8C0
0040B6FD  |. E8 DE61FFFF    CALL WINZIP32.004018E0
0040B702  |. 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]
0040B705  |. 50             PUSH EAX
0040B706  |. E8 F57C0800    CALL WINZIP32.00493400
0040B70B  |. 83C4 0C        ADD ESP,0C
0040B70E  |. 83F8 14        CMP EAX,14
0040B711  |. 72 11          JB SHORT WINZIP32.0040B724
0040B713  |. BF 20C74A00    MOV EDI,WINZIP32.004AC720                ;  ASCII "auth.c"
0040B718  |. 6A 21          PUSH 21
0040B71A  |. 57             PUSH EDI
0040B71B  |. E8 86F60000    CALL WINZIP32.0041ADA6
0040B720  |. 59             POP ECX
0040B721  |. 59             POP ECX
0040B722  |. EB 05          JMP SHORT WINZIP32.0040B729
0040B724  |> BF 20C74A00    MOV EDI,WINZIP32.004AC720                ;  ASCII "auth.c"
0040B729  |> 8D85 F4FDFFFF  LEA EAX,DWORD PTR SS:[EBP-20C]
0040B72F  |. BB F0C94C00    MOV EBX,WINZIP32.004CC9F0                ;  ASCII "Suunb[CCG]"
0040B734  |. 50             PUSH EAX
0040B735  |. 53             PUSH EBX
0040B736  |. E8 50030000    CALL WINZIP32.0040BA8B
0040B73B  |. 8D85 F4FDFFFF  LEA EAX,DWORD PTR SS:[EBP-20C]
0040B741  |. 50             PUSH EAX
0040B742  |. E8 B97C0800    CALL WINZIP32.00493400
0040B747  |. BE C8000000    MOV ESI,0C8
0040B74C  |. 83C4 0C        ADD ESP,0C
0040B74F  |. 3BC6           CMP EAX,ESI
0040B751  |. 72 0A          JB SHORT WINZIP32.0040B75D
0040B753  |. 6A 23          PUSH 23
0040B755  |. 57             PUSH EDI
0040B756  |. E8 4BF60000    CALL WINZIP32.0041ADA6
0040B75B  |. 59             POP ECX
0040B75C  |. 59             POP ECX
0040B75D  |> 8D85 F4FDFFFF  LEA EAX,DWORD PTR SS:[EBP-20C]
0040B763  |. 50             PUSH EAX
0040B764  |. 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]
0040B767  |. 50             PUSH EAX
0040B768  |. E8 03300900    CALL WINZIP32.0049E770
0040B76D  |. 59             POP ECX
0040B76E  |. 85C0           TEST EAX,EAX
0040B770  |. 59             POP ECX
0040B771  |. 75 04          JNZ SHORT WINZIP32.0040B777
0040B773  |. C645 FF 01     MOV BYTE PTR SS:[EBP-1],1
0040B777  |> 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]
0040B77A  |. 50             PUSH EAX
0040B77B  |. 68 D0E84B00    PUSH WINZIP32.004BE8D0
0040B780  |. E8 5B61FFFF    CALL WINZIP32.004018E0
0040B785  |. 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]
0040B788  |. 50             PUSH EAX
0040B789  |. E8 727C0800    CALL WINZIP32.00493400
0040B78E  |. 83C4 0C        ADD ESP,0C
0040B791  |. 83F8 14        CMP EAX,14
0040B794  |. 72 0A          JB SHORT WINZIP32.0040B7A0
0040B796  |. 6A 27          PUSH 27
0040B798  |. 57             PUSH EDI
0040B799  |. E8 08F60000    CALL WINZIP32.0041ADA6
0040B79E  |. 59             POP ECX
0040B79F  |. 59             POP ECX
0040B7A0  |> 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]
0040B7A3  |. 50             PUSH EAX
0040B7A4  |. 53             PUSH EBX
0040B7A5  |. E8 C62F0900    CALL WINZIP32.0049E770
0040B7AA  |. 59             POP ECX
0040B7AB  |. 85C0           TEST EAX,EAX
0040B7AD  |. 59             POP ECX
0040B7AE  |. 75 0E          JNZ SHORT WINZIP32.0040B7BE
0040B7B0  |. FF15 F0C14A00  CALL DWORD PTR DS:[<&KERNEL32.GetTickCou>; [GetTickCount
0040B7B6  |. A8 01          TEST AL,1
0040B7B8  |. 74 04          JE SHORT WINZIP32.0040B7BE
0040B7BA  |. C645 FF 01     MOV BYTE PTR SS:[EBP-1],1
0040B7BE  |> 6A 14          PUSH 14
0040B7C0  |. 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18]
0040B7C3  |. 6A 00          PUSH 0
0040B7C5  |. 50             PUSH EAX
0040B7C6  |. E8 75820800    CALL WINZIP32.00493A40
0040B7CB  |. 56             PUSH ESI
0040B7CC  |. 8D85 F4FDFFFF  LEA EAX,DWORD PTR SS:[EBP-20C]
0040B7D2  |. 6A 00          PUSH 0
0040B7D4  |. 50             PUSH EAX
0040B7D5  |. E8 66820800    CALL WINZIP32.00493A40
0040B7DA  |. 83C4 18        ADD ESP,18
0040B7DD  |. 807D FF 00     CMP BYTE PTR SS:[EBP-1],0
0040B7E1  |. 74 13          JE SHORT WINZIP32.0040B7F6
0040B7E3  |. E8 D7080000    CALL WINZIP32.0040C0BF
0040B7E8  |. 8025 EDBF4C00 >AND BYTE PTR DS:[4CBFED],0
0040B7EF  |> 32C0           XOR AL,AL
0040B7F1  |. E9 F5000000    JMP WINZIP32.0040B8EB
0040B7F6  |> 8D85 BCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-144]
0040B7FC  |. 50             PUSH EAX
0040B7FD  |. 53             PUSH EBX
0040B7FE  |. E8 ED000000    CALL WINZIP32.0040B8F0                    <--參與計算軟正確的註冊碼
0040B803  |. 8D85 BCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-144]            <--在這裡第一次發現軟體正確的註冊碼
0040B809  |. 50             PUSH EAX                                
0040B80A  |. E8 F17B0800    CALL WINZIP32.00493400
0040B80F  |. BE 2C010000    MOV ESI,12C
0040B814  |. 83C4 0C        ADD ESP,0C
0040B817  |. 3BC6           CMP EAX,ESI
0040B819  |. 72 0A          JB SHORT WINZIP32.0040B825
0040B81B  |. 6A 39          PUSH 39
0040B81D  |. 57             PUSH EDI
0040B81E  |. E8 83F50000    CALL WINZIP32.0041ADA6
0040B823  |. 59             POP ECX
0040B824  |. 59             POP ECX
0040B825  |> BF 1CCA4C00    MOV EDI,WINZIP32.004CCA1C                ;  ASCII "19870219"             <--將剛才輸入的錯誤的註冊碼放入EDI
0040B82A  |. 8D85 BCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-144]           <--EAX中裝入正確的註冊碼所在的地址
0040B830  |. 57             PUSH EDI                                 <--使用者輸入的註冊碼入棧
0040B831  |. 50             PUSH EAX                                 <--軟體計算出的正確的註冊碼入棧
0040B832  |. E8 392F0900    CALL WINZIP32.0049E770                   <--關鍵CALL,用於比較使用者輸入的註冊碼
0040B837  |. F7D8           NEG EAX
0040B839  |. 1AC0           SBB AL,AL
0040B83B  |. 59             POP ECX
0040B83C  |. FEC0           INC AL
0040B83E  |. 59             POP ECX
0040B83F  |. A2 EDBF4C00    MOV BYTE PTR DS:[4CBFED],AL
0040B844  |. 0F85 8A000000  JNZ WINZIP32.0040B8D4
0040B84A  |. 8D85 BCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-144]
0040B850  |. 50             PUSH EAX
0040B851  |. 53             PUSH EBX
0040B852  |. E8 33010000    CALL WINZIP32.0040B98A                   <--參與計算軟體的第二個註冊碼
0040B857  |. 8D85 BCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-144]           <--此時軟體會再算出另外一個註冊碼
0040B85D  |. 50             PUSH EAX                                
0040B85E  |. E8 9D7B0800    CALL WINZIP32.00493400
0040B863  |. 83C4 0C        ADD ESP,0C
0040B866  |. 3BC6           CMP EAX,ESI
0040B868  |. 72 0E          JB SHORT WINZIP32.0040B878
0040B86A  |. 6A 3E          PUSH 3E
0040B86C  |. 68 20C74A00    PUSH WINZIP32.004AC720                   ;  ASCII "auth.c"
0040B871  |. E8 30F50000    CALL WINZIP32.0041ADA6
0040B876  |. 59             POP ECX
0040B877  |. 59             POP ECX
0040B878  |> 8D85 BCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-144]           <--軟體計算出的第二個註冊碼裝入EAX中
0040B87E  |. 57             PUSH EDI                                 <--使用者輸入的註冊碼入棧
0040B87F  |. 50             PUSH EAX                                 <--軟體計算出的第二個註冊碼入棧
0040B880  |. E8 EB2E0900    CALL WINZIP32.0049E770                   <--另一個關鍵CALL,用於比較第二次生成的註冊碼
0040B885  |. F7D8           NEG EAX
0040B887  |. 1AC0           SBB AL,AL
0040B889  |. 59             POP ECX
0040B88A  |. FEC0           INC AL
0040B88C  |. 59             POP ECX
0040B88D  |. A2 EDBF4C00    MOV BYTE PTR DS:[4CBFED],AL
0040B892  |. 75 40          JNZ SHORT WINZIP32.0040B8D4
0040B894  |. 8D85 C0FEFFFF  LEA EAX,DWORD PTR SS:[EBP-140]
0040B89A  |. 6A 04          PUSH 4
0040B89C  |. 50             PUSH EAX
0040B89D  |. 57             PUSH EDI
0040B89E  |. E8 DD690900    CALL WINZIP32.004A2280
0040B8A3  |. 83C4 0C        ADD ESP,0C
0040B8A6  |. 85C0           TEST EAX,EAX
0040B8A8  |. 75 23          JNZ SHORT WINZIP32.0040B8CD
0040B8AA  |. 8D85 BCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-144]
0040B8B0  |. 6A 04          PUSH 4
0040B8B2  |. 50             PUSH EAX
0040B8B3  |. 68 20CA4C00    PUSH WINZIP32.004CCA20                   ;  ASCII "0219"
0040B8B8  |. E8 C3690900    CALL WINZIP32.004A2280
0040B8BD  |. 83C4 0C        ADD ESP,0C
0040B8C0  |. 85C0           TEST EAX,EAX
0040B8C2  |. 75 09          JNZ SHORT WINZIP32.0040B8CD
0040B8C4  |. C605 EDBF4C00 >MOV BYTE PTR DS:[4CBFED],1
0040B8CB  |. EB 07          JMP SHORT WINZIP32.0040B8D4
0040B8CD  |> 8025 EDBF4C00 >AND BYTE PTR DS:[4CBFED],0
0040B8D4  |> 56             PUSH ESI
0040B8D5  |. 8D85 BCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-144]
0040B8DB  |. 6A 00          PUSH 0
0040B8DD  |. 50             PUSH EAX
0040B8DE  |. E8 5D810800    CALL WINZIP32.00493A40
0040B8E3  |. A0 EDBF4C00    MOV AL,BYTE PTR DS:[4CBFED]
0040B8E8  |. 83C4 0C        ADD ESP,0C
0040B8EB  |> 5F             POP EDI
0040B8EC  |. 5E             POP ESI
0040B8ED  |. 5B             POP EBX
0040B8EE  |. C9             LEAVE
0040B8EF  \. C3             RETN

整理一下:
註冊名:Suunb[CCG]
註冊碼:71C20EDC or 25170288
其實如果你坐在那裡肯花上一杯茶的功夫來仔細想一下,就會知道,其實一點兒也不難,只是有一點點麻煩而以 第七章-尋找軟體的註冊碼
這一章也就到這裡吧,我現在巨困無比...
最後說一下的是,現在有仍有N多的軟體用的是明碼的比較方法,所以,要想找一兩個軟體練練手還是挺容易的 第七章-尋找軟體的註冊碼
這一章本來還打算講一下那些非明碼比較的軟體的,但忽然發現,如果通過非明碼比較的軟體能找到註冊碼的話,那應該也就把它的演算法給搞的差不多了,所以,到下一章,分析軟體的註冊演算法時再講吧...
<本章完>

相關文章