使用SoftICE破解Winzip8.0全攻略
摘要
Winzip是大家都很熟悉的壓縮解壓工具,裝機(jī)必備工具。Winzip是個(gè)免費(fèi)的共享軟件,不注冊(cè)也一樣使用,只是會(huì)出現(xiàn)一個(gè)未注冊(cè)的畫(huà)面而已。它對(duì)注冊(cè)碼的保護(hù)并不復(fù)雜,破解這個(gè)軟件也是相對(duì)簡(jiǎn)單的。
程序名 :Winzip
版本 :V8.0(3105)
大小 :1,230KB
運(yùn)行平臺(tái):Windows 95/98/NT/2000
保護(hù)方式:注冊(cè)碼
破解方式:制作注冊(cè)補(bǔ)丁?
1??????? 破解的準(zhǔn)備工作
(1)??? 安裝好SoftICE,并進(jìn)入Windows。通過(guò)CTRL+D來(lái)檢查SoftICE是否可用。
(2)??? 加載符號(hào)表,可以采用兩種方式:一是在當(dāng)前情況下,使用Symbol Loader動(dòng)態(tài)加載,另一種是修改Windows目錄下的Winice.dat文件,刪除usr32.dll前面的“exp=”。
2??????? 監(jiān)測(cè)軟件的代碼
2.1????? 設(shè)置斷點(diǎn)
(1)?? Windows通過(guò)user32.dll庫(kù)的四個(gè)API函數(shù)來(lái)獲取用戶(hù)輸入文本,它們是GetWindowText,GetWindowTextA,GetDlgItemText,GetDlgItemTextA。
(2)?? 前面已經(jīng)加載了user32.dll,可以使用exp getwindowtext來(lái)查看GetWindowText這個(gè)符號(hào)是否已經(jīng)加載,其余仿此。如果沒(méi)有加載,請(qǐng)參考1.(2)加載。
(3)?? 為(1)所列的四個(gè)函數(shù)設(shè)置斷點(diǎn),方法是bpx GetWindowText……
(4)?? 設(shè)置完四個(gè)斷點(diǎn)以后用bl命令確認(rèn)一下。
(5)?? 使用bd *命令暫時(shí)禁用所有的斷點(diǎn)
2.2????? 中斷注冊(cè)過(guò)程
(1)??? 安裝運(yùn)行Winzip,在主接口中選擇”Help”下面的” Enter Registration Code...”,輸入用戶(hù)名”FeiZhaoDong”,注冊(cè)碼”Bingo”。
(2)??? 按CTRL+D呼出SoftICE,使用be *命令啟用所有的斷點(diǎn)。
(3)??? 按F5回到WinZip注冊(cè)接口,按下”O(jiān)K”按鈕,程序很快被中斷在”GetDlgItemTextA”的位置。按F11繼續(xù),可以看到又中斷在”GetDlgItemTextA”一次。這樣我們可以猜測(cè),Winzip是使用了GetDlgItemTextA這個(gè)函數(shù)來(lái)獲取用戶(hù)名和注冊(cè)碼。
(4)??? 使用bc命令清除掉GetDlgItemTextA以外的三個(gè)斷點(diǎn)。
(5)??? 重新輸入用戶(hù)名和注冊(cè)碼(同上),準(zhǔn)備進(jìn)行正式的拆解過(guò)程。
2.3????? 分析注冊(cè)碼的驗(yàn)證過(guò)程
(1)??? 按下”O(jiān)K”按鈕,程序停留在GetDlgItemTextA的入口,按F11跳出這個(gè)函數(shù),這樣可以看到以下的匯編代碼:
?
0167:00407F6D CALL [USER32!GetDlgItemTextA]
0167:00407F73 PUSH EDI ;程序停留在這里,EDI指向”FeiZhaoDoing”
0167:00407F74 CALL 0043F89A
0167:00407F79 PUSH EDI
0167:00407F7A CALL 0043F8C3
0167:00407F7F POP ECX
0167:00407F80 MOV ESI, 0048CDA4
0167:00407F85 POP ECX
0167:00407F86 PUSH 0B
0167:00407F88 PUSH ESI
0167:00407F89 PUSH 00000C81
0167:00407F8E PUSH EBX
0167:00407F8F CALL [USER32!GetDlgItemTextA]
0167:00407F95 PUSH ESI ;ESI指向”Bingo”
?
按下F11之后程序停留在上面標(biāo)志的語(yǔ)句,用d EDI命令可以看待,EDI中地址的內(nèi)容是用戶(hù)名。按F10一步步走下來(lái),不遠(yuǎn)處是另一個(gè)GetDlgItemTextA,按F10跟進(jìn)去, 然后按F11跳出來(lái),可以用b ESI看到ESI指向注冊(cè)碼。
這樣我們已經(jīng)證明了前面的判斷是正確的,Winzip是使用了GetDlgItemTextA這個(gè)函數(shù)來(lái)獲取用戶(hù)名和注冊(cè)碼。
?
(2)??? Winzip已經(jīng)得到了它想要的用戶(hù)名和注冊(cè)碼,接下來(lái)應(yīng)該是驗(yàn)證過(guò)程了。按F10接著走,我們看到以下一段代碼:
?
0167:00407F96 CALL 0043F89A
0167:00407F9B PUSH ESI
0167:00407F9C CALL 0043F8C3
0167:00407FA1 CMP BYTE PTR [0048CD78],00 ;[0048CD78]指向“FeiZhaoDong”
0167:00407FA8 POP ECX
0167:00407FA9 POP ECX
0167:00407FAA JZ 00408005
0167:00407FAC CMP BYTE PTR [0048CDA4],00 ;[0048CDA4]指向“Bingo”
0167:00407FB3 JZ 00408005
0167:00407FB5 CALL 00407905
0167:00407FBA TEST EAX,EAX
0167:00407FC3 JZ 00408005
?
注意樣的兩部分代碼
0167:00407FA1 CMP BYTE PTR [0048CD78],00 ;[0048CD78]指向“FeiZhaoDong”
……
0167:00407FAA JZ 00408005
0167:00407FAC CMP BYTE PTR [0048CDA4],00 ;[0048CDA4]指向“Bingo”
……
0167:00407FB3 JZ 00408005
熟悉匯編語(yǔ)言的人都能很容易的看出這是在判斷字符串是否為空。Winzip在判斷出字符串為空以后跳轉(zhuǎn)到[00408005],那個(gè)地方估計(jì)就是彈出注冊(cè)失敗對(duì)話(huà)框的地方。再走下去,可以看到:
0167:00407FB5 CALL 00407905
0167:00407FBA TEST EAX,EAX
0167:00407FC3 JZ 00408005 ;注意這里的跳轉(zhuǎn)
Winzip在調(diào)用了[00407905]以后,判斷EAX是否為0,如果是則跳轉(zhuǎn)到[00408005]。
多幺熟悉的[00408005]!
跟著走下去到了[00408005],按著F10很快注冊(cè)失敗的消息框就彈出來(lái)了。這樣證明了前面的判斷,[00408005]就是彈出注冊(cè)失敗對(duì)話(huà)框的地方。
?
(3)??? 程序看到這里已經(jīng)沒(méi)有懸念了,[00407905]的調(diào)用就是判斷注冊(cè)碼是否正確的過(guò)程,如果正確,那幺返回EAX為非0值,否則返回0,注冊(cè)也就失敗了。
2.4????? 深入注冊(cè)碼計(jì)算過(guò)程
(1)??? 我們的目的是讓這個(gè)驗(yàn)證注冊(cè)碼的過(guò)程永遠(yuǎn)返回1這個(gè)代表正確的值,因此有必要進(jìn)入到[00407905]里面去看看,按F10一步步走下去,同時(shí)監(jiān)控ESI、ECX和EAX指向的內(nèi)容,務(wù)必找到最后一次更改EAX值的地方!
(2)??? 看著看著有了意外的收獲:
0167:00407AA9 PUSH ESI ? ;ESI指向輸入的注冊(cè)碼“Bingo”
0167:00407AAA PUSH EAX ?? ;EAX指向正確的注冊(cè)碼“3E41159C”
……
0167:00407AD2 PUSH ESI ;ESI指向輸入的注冊(cè)碼“Bingo”
0167:00407AD3 PUSH EAX ;EAX指向正確的注冊(cè)碼“65293585”
?
其實(shí)到這里我們已經(jīng)可以利用給出的正確注冊(cè)碼注冊(cè)成功了,不過(guò)目標(biāo)還是沒(méi)有達(dá)到。
?
(3) 按F10走了好久好久(有多久?你試試好了^_^),終于看到了下面的代碼:
0167:00407B3A? MOV EAX ,[0048FDC] ;最后一次更改EAX的值,這里是0
……
0167:00407B46? RET
接著走下去,驗(yàn)證過(guò)程就結(jié)束了,返回以后很快就彈出注冊(cè)失敗的消息框了。我們已經(jīng)找到了最后一次更改EAX值的地方,接下去就是修改匯編代碼了。
?
2.5????? 小結(jié)
通過(guò)上面的跟蹤過(guò)程,我們可以看出:
(1)??????? Winzip對(duì)驗(yàn)證過(guò)程的保護(hù)的確是很弱的,我們很容易就能找到驗(yàn)證是否成功的標(biāo)志;
(2)??????? 要注意調(diào)用API之后的第一個(gè)PUSH指令,這往往是重要的數(shù)據(jù)和標(biāo)志;
(3)??????? 要注意判空代碼,其后面的跳轉(zhuǎn)往往是很重要的標(biāo)志。
好了,下面讓我們?nèi)ブ苯有薷某绦虻亩M(jìn)制代碼吧。
3??????? 制作注冊(cè)補(bǔ)丁
3.1????? 修改內(nèi)存中的代碼
(1)??? 先修改內(nèi)存中的代碼試試,目的是讓驗(yàn)證過(guò)程永遠(yuǎn)返回1值。
(2)??? 0167:00407B3A? MOV EAX ,[0048FDC]這個(gè)代碼是關(guān)鍵,考慮到MOV這個(gè)指令有立即數(shù)賦值的功能,試著這樣改:
0167:00407B3A? MOV EAX ,1
(3)??? 讓程序停在[00407B3A],使用a命令,按上述方法修改代碼,然后按Esc退出修改模式。
(4)??? 用bd *禁用所有斷點(diǎn)。
(5)??? 按F5接著執(zhí)行程序,哈哈,注冊(cè)成功的消息框彈出來(lái)了。選擇Retry再試一次,仍然可以注冊(cè)成功。
3.2????? 制作注冊(cè)補(bǔ)丁
(1)??? 最后,直接修改exe文件來(lái)制作注冊(cè)補(bǔ)丁。重復(fù)3.1的過(guò)程,當(dāng)走到[00407B3A]的時(shí)候,不要直接修改,先看看這個(gè)指令的二進(jìn)制代碼,使用d 407B3A命令,可以看到以下內(nèi)容:
00407B3A: A1 DC 9F 48 00 83……
(2)??? 如3.1所述修改匯編代碼以后,再使用d 407B3A命令,可以看到以下內(nèi)容:
00407B3A: B8 01 00 00 00 83……
(3)??? 關(guān)閉Winzip,使用WinHEX打開(kāi)Winzip32.exe文件,直接尋找十六進(jìn)制串A1 DC 9F 48 00 83,找到以后修改為B8 01 00 00 00 83,關(guān)閉文件,OK!大功告成。儲(chǔ)存修改過(guò)的Winzip32.exe文件,這就是我們要的補(bǔ)丁。
4??????? 補(bǔ)丁效果
重新安裝Winzip,然后用補(bǔ)丁文件替換原來(lái)的Winzip32.exe文件,打開(kāi)注冊(cè)接口,輸入用戶(hù)名”FeiZhaoDong”,注冊(cè)碼”Bingo”,然后按”O(jiān)K”,注冊(cè)成功。重啟Winzip以后可以在”help”里面看到注冊(cè)信息。如附圖。
5??????? 結(jié)論
通過(guò)這次破解的過(guò)程,我熟悉了SoftICE的使用方法,作為一種優(yōu)秀的調(diào)試工具,SoftICE必然在將來(lái)的工作中有廣泛的應(yīng)用。另外,還了解了軟件注冊(cè)碼保護(hù)和破解補(bǔ)丁制作的基本原理。
中國(guó)好的的加密解秘網(wǎng)站是看雪學(xué)院,里有很多加密解秘的相關(guān)資料,部分不是免費(fèi)的,可以參閱。直接在瀏覽器中輸入”看雪學(xué)苑”即可。
參考資料:
(1)??? 拆解教程,看雪學(xué)院
(2)??? SoftICE使用手冊(cè)?
?
(圖略)
?
費(fèi)照東
總結(jié)
以上是生活随笔為你收集整理的使用SoftICE破解Winzip8.0全攻略的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CodeForces 1616H Kee
- 下一篇: U盘量产工具