我們來尋找軟件真正的注冊碼!
尋找軟件的注冊碼就像你小時玩的躲貓貓一樣,簡單又有趣,雖然后來你會不這樣覺的
好的,我們開始。
我不知道你有沒有明白我前面在原理中講的那些東西,如果沒明白,我就再說一遍
軟件通過你輸入的用戶名或者機器碼什么的生成一個正確的注冊碼來與你輸入的注冊碼進行比較,如果兩個相同,也就是說你輸入的注冊碼是正確的話,那軟件就會完成注冊。如果你輸入的不正確,嘿嘿,當然就不會注冊成功。
好的,現在你已經知道軟件會有一個比較兩個注冊碼的過程,這就是關鍵所在。一般如果你遇到的是那種明碼比較的軟件,這會是一件非常另人愉快的事情的
軟件會先計算出正確的注冊碼然后再與你輸入的那個進行比較,也就是說正確的注冊碼會被軟件自己算出來!嘿嘿,搜身你會嗎?雖然法律以及道德不允許我們去搜身,但…
我 接著說,雖然現在的軟件已經比以前要厲害上許多,但,那種用明碼比較的,還是大有人在的。所謂明碼比較,就是說軟件先算出正確的注冊碼,然后放到內存或你 家的沙發(fā)下面,之后再得到你輸入的那個注冊碼,接著就比較了。呵呵,好理解吧,我們只要找到那個比較的地方,看一下軟件把注冊碼放到內存的哪里了,再到相 應的內存處瞧一瞧,就萬事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處來查看相應的內存地址就可以找到正確的注冊碼了 而這一切,都可以通過調試器來完成。從某種意義上來說,如果你能自己一個人把你家的微波爐修好,那你就絕對會用調試器 我們在調試器中,只要一步一步執(zhí)行到關鍵Call處,然后用d eax和d edx就可以查看兩個地址中放的兩個注冊碼,如果你發(fā)現其中的一個是你自己剛才輸入的,那么另一條就是正確的
而所謂的內存注冊機呢?我這里就不再多說了,它的原理就是自動在軟件注冊的時候中斷到相應的地方,并顯示相應內存處的值,當然它是需要配置的... 此類軟件有CRACKCODE2000和注冊機編寫器keymake,具體用法你可以參考軟件的聯(lián)機幫助^_^
我們剩下的問題就是如何來找個這關鍵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單步執(zhí)行到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
呵呵,是不是很簡單?我說過了嘛,其實并不難的
我不知道你有沒有發(fā)現,其實上面的軟件的關鍵CALL還是很好找的,相信你用W32Dasm就中以找出來,那為什么不用呢?對于那些比較簡單的軟件,何必非請出調試器呢?
給你貼個用W32Dasm找關鍵CALL的:
【軟件名稱】e族百變桌面
【軟件版本】4.0
【文件大小】1316KB
【適用平臺】Win9x/Me/NT/2000
【軟件簡介】提供25種變換桌面的方式,讓你的桌面煥然一新。操作簡單,無需費力學習。支持多種Internet流行圖片格式。將壁紙文件打包,方便存儲、轉發(fā)。將壁紙包展開,還原圖片文件。
嘿嘿,我也懶的去折騰我的小貓了,咱們就還用電腦報2001年合訂本配套光盤上的軟件吧 (2002年的偶沒有買)
首先裝上它(嘿嘿,你習慣了?為什么不丟東西了? ^_^)運行一下該軟件先,該軟件自動生成了相應的機器碼,并停留在注冊項上,輸入注冊碼19870219,點確定,掛!
用fi檢查,該軟件為Delphi編譯,沒加殼。
用W32DASM打開該執(zhí)行文件,參考-串式參考,在最下邊,見到了剛才彈出的"注冊碼不正確,請聯(lián)系作者"。
用鼠標雙擊,發(fā)現只有一處調用,在00488E97處,接著在串式參考對話框中在"注冊碼不正確,請聯(lián)系作者"處向上找,找到"感謝您支持國產軟件,祝您好運"(說的我都不好意思了)
用鼠標雙擊,仍舊只有一處調用,在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,第一字節(jié):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來載入,此時界面會被分成四個部分,左上方是軟件反匯編后的代碼,右上方是寄存器開會的地方,左下方是內存區(qū),右下方顯示的則是堆棧的信息。
我 們來下斷點,按Alt+F4,之后選USER32,然后再鼠標右鍵-->搜索-->當前模塊中的名稱,然后在那一大堆函數中找到 GetDlgItemTextA,按F2來下斷點,它會提示你錯誤,并說無法設置中斷點,是不是很過癮?(嗚嗚嗚...大哥,我錯了,再也不敢了...)
呵呵,這個我也不知道什么原因,明明是用了這個函數嘛,就是不讓斷,其實我對Ollydbg也不是太那個(關鍵是討厭它的下斷方式)看來還是用 我們的萬能斷點吧,輸入注冊名Suunb[CCG],輸入注冊碼19870219,然后用TRW2000下斷bpx hmemcpy,斷到之后,pmodule返回領空后一次F12就會出錯,看來所有的東東就在這里了...
我們用TRW2000再斷一下,返回領空之后記著第一條指令的地址0040bd5f,嗚嗚嗚...上條指令明明是調用GetDlgItemTextA,為什么在Ollydbg中不讓下呢?
沒 關系,我們記下這個地址后仍舊用Ollydbg來加載程序,之后在反匯編窗口中找到0040bd5f處,然后按下F2來下斷(會變?yōu)榧t色),下斷之后便按 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^_^)來單步執(zhí)行程序,我們按32下F8后程序 就會出錯,那我們在第二遍載入時按F8按到20多下時就仔細看看有沒有可疑的地方,你一眼就可以看到0040BDA1處的這個關鍵CALL,我們只要追到 這里時追進去就有可能看到軟件正確的注冊碼
那還等什么呢?我們就進去吧...
按F7跟進后你會看的眼花眼花繚亂,到處都是PUSH跟 POP,到底哪個才是呢?現在知道我為什么讓你用Ollydbg了吧(偶起初也是要用TRW2000的,但臨時改變主意 ^_^)用Ollydbg的一個最大好處就是可以真接看到寄存器中的值,特別是你通過F8來單步執(zhí)行的時候,在反匯編代碼的下邊,會有一個小窗體,在那里 可以顯示相關指令中所使用的寄存器的值,爽吧!
我們按76下F8之后,在0040B803處就可以第一次看到正確的注冊碼了,呵呵,我這邊兒是71C20EDC,然后你還會再陸續(xù)看到幾次,爽?
另 外我還發(fā)現一個有趣的事情,在WinZIP8.1中,一個注冊名可以有兩個注冊碼,呵呵,不知道是不是還有為特別用戶準備的特別注冊碼以用來和普通的做區(qū) 別 當程序通過比較,發(fā)現你輸入的注冊碼不正確后竟然會再次算出另一個注冊碼來再比較一次,嘿嘿,我的第二個注冊碼是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] <--在這里第一次發(fā)現軟件正確的注冊碼
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多的軟件用的是明碼的比較方法,所以,要想找一兩個軟件練練手還是挺容易的
這一章本來還打算講一下那些非明碼比較的軟件的,但忽然發(fā)現,如果通過非明碼比較的軟件能找到注冊碼的話,那應該也就把它的算法給搞的差不多了,所以,到下一章,分析軟件的注冊算法時再講吧...
<本章完>
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
