作者:星痕
e-mail:jrg1982@163.com
1. 用softice載入windows(通過CTRL+D來檢查softice是否已經準備好,按F5退出softice);
2. 運行winamp,選擇“Winamp...”下的“Shareware”,點擊“Enter Registration info”;
3. 在“Name:”中輸入:Xingheng(隨意),“Reg#:”中輸入:12345678(隨意);
4. 用CTRL+D呼出softice,下萬能斷點:bpx hmemcpy,按F5返回到winamp;
5. 在winamp中選擇“OK”,等一等?是不是發現一個問題:“OK”按鈕是無效的,不能被點擊,也就是說程序已經知道了注冊碼是錯誤的。如此看來在我們輸入注冊碼的過程中winamp已經在判斷輸入的注冊碼是否正確了,所以當我們輸完注冊碼它已經知道注冊碼是錯誤的,因此就禁止了“OK”按鈕;
6. 既然winamp是在我們輸入注冊碼的過程中同時判斷其正確性的,那么我們就不能像通常那樣先輸完注冊碼再設置斷點,而是要反過來;
7. 先用 BD * 禁止剛才設置的斷點(如果不這樣你的任何舉動都會被softice攔截下來的,不信就試一試^_^);
8. 刪掉剛才輸入的注冊碼“12345678”,接著按 CTRL+D 切換到softice,用 BE * 恢復剛才暫停的斷點 bpx hmemcpy 。因為winamp會在我們輸入任何注冊碼時判斷其正確性,那么它必定要讀取輸入的信息,這樣的話設置斷點 bpx hmemcpy 一定能監視它的一舉一動;
9. 在“Reg#:”中輸入:1 ,winamp馬上就會被softice攔截下來;
10. 用 BD * 暫停斷點,然后再按F12返回到winamp的領空--問題又來了:當你按F12還沒有返回到winamp的領空時程序已經判斷完畢,回到winamp的控制中了。為什么呢?肯定是斷點 bpx hmemcpy 設置有問題。俗話說山不轉水轉,既然 bpx hmemcpy 不行我們就干脆換另外的斷點。winamp的注冊界面是個對話框,所以我們干脆用 bpx getdlgitemtexta 試一下;
11. 重新進入winamp的注冊選項,然后按 CTRL+D 切換到softice中,下斷點 bpx getdlgitemtexta;
12. 在“Reg#:”中輸入:1,哈哈。。。winamp馬上就被softice攔截下來;
13. 用 BD * 禁止剛才設置過的斷點;
14. 按F12鍵1次返回到winamp的領空:
。。。
0167:0041E6CF CALL [USER32!GetDlgItemTextA] <-- 獲取對話框文本
0167:0041E6D5 PUSH 00 <-- 返回winamp的領空時程序停在這里
0167:0041E6D7 PUSH 00
0167:0041E6D9 PUSH 0000048C
0167:0041E6DE PUSH EBX
0167:0041E6DF CALL [USER32!GetDlgItemInt] <-- 獲取對話框文本的整數值
0167:0041E6E5 MOV ESI,EAX <-- 返回值EAX中是輸入注冊碼“1”的16進制整數值1
0167:0041E6E7 LEA EAX,[ESP+10]
0167:0041E6EB PUSH EAX <-- EAX指向輸入的名字“Xingheng”
0167:0041E6EC CALL 004261E0
0167:0041E6F1 ADD ESP,04
0167:0041E6F4 CMP EAX,ESI <-- ESI=00000001,EAX=0333F395
0167:0041E6F6 JNZ 0041E703
。。。
15. 從上面的程序看出winamp通過API函數GetDlgItemTextA取得輸入的文本信息,然后利用API函數GetDlgItemInt得到輸入注冊碼“1”的16進制整數值1并將結果返回EAX中。按F10走到0167:0041E6EB PUSH EAX時用 D EAX 可以看到EAX指向輸入的名字“Xingheng”,繼續跟蹤你會發現下面的CALL 004261E0利用“Xingheng”計算得到16進制值0333F395并和我們輸入注冊碼“1”的16進制值相比較,用 ?0333F395 可知其10進制值是53736341,因為不等所以那個“OK”鍵始終不能點擊嘍。
16. 驗證結果:重新進入winamp的注冊選項,在“Name:”中輸入:Xingheng,“Reg#:”中輸入:53736341,現在“OK”鍵是不是已經可用了^_^!點擊“OK”后winamp顯示注冊成功的消息,搞定了^_^!
|
新聞熱點
疑難解答
圖片精選