脫《唐詩三百首1.2》殼(PEBundle 0.2 – 3.x -> Jeremy Collake)並提取MID資料

來源:互聯網
上載者:User
【破文作者】 JIVI(喬偉)
【使用工具】 Peid 0.94,OllyDbg(OllyIce),exeScope,010Editor  
【破J平台】 WinXP 
【軟體名稱】 唐詩三百首1.2         
【軟體簡介】 看名字就知道了 

 前兩天在PPStream上看《俠女闖天關》。前幾集裡有一首不停出現的曲子,感覺蠻好聽的,同時又有種非常熟悉的感覺。想了半天才想起來是很久以前用過的一個軟體的背景音樂,這個軟體就是我們今天的目標《唐詩三百首》(版本1.2 ,新的版本背景音樂已經換了)。當時就想把這首曲子下下來聽聽,但不知是什麼名字,於是百度之,有一人回答是 高山流水,下下來。聽了一遍,對不上號。又搜了半天終是無果。後來想想,既然是軟體的背景音樂,那個軟體裡自然是有的,幸好這個軟體還是比較容易下的,下下來後,解壓就能用,在解壓的檔案夾裡看了一看,總共就六個檔案,一個EXE和sr.cys sr.edt ts.cys ts.edt四個檔案,外加一個協助檔案,看來這個背景音樂(MID格式的)多半是被嵌到主程式裡去了。既然這樣只有手動提取 了/          

好的,下面開始提取的過程。
首先還是查殼,因為無論是壓縮殼還是加密殼你都是無法看到原MID資料的 ,無法直接提取,當然我們希望他是沒殼的。但事實往往不如人意,用PEID查殼的結果是:
PEBundle 0.2 - 3.x -> Jeremy Collake
還好,這不是什麼猛殼,用 ESP定律(不懂ESP定律的,自行去搜尋) 輕鬆搞定
OD載入(忽略所有異常) 來到這裡
004A6000 > 9C pushfd
004A6001 60 pushad
004A6002 E8 02000000 call 004A6009
004A6007 33C0 xor eax, eax
004A6009 8BC4 mov eax, esp
004A600B 83C0 04 add eax, 4
004A600E 93 xchg eax, ebx
004A600F 8BE3 mov esp, ebx
004A6011 8B5B FC mov ebx, dword ptr [ebx-4]
004A6014 81EB 07304000 sub ebx, 00403007
004A601A 87DD xchg ebp, ebx
004A601C 80BD DD3B4000 0>cmp byte ptr [ebp+403BDD], 0
004A6023 74 21 je short 004A6046
004A6025 8D85 D6384000 lea eax, dword ptr [ebp+4038D6]
004A602B 50 push eax
004A602C FF95 B2384000 call dword ptr [ebp+4038B2]
004A6032 8D8D 2C3A4000 lea ecx, dword ptr [ebp+403A2C]
004A6038 51 push ecx
004A6039 50 push eax
004A603A FF95 A2384000 call dword ptr [ebp+4038A2]
004A6040 8985 3C3A4000 mov dword ptr [ebp+403A3C], eax
004A6046 8DBD 703E4000 lea edi, dword ptr [ebp+403E70]
004A604C 33C0 xor eax, eax

開頭就是兩個PUSHFD PUSHAD 典型的殼的處理模式,用於保護現場

下硬體點 
在Command 裡輸入 hw 0012ffc0 (為什麼下這個,看ESP定律的原理就知道了)斷行符號
F9 斷在 pushad那句不用管,繼續F9 來到這裡
004A6376 C3 retn
004A6377 C8 000000 enter 0, 0
004A637B 57 push edi
004A637C 56 push esi
004A637D 8B75 08 mov esi, dword ptr [ebp+8]
004A6380 8B7D 0C mov edi, dword ptr [ebp+C]
004A6383 8A06 mov al, byte ptr [esi]
004A6385 3C 61 cmp al, 61
004A6387 72 06 jb short 004A638F
004A6389 3C 7A cmp al, 7A
004A638B 77 02 ja short 004A638F
004A638D 04 E0 add al, 0E0
004A638F 8A27 mov ah, byte ptr [edi]
004A6391 80FC 61 cmp ah, 61
004A6394 72 08 jb short 004A639E
004A6396 80FC 7A cmp ah, 7A
004A6399 77 03 ja short 004A639E
004A639B 80C4 E0 add ah, 0E0
004A639E 46 inc esi
004A639F 47 inc edi

