搞了個超級簡單的正好出出氣,呵呵,不知道分析有錯誤沒有!! (6千字)

看雪資料發表於2002-01-04

**********************************
* 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

相關文章