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