繼續 F9
00496001 60 pushad
00496002 E8 02000000 call 00496009
00496007 33C0 xor eax, eax
00496009 8BC4 mov eax, esp
0049600B 83C0 04 add eax, 4
0049600E 93 xchg eax, ebx
0049600F 8BE3 mov esp, ebx
00496011 8B5B FC mov ebx, dword ptr [ebx-4]
00496014 81EB 07304000 sub ebx, 00403007
0049601A 87DD xchg ebp, ebx
0049601C 80BD DD3B4000 0>cmp byte ptr [ebp+403BDD], 0
00496023 74 21 je short 00496046
00496025 8D85 D6384000 lea eax, dword ptr [ebp+4038D6]
0049602B 50 push eax
0049602C FF95 B2384000 call dword ptr [ebp+4038B2]
00496032 8D8D 2C3A4000 lea ecx, dword ptr [ebp+403A2C]
00496038 51 push ecx
00496039 50 push eax

繼續F9
00496376 C3 retn
00496377 C8 000000 enter 0, 0
0049637B 57 push edi
0049637C 56 push esi
0049637D 8B75 08 mov esi, dword ptr [ebp+8]
00496380 8B7D 0C mov edi, dword ptr [ebp+C]
00496383 8A06 mov al, byte ptr [esi]
00496385 3C 61 cmp al, 61
00496387 72 06 jb short 0049638F
00496389 3C 7A cmp al, 7A
0049638B 77 02 ja short 0049638F
0049638D 04 E0 add al, 0E0
0049638F 8A27 mov ah, byte ptr [edi]
00496391 80FC 61 cmp ah, 61
00496394 72 08 jb short 0049639E
00496396 80FC 7A cmp ah, 7A
00496399 77 03 ja short 0049639E
0049639B 80C4 E0 add ah, 0E0
0049639E 46 inc esi
0049639F 47 inc edi
004963A0 837D 10 01 cmp dword ptr [ebp+10], 1

繼續F9
0042C009 60 pushad
0042C00A E8 02000000 call 0042C011
0042C00F 33C0 xor eax, eax
0042C011 8BC4 mov eax, esp
0042C013 83C0 04 add eax, 4
0042C016 93 xchg eax, ebx
0042C017 8BE3 mov esp, ebx
0042C019 8B5B FC mov ebx, dword ptr [ebx-4]
0042C01C 81EB 3F904000 sub ebx, 0040903F
0042C022 87DD xchg ebp, ebx
0042C024 8B85 E6904000 mov eax, dword ptr [ebp+4090E6]
0042C02A 0185 33904000 add dword ptr [ebp+409033], eax
0042C030 66:C785 3090400>mov word ptr [ebp+409030], 9090
0042C039 0185 DA904000 add dword ptr [ebp+4090DA], eax
0042C03F 0185 DE904000 add dword ptr [ebp+4090DE], eax
0042C045 0185 E2904000 add dword ptr [ebp+4090E2], eax
0042C04B BB 7B110000 mov ebx, 117B
0042C050 039D EA904000 add ebx, dword ptr [ebp+4090EA]
0042C056 039D E6904000 add ebx, dword ptr [ebp+4090E6]
0042C05C 53 push ebx
0042C05D 8BC3 mov eax, ebx
0042C05F 8BFB mov edi, ebx
0042C061 2D AC904000 sub eax, 004090AC

