**********************************
* NICEMC MEDIA PLUGIN FOR WINAMP *
* VERSION 1.8
*
* 08/18/00
*
* http://www.nicemcmedia.com *
**********************************
昨天晚上上網,一不小心,被人攻擊了。害得我的天網防火牆非法操作,98系統崩潰。我趕緊換到2000下面,起初還沒什麼事,我又上網了,但當我下網的時候,系統居然反應奇慢,根本沒法忍受。正常關機就失去響應了。我KAO,你TMD有種去幹美國佬或日本人啊,在國人面前逞什麼能啊。我本來對這種事是很隨便的,反正我的機器裡面沒有什麼秘密,隨你看,只要不破壞我的系統就行了。唉,為什麼總是有這麼一些吃飽了撐著沒事幹的人了??想不通!!
不好意思啊,發了一通牢騷,我實在是太氣憤了!下面轉入正題。這次破的又是一個winamp的外掛,它讓winamp發生了質的變化,從單純的播放聲音變到可以播放影片,了不起吧!我很早就在用它了,一直是用從網上找來的序號產生器註冊,這次重灌系統後,翻遍整個硬碟也沒有找到我當的那個序號產生器,唉,算了。自己動手,豐衣足食。剛好拿它出氣!!
啟動winamp,隨便找張影碟放了,放一下停下來再放,就可以看到提示你註冊的畫面了,好,填入使用者名稱:Turkey,註冊碼:987654321,先別點確定,啟動trw,下斷:bpx
hmemcpy,F5返回到程式,這時再點選確定,被trw攔下,按10下F12後(11下F12就出現註冊碼錯誤的畫面了,這裡pmodule不好用,會直接回到winamp去),再按N下F10來到這裡:
0167:01E02F84 PUSH DWORD 82
0167:01E02F89 PUSH DWORD 01E304D8
0167:01E02F8E PUSH DWORD 03F9
0167:01E02F93 MOV EDX,[EBP+08]
0167:01E02F96 PUSH EDX
0167:01E02F97 CALL `USER32!GetDlgItemTextA`
0167:01E02F9D PUSH BYTE +1E //游標停在這裡,看上面的函式,猜它是得到使用者名稱,不用管它
0167:01E02F9F LEA EAX,[EBP-20]
0167:01E02FA2 PUSH EAX
0167:01E02FA3 PUSH DWORD 03FA
0167:01E02FA8 MOV ECX,[EBP+08]
0167:01E02FAB PUSH ECX
0167:01E02FAC CALL `USER32!GetDlgItemTextA`
0167:01E02FB2 LEA EDX,[EBP-20] //上面這個函式就是的到你輸入的註冊碼了,過了這一行d
edx就可看到你輸入的註冊碼
0167:01E02FB5 PUSH EDX //註冊碼進棧
0167:01E02FB6 CALL `MSVCRT!atoi` //呼叫一個標準函式,我不知道它是幹什麼的,我是根據後面的跟蹤才猜出它是幹什麼的,呵呵(我不會程式設計)
0167:01E02FBB ADD ESP,BYTE +04
0167:01E02FBE MOV [01E304C8],EAX
0167:01E02FC3 MOV EAX,[01E304C8]
0167:01E02FC8 PUSH EAX //假碼進棧
0167:01E02FC9 PUSH DWORD 01E304D8 //使用者名稱進棧
0167:01E02FCE CALL 01E010AA //關鍵call,跟進去
0167:01E02FD3 ADD ESP,BYTE +08
0167:01E02FD6 CMP DWORD [01E30378],BYTE +00 //比較正確與否的標誌位
0167:01E02FDD JZ 01E02FF7 //是0你就死翹翹了
0167:01E02FDF PUSH BYTE +00
0167:01E02FE1 PUSH DWORD 01E2C570
0167:01E02FE6 PUSH DWORD 01E2C4FC
0167:01E02FEB MOV ECX,[EBP+08]
0167:01E02FEE PUSH ECX
0167:01E02FEF CALL `USER32!MessageBoxA` //這裡秀出註冊成功的畫面
0167:01E02FF5 JMP SHORT 01E0300D
0167:01E02FF7 PUSH BYTE +00
0167:01E02FF9 PUSH DWORD 01E2C570
0167:01E02FFE PUSH DWORD 01E2C4EC
0167:01E03003 MOV EDX,[EBP+08]
0167:01E03006 PUSH EDX
0167:01E03007 CALL `USER32!MessageBoxA` //這裡秀出註冊失敗的畫面
0167:01E0300D PUSH BYTE +00
0167:01E0300F MOV EAX,[EBP+08]
0167:01E03012 PUSH EAX
0167:01E03013 CALL `USER32!EndDialog`
0167:01E03019 MOV EAX,01
0167:01E0301E JMP SHORT 01E03022
0167:01E03020 XOR EAX,EAX
0167:01E03022 POP EDI
0167:01E03023 POP ESI
0167:01E03024 POP EBX
0167:01E03025 MOV ESP,EBP
0167:01E03027 POP EBP
0167:01E03028 RET 10 //這裡就返回上一級了
好,廢話少說,跟進那個關鍵call,來到這裡:
0167:01E06EA0 PUSH EBP
0167:01E06EA1 MOV EBP,ESP
0167:01E06EA3 SUB ESP,BYTE +48
0167:01E06EA6 PUSH EBX
0167:01E06EA7 PUSH ESI
0167:01E06EA8 PUSH EDI
0167:01E06EA9 MOV DWORD [EBP-08],01620100 //初始化[EBP-08]
0167:01E06EB0 MOV DWORD [EBP-04],00 //初始化[EBP-04]
0167:01E06EB7 JMP SHORT 01E06EC2
0167:01E06EB9 MOV EAX,[EBP-04]
0167:01E06EBC ADD EAX,BYTE +01
0167:01E06EBF MOV [EBP-04],EAX
0167:01E06EC2 MOV ECX,[EBP+08] //使用者名稱送到ECX
0167:01E06EC5 PUSH ECX //ecx進棧
0167:01E06EC6 CALL `MSVCRT!strlen` //取得使用者名稱的長度放到eax
0167:01E06ECB ADD ESP,BYTE +04
0167:01E06ECE CMP [EBP-04],EAX //比較使用者名稱是不是已經取完
0167:01E06ED1 JNC 01E06F14 //已經取完就跳出迴圈
0167:01E06ED3 MOV EDX,[EBP+08] //使用者名稱位到edx
0167:01E06ED6 ADD EDX,[EBP-04] //[EBP-04]加edx到edx,第一次經過時[EBP-04]為0
0167:01E06ED9 MOVSX EAX,BYTE [EDX] //[EDX]第一位到eax
0167:01E06EDC SUB EAX,BYTE +01 //eax=eax-1
0167:01E06EDF MOV ECX,[EBP+08] //使用者名稱位到ecx
0167:01E06EE2 ADD ECX,[EBP-04] //[EBP-04]加ecx到ecx,第一次經過時[EBP-04]為0
0167:01E06EE5 MOVSX EDX,BYTE [ECX] //[EDX]第一位到edx
0167:01E06EE8 ADD EDX,BYTE +02 //edx=edx+2
0167:01E06EEB IMUL EAX,EDX //eax=eax*edx
0167:01E06EEE MOV ECX,[EBP+08] //使用者名稱位到ecx
0167:01E06EF1 ADD ECX,[EBP-04] //[EBP-04]加ecx到ecx,第一次經過時[EBP-04]為0
0167:01E06EF4 MOVSX EDX,BYTE [ECX] //[EDX]第一位到edx
0167:01E06EF7 ADD EDX,BYTE +05 //edx=edx+5
0167:01E06EFA IMUL EAX,EDX //eax=eax*edx
0167:01E06EFD IMUL EAX,EAX,BYTE +09 //eax=eax*9
0167:01E06F00 MOV ECX,[EBP-08] //使用者名稱位到ecx
0167:01E06F03 LEA EDX,[ECX+EAX-0E] //edx=ecx+eaw-E
0167:01E06F07 MOV [EBP-08],EDX //edx到[ebp-08]
0167:01E06F0A CMP DWORD [EBP-04],BYTE +0C //比較使用者名稱是不是大於等於c
0167:01E06F0E JNZ 01E06F12 //小於則跳走,繼續迴圈
0167:01E06F10 JMP SHORT 01E06F14
0167:01E06F12 JMP SHORT 01E06EB9 //往上跳,迴圈
0167:01E06F14 MOV EAX,[EBP-08] //[ebp-08]到eax,[ebp-08]是根據使用者名稱算來的值
0167:01E06F17 CMP EAX,[EBP+0C] //比較[ebp-0c]和eax是否相等,此時看到[ebp-0c]中的值為3ade98b1,這是個什麼東東啊,肯定是前面程式呼叫那個標準函式得來的。既然是個標準函式,那就有的猜了,呵呵,我運氣好,一猜就中,它是987654321的16進位制數(明天趕快去買彩票)。
0167:01E06F1A JNZ 01E06F26 //跳走你就玩完了,不能跳啊
0167:01E06F1C MOV DWORD [01E30378],01 //給標誌位付值
0167:01E06F26 POP EDI
0167:01E06F27 POP ESI
0167:01E06F28 POP EBX
0167:01E06F29 MOV ESP,EBP
0167:01E06F2B POP EBP
0167:01E06F2C RET //這裡就回上一級了
總結它的演算法,設註冊碼為Z,從高到低位為Z1,Z2。。。。Zn為了方便,暫拿我的使用者名稱--Turkey作例子,則作下列計算:
Z1=(T-1)*(T+2)*(T+5)*9E
Z2=(u-1)*(u+2)*(u+5)*9E
Z3=(r-1)*(r+2)*(r+5)*9E
Z4=(k-1)*(k+2)*(k+5)*9E
Z5=(e-1)*(e+2)*(e+5)*9E
Z6=(y-1)*(y+2)*(y+5)*9E
最後將Z轉換成10進位制的數,就是你的註冊碼了。
總結一下:
使用者名稱:Turkey
註冊碼:96323386
就這麼簡單,哈哈,怎麼樣,你也試試吧,再說一點廢話:
將HK_C_U\SOFTWARE\NiceMC\Media Plugin下的username的值改動一下就又可以註冊了。我沒有找到它存放註冊碼的地方,如果你知道的話,還煩請告訴小弟我一聲,謝謝!!!
轉載請保持其完整性!
Cracker:Turkey/滅害靈
2002.1.4@22:28