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