繼續F9
0042D551 68 6B134000 push 0040136B
0042D556 C2 0400 retn 4
0042D559 8BB5 5B974000 mov esi, dword ptr [ebp+40975B]
0042D55F 0BF6 or esi, esi
0042D561 74 18 je short 0042D57B
0042D563 8B95 E6904000 mov edx, dword ptr [ebp+4090E6]
0042D569 03F2 add esi, edx
0042D56B E8 0F000000 call 0042D57F
0042D570 72 0B jb short 0042D57D
0042D572 83C6 14 add esi, 14
0042D575 837E 0C 00 cmp dword ptr [esi+C], 0
0042D579 ^ 75 F0 jnz short 0042D56B
0042D57B F8 clc
0042D57C C3 retn
0042D57D F9 stc
0042D57E C3 retn
0042D57F C785 31974000 0>mov dword ptr [ebp+409731], 0
0042D589 8B0E mov ecx, dword ptr [esi]
0042D58B 8B7E 10 mov edi, dword ptr [esi+10]
0042D58E 0BC9 or ecx, ecx
0042D590 75 02 jnz short 0042D594
0042D592 8BCF mov ecx, edi

繼續F9
0040136C 8B db 8B
0040136D EC db EC
0040136E 6A db 6A ; CHAR 'j'
0040136F FF db FF
00401370 68 db 68 ; CHAR 'h'
00401371 B0 db B0
00401372 40 db 40 ; CHAR '@'
00401373 40 db 40 ; CHAR '@'
00401374 00 db 00
00401375 68 db 68 ; CHAR 'h'
00401376 A0 db A0
00401377 1E db 1E
00401378 40 db 40 ; CHAR '@'
00401379 00 db 00
0040137A 64 db 64 ; CHAR 'd'
0040137B A1 db A1
0040137C 00 db 00
0040137D 00 db 00
0040137E 00 db 00
0040137F 00 db 00
00401380 50 db 50 ; CHAR 'P'
00401381 64 db 64 ; CHAR 'd'
00401382 89 db 89
00401383 25 db 25 ; CHAR '%'

到了這裡,我們開始看看資料視窗,已經有明文出現了,看來到這裡應該是到了 OEP的下一個指令了,不過既然是OEP的下一個指令,當然應該是代碼了,但看上面的那一堆東西,明明是資料,明顯的軟體作者在這裡用了花指令。
去花指令,在OD代碼視窗 右鍵-》去除花指令-》obsidium 
提示去除了一個花指令,這時再看代碼視窗。變成了這樣
0040136C 8BEC mov ebp, esp
0040136E 6A FF push -1
00401370 68 B0404000 push 004040B0
00401375 68 A01E4000 push 00401EA0
0040137A 64:A1 0000000>mov eax, dword ptr fs:[0]
00401380 50 push eax
00401381 64:8925 00000>mov dword ptr fs:[0], esp
00401388 83EC 58 sub esp, 58
0040138B 53 push ebx
0040138C 56 push esi
0040138D 57 push edi
0040138E 8965 E8 mov dword ptr [ebp-18], esp
00401391 FF15 30404000 call dword ptr [404030] ; kernel32.GetVersion
00401397 33D2 xor edx, edx
00401399 8AD4 mov dl, ah
0040139B 8915 D4554000 mov dword ptr [4055D4], edx
004013A1 8BC8 mov ecx, eax
004013A3 81E1 FF000000 and ecx, 0FF
004013A9 890D D0554000 mov dword ptr [4055D0], ecx
004013AF C1E1 08 shl ecx, 8
004013B2 03CA add ecx, edx
004013B4 890D CC554000 mov dword ptr [4055CC], ecx  

