破解MP3隨身聽! (3千字)

看雪資料發表於2002-03-28

破解MP3隨身聽!

2002.03.28

    昨天,突發奇想,想破解我的MP3隨身聽的軟體,因為它只讓我把MP3檔案從計算機傳到播放器(播放器即指mp3隨身聽,下同)裡,而不讓我把MP3檔案傳出來,於是我就開始破解,我反彙編了它的主程式,找到了檔案型別檢查的地方,然後把它改成了空指令,於是它就不進行檢查啦,哈哈,我看著它把MP3檔案傳出來了,太開心了,但是!我發現它把原來的MP3檔案重新進行了編碼,讓我無法還原! 5~5~5~ 怎麼這麼黑啊!
    今天,我仔細分析了它的資料轉換方式,終於用逆向思維寫出了轉換公式的演算法!並且用VB5實現了演算法,編譯好的程式只有18k,再把這個檔案傳到MP3播放器裡,呵呵這下走到哪裡都不怕了!

    我的播放器是MSC DM-N64,主頁http://www.vintion.com/,管理軟體下載地址:http://www.vintion.com/support/DM-N64driver.zip

    下面是詳細的破解過程:

1、mp3檔案上傳限制的破解
    安裝管理軟體(選擇英文版),在安裝好的目錄下,找到DM-N64.exe檔案。使用W32Dasm8.93將此檔案反彙編,在串式參考裡找到String Resource ID=59193: "Copy Protection!
MP3 file(s) will not be uploaded into the P",雙擊它找到對應彙編,向上找,會發現其呼叫了DM-N64.VxAPI_GetFileType函式取得檔案型別,並進行比較,如下:

* Reference To: DM-N64.VxAPI_GetFileType, Ord:0015h
                                  |
:0041C139 FF15A8E04500            Call dword ptr [0045E0A8]
:0041C13F 83C404                  add esp, 00000004
:0041C142 898510FFFFFF            mov dword ptr [ebp+FFFFFF10], eax
:0041C148 83BD10FFFFFF01          cmp dword ptr [ebp+FFFFFF10], 00000001
:0041C14F 7409                    je 0041C15A
:0041C151 83BD10FFFFFF0C          cmp dword ptr [ebp+FFFFFF10], 0000000C
:0041C158 7576                    jne 0041C1D0

    於是將此處 FF 15 A8 E0 45 00 改為空指令 90 90 90 90 90,再進行驗證,發現已經解除檔案上傳的限制。

2、mpm檔案格式的轉換
    mp3檔案下傳到播放器裡其格式變成為mpm檔案,再上傳出來一看,發現已經面目全非,於是按照mp3檔案的幀格式,自己用UltraEdit32建立了一個只有3幀的mp3檔案用於進行測試:其每幀的幀頭為FF FB 92 6C,每幀長418位元組(幀長計算:幀長 = 144 * 位元率 / 取樣頻率 + Padding ),共1254位元組。具體資訊可到http://www.dv.co.yu/mpgscript/mpeghdr.htm 處查閱,此檔案除了幀頭,其他全用特殊位元組填充,方便觀察。

用winamp檢視顯示如下:

Size: 1254 bytes
Header found at: 0 bytes
Length: 0 seconds
MPEG 1.0 layer 3
128kbit, 6 frames
44100Hz Joint Stereo
CRCs: No
Copyrighted: Yes
Original: Yes
Emphasis: None

    將此檔案下傳到播放器中,再上傳出來,發現增加了32位元組。去掉此32位元組的附加的檔案尾,再不斷地進行位元組比對,終於發現,其按照512個位元組一個資料組的方式進行轉換,相當於一個16×32的矩陣,轉換後的資料仍在此矩陣中,只是位置發生了變化,而且數值被按奇偶數進行了增減1。最後不足512位元組的地方,不於轉換。

    轉換演算法整理成公式為:

    mp3_Position = ((mpm_position Mod 512) \ 32) + 16 * ((mpm_position Mod 512) Mod 32) + 512 * (mpm_position \ 512)
    filemp3(mp3_Position) = filempm(mpm_position) - 2 * (filempm(mpm_position) Mod 2) + 1

    此公式以VB寫成,"\" 為 "除,取整數","mod" 為 "除,取餘數"。

    最後編譯成vb5的程式,大小為18k,進行測試,PIII500的機器,轉換10M左右的檔案,也就2、3秒鐘左右。

    好開心啊,這是我的第一個破解,有需要原始碼和程式的朋友,特別是擁有此款mp3隨身聽的朋友,請給我寫信: hdy@sina.com 。

相關文章