第七章-尋找軟體的註冊碼
標 題: 第七章-尋找軟體的註冊碼
發信人:商朝子
時 間:2003/03/07 10:37pm
詳細資訊:
第七章-尋找軟體的註冊碼
我們來尋找軟體真正的註冊碼!
尋找軟體的註冊碼就像你小時玩的躲貓貓一樣,簡單又有趣,雖然後來你會不這樣覺的
好的,我們開始。
我不知道你有沒有明白我前面在原理中講的那些東西,如果沒明白,我就再說一遍
軟體透過你輸入的使用者名稱或者機器碼什麼的生成一個正確的註冊碼來與你輸入的註冊碼進行比較,如果兩個相同,也就是說你輸入的註冊碼是正確的話,那軟體就會完成註冊。如果你輸入的不正確,嘿嘿,當然就不會註冊成功。
好的,現在你已經知道軟體會有一個比較兩個註冊碼的過程,這就是關鍵所在。一般如果你遇到的是那種明碼比較的軟體,這會是一件非常另人愉快的事情的
軟體會先計算出正確的註冊碼然後再與你輸入的那個進行比較,也就是說正確的註冊碼會被軟體自己算出來!嘿嘿,搜身你會嗎?雖然法律以及道德不允許我們去搜身,但…
我接著說,雖然現在的軟體已經比以前要厲害上許多,但,那種用明碼比較的,還是大有人在的。所謂明碼比較,就是說軟體先算出正確的註冊碼,然後放到記憶體或你家的沙發下面,之後再得到你輸入的那個註冊碼,接著就比較了。呵呵,好理解吧,我們只要找到那個比較的地方,看一下軟體把註冊碼放到記憶體的哪裡了,再到相應的記憶體處瞧一瞧,就萬事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多的軟體用的是明碼的比較方法,所以,要想找一兩個軟體練練手還是挺容易的
這一章本來還打算講一下那些非明碼比較的軟體的,但忽然發現,如果透過非明碼比較的軟體能找到註冊碼的話,那應該也就把它的演算法給搞的差不多了,所以,到下一章,分析軟體的註冊演算法時再講吧...
<本章完>
相關文章
- 給自己的軟體製作註冊碼2020-11-14
- 用ollyDbg尋找VB程式的註冊核心的一點思路2003-06-20
- 尋找軟體工程老師2004-12-22軟體工程
- 找尋3DMark2001se的註冊碼,第一篇破文!2003-06-293D
- 用ollydbg找eBook Edit Pro v3.21的註冊碼2003-02-12
- 菜鳥破解之軟體自己顯示註冊碼2015-11-15
- UltraEdit32 v10找註冊碼+去暗樁2015-11-15
- 如何尋找優質的資料標註公司?2023-02-06
- C#實現無法破解的軟體註冊碼演算法2013-02-22C#演算法
- .NET Core中介軟體的註冊和管道的構建(2)---- 用UseMiddleware擴充套件方法註冊中介軟體類2016-08-08套件
- .NET Core中介軟體的註冊和管道的構建(1)---- 註冊和構建原理2016-08-04
- CRM中介軟體裡CRM local changes的註冊管理2020-02-05
- Oracle 叢集軟體資源的手工註冊(zt)2019-06-25Oracle
- XnViewMP 註冊碼啟用版:mac電腦強大的看圖軟體2023-12-13ViewMac
- 淺談用“搜尋大法”來索取記憶體註冊碼 (4千字)2001-03-23記憶體
- 共享軟體中註冊部分的簡單實現(轉)2007-08-15
- Emeditor 註冊碼2017-08-14
- WebStorm註冊碼2014-04-29WebORM
- 財智證券結算軟體2.5 破解註冊碼分析!使用ollydbg 破解註冊動畫!高手莫入! (1千字)2001-11-20動畫
- IP搜尋客 1.61 註冊碼計算 (2千字)2000-05-16
- 小弟為共享軟體作者製作的管理軟體註冊的動態連結庫 (轉)2007-12-05
- Android 尋找極限編碼的「快感」2019-02-13Android
- Qt核心剖析: 尋找 QObject 的原始碼薦2010-05-27QTObject原始碼
- 尋找Java程式碼生成器2013-03-21Java
- PhpStorm註冊碼2020-04-07PHPORM
- Navicat for MySQL註冊碼2020-04-07MySql
- SecureCRT 7 註冊碼2016-09-02Securecrt
- 利用硬體資訊實現共享軟體的安全註冊 (4千字)2001-09-12
- 跨平臺看圖軟體:XnViewMP 註冊碼中文版「相容macos14」2023-12-25ViewMac
- 一個軟體的MD5註冊演算法【原創】2004-12-29演算法
- 巨集遠簡訊群發軟體(個人版)註冊分析2015-11-15
- 註冊中心 Eureka 原始碼解析 —— 應用例項註冊發現(一)之註冊2019-03-03原始碼
- Macos端強大的資料庫軟體:DBeaverUE旗艦啟用版最新+DBeaverUE註冊碼2023-11-07Mac資料庫
- 功能強大的相片管理軟體ACDSee Photo Manager 12.0.342註冊碼序列號中文版2010-05-14
- Viscosity for Mac 註冊碼:2019-09-19Mac
- PLSQL Developer 12 註冊碼2018-06-07SQLDeveloper
- PLSQL Developer 9.0註冊碼2013-01-22SQLDeveloper
- 註冊多個賬號需要使用代理IP軟體技巧!2020-06-05