看來已經到了OEP的第二句無疑了。
那麼OEP 自然是 0000136B(斷在了0040136C,看上面代碼的第一行的地址,那麼OEP當然是他的上一個指令減去基址(00400000),也就是0000136B)了。
確定了OEP,下一步當然是DUMP了。Od有個外掛程式就可以DUMP。在這裡就不使用LORDPE+IMPORTREC了。
選擇 外掛程式-》OllyDump-》Dump Debugged Process 在彈出的表單的 Modify裡欄裡填136B(你開啟時他預設是你當前斷的位置,也就是136C,你要修正) 點dump 隨便填個名字點儲存即可。在這裡填了aaa.exe. 將這個檔案存在了原來程式的那個目錄裡.這裡用peid查看aaa.exe.已經變了VC6.0了。看來殼已經脫好了,運行一下,也正常。脫殼到這一步算是完成了。

          
脫殼完成,然後下一步,自然是提取資料了。提取資料,尤其是資源檔,當然少不了ExeScope了。用EXESCOPE開啟aaa.exe. 依次展開 資源->RC資料->200 此時右邊出現了十六進位和ANSICC資料。點檔案-》匯出,隨便選個檔案夾取個文字,在這裡,選案頭,檔案名稱字為aaa.rc 。在這個檔案的資源裡除了RCDATA就是表徵圖了,那MID在RC資料裡,基本上可能性已經非常大了。不過還要確定。用十六進位編輯工具,010Editor 開啟 aaa.rc.(當然如果更喜歡用UltraEditor這沒關係的)他們兩個差不多哈。(本來是準備看網上如果有什麼RCDATA資料讀取器的話,就直接下下來用的,但找了半天沒有找到,所以只好手動從RC資料裡提取MID檔案了。
在提取之前,當然要明白MID檔案的格式 。 

每個Mid檔案的開頭都有如下內容,它們的十六進位代碼為:“4d 54 68 64 00 00 00 06 ff ff nn nn dd dd”。
前四個是ASCII字元“MThd”是用來鑒別是否Mid檔案,而隨後的四個位元組是指明檔案頭描述部分的位元組數,MID的檔案頭佔6個位元組,所以這裡一定是“00 00 00 06”,以下是剩餘部分(檔案頭)的含義
ff ff 指定MID的格式 00 00 表示 單音軌 00 01 多音軌同步 00 02多音軌不同步
nn nn 指定MID的軌道數 
dd dd 指定一個四分音符號的TICK值,用於控制節奏。
以上就是MID的檔案頭。緊跟著檔案頭的就是資料區了
MID的資料是由若干個格式相同的子資料構成的,這些子資料在多音軌的格式中記錄了一個軌道的所有資訊。多加一個音軌,就簡單地把資料追加在前一音軌的後面就可以了,不過不要忘記變更檔頭中的nn nn(軌道數)。

音軌,都以“4D 54 72 6B”開頭,它其實是ASCII字元“MTrk”,其後跟著一個4個位元組的整數,它標誌了該軌道的位元組數,這不包括前面的4個位元組和本身的4個位元組。 
好的,知道了以上的知識就差不多了,至於其它的格式對於提取MID來說沒什麼用處,在這裡就不再介紹了。
從上面的介紹可知。MID檔案是以 “MThd”開始的。那麼我們就在剛才開啟的aaa.exe搜尋“MThd”注意大小寫是區分的。找到了一處。在13F3A處,往後看四個位元組 正好是 00 00 00 06 再往後二個位元組 接照前面的介紹,指的是 單音軌,再往後二個位元組 00 01 指只有一個軌道。再往後二個位元組 00 61 這個指的是 四分音符號的TICK值(節奏),到這裡標頭檔完了,再往下進入了資料區,看看前四個位元組果然是MTrk.因為是單音軌,所以只會出現這一個MTrk. 我們只要將MID的頭部分和這一個 音軌資料提取出來就可以了。要想將音軌資料提取出來,還得接著剛才的繼續往下看。在MTrk 後面是 00 00 17 80 從前面的介紹可知, 這個值表示,這個音軌的資料量, 也就是說,從這四個位元組後面開始的 1780(十六進位)個位元組就是音軌的資料了。於是我們就可以算一下,這個音軌資料區的結尾(也就是MID的結尾了,因為這個MID只有一個音軌)的位置了。這四個位元組後面的第一個位置是13F50,那麼 13f50+1780 = 156D0 
那麼這個MID檔案的資料自然是從13F3A 到 156D0 了 在編輯器裡,選中這片地區 CTRL+C。 點檔案-》建立 粘貼, 然後 CTRL+S 儲存成 aaa.mid. 開啟aaa.mid 音樂已經出來了。 到這裡,所有工作都做完了   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.