SNK NeoGeo X v370
破解Ninja Master's SDCard
NeoGeo X掌機問世後,國外就有許多人開始進行該掌機的破解,因為總是想把該掌機發揮到極致才過癮,當然最主要的目的是可以玩更多NeoGeo遊戲,司徒當然要加入這場戰局,順便可以學到更多破解的技巧,那一開始要從哪開始破解呢?最初,國外網站將NeoGeo X掌機拆解時,意外發現它是使用MicroSD代替內部Flash IC元件,所以國外高手便將此MicroSD掛載於電腦並進行分析,意外發現它是運行FBA模擬器,於是將其它NeoGeo遊戲轉換成FBA格式並替換原本檔案,竟發現可以玩置換後的遊戲,雖然司徒也很想買到此款掌機,但是,後來出的NeoGeo X掌機便將MicroSD換成Flash IC了,因此,後來購買的掌機,如果想要從MicroSD進行破解,似乎不太容易,那如何知道自己的掌機是否為MicroSD或Flash IC呢?只要在主畫面,按下Menu按鈕時,便會顯示版本,v370以後的版本(包含v370版本)確定是換成Flash IC元件,而低於v370版本的掌機才有可能是MicroSD,因為司徒的NeoGeo X掌機是v370版本,因此,司徒只能朝不拆機的方式嘗試破解它,而唯一的機會便是SDCard,因為購買NeoGeo X掌機時,SNK會附送一張Ninjan Master's SDCard,因此,對SDCard進行分析是最好的一種方式。
首先,司徒將Ninja Master's SDCard插入電腦進行分析,發現這一張SDCard是一種未知的格式,在Windows和Linux系統下都是顯示這樣的錯誤訊息,顯然此SDCard不是FAT、NTFS、Linux檔案系統的相關格式,於是司徒使用WinHEX進行MBR磁區分析,如下表
00000000h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000060h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000070h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000080h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000090h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000100h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000110h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000120h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000130h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000140h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000150h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000160h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000170h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000180h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000190h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ;................ 000001c0h: 01 00 08 02 60 F1 4E 00 00 00 E9 F1 08 00 00 00 ;....`醨...濄.... 000001d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AA 55 ;..............枓
可以看出該格式是類似MBR格式,而第二個Partition是從0x1C0開始,根據MBR定義,有效的Partition磁區是位於78(0x4E)的位置,可是司徒看了一下第78磁區的位置,該位置的資料都是0x00,而該Partition的ID卻是0x08,根據Partition ID的定義,0x08是AIX Boot Partition的格式,而正常MBR磁區的結束標記應該是0x55、0xAA才對,顯然這個MBR磁區怪怪的,司徒越想越不對,這一些資料可能都是經過加密過的,因此,繼續分析下去可能會沒完沒了。
後來司徒又再度找尋國外NeoGeo網站,發現高手說外部SDCard的線路是經過跳線設計,所以無法直接分析原始資料,而該高手也很熱心的提供一個C語言的轉換工具,該工具可以將資料嘗試還原,但是該高手提供的程式是透過查表方式,於是司徒改寫成比較簡單的邏輯判斷方式,如下程式
#include <unistd.h> #include <stdio.h> #include <stdint.h> #define RW_SIZE (1024 * 32) int main(int argc, char **argv) { FILE *in, *out; unsigned char buffer[RW_SIZE]; int type, size, i; if(argc != 3){ printf("%s <input_file> <output_file>\n\n", argv[0]); return 1; } in = fopen(argv[1],"r"); if(in == NULL){ printf("Unable to open input file: %s\n", argv[1]); return 1; } out = fopen(argv[2], "w"); if(out == NULL){ fclose(in); printf("Unable to open output file: %s\n", argv[2]); return 1; } printf("Processing...\r\n"); while((size = fread(buffer, 1, RW_SIZE, in)) > 0){ for(i=0; i<size; i++){ buffer[i] = (((buffer[i] & 0x01) ? 0x08 : 0x00) | ((buffer[i] & 0x02) ? 0x04 : 0x00) | ((buffer[i] & 0x04) ? 0x02 : 0x00) | ((buffer[i] & 0x08) ? 0x01 : 0x00) | ((buffer[i] & 0x10) ? 0x80 : 0x00) | ((buffer[i] & 0x20) ? 0x40 : 0x00) | ((buffer[i] & 0x40) ? 0x20 : 0x00) | ((buffer[i] & 0x80) ? 0x10 : 0x00)); } fwrite(buffer, 1, size, out); usleep(1000); } printf("Completed\r\n"); fclose(in); fclose(out); }
看完該程式碼,發現它是四位元顛倒擺放,果然厲害,SNK可以想出這種硬體設計,讓軟體無法分析。
經由此程式轉換後,司徒再度將MBR磁區的資料進行分析,發現格式已經正確
00000000h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000020h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000060h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000070h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000080h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000090h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000100h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000110h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000120h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000130h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000140h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000150h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000160h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000170h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000180h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000190h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ;................ 000001c0h: 08 00 01 04 60 F8 27 00 00 00 79 F8 01 00 00 00 ; ....`?...y?.... 000001d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ;..............U.
結束位元是0x55和0xAA,這代表是一個正常的MBR磁區,於是找尋第一個Partition位置(BPB),它是位於第39(0x27)磁區,於是,司徒找尋第39磁區的資料,發現它真的是Boot Parameter Block(BPB)的位置,司徒將它整理如下
00000000h: EB 00 90 4D 53 57 49 4E 34 2E 31 00 02 20 01 00 ; ? SWIN4.1.. .. 00000010h: 02 00 02 00 00 F8 0C 00 20 00 08 00 27 00 00 00 ; .....?. ...'... 00000020h: 79 F8 01 00 80 00 29 67 45 23 01 55 44 49 53 4B ; y?..)gE#.UDISK 00000030h: 20 20 20 20 20 20 46 41 54 31 32 20 20 20 33 C9 ; FAT123? 00000040h: 8E D1 BC FC 7B 16 07 BD 78 00 C5 76 00 1E 56 16 ; 瑩{..綞.權..V. 00000050h: 55 BF 22 05 89 7E 00 89 4E 02 B1 0B FC F3 A4 06 ; U?. . .? ? 00000060h: 1F BD 00 7C C6 45 FE 0F 38 4E 24 7D 20 8B C1 99 ; .?|靂?8N$} ? 00000070h: E8 7E 01 83 EB 3A 66 A1 1C 7C 66 3B 07 8A 57 FC ; 鋓. :f?|f;. ? 00000080h: 75 06 80 CA 02 88 56 02 80 C3 10 73 ED 33 C9 FE ; u.? .?s?汋 00000090h: 06 D8 7D 8A 46 10 98 F7 66 16 03 46 1C 13 56 1E ;.堩 . f..F..V. 000000a0h: 03 46 0E 13 D1 8B 76 11 60 89 46 FC 89 56 FE B8 ; .F..?v.` ?V 000000b0h: 20 00 F7 E6 8B 5E 0B 03 C3 48 F7 F3 01 46 FC 11 ; .爢 ..餾蘼.F? 000000c0h: 4E FE 61 BF 00 07 E8 28 01 72 3E 38 2D 74 17 60 ; N ?.?.r.8-t.` 000000d0h: B1 0B BE D8 7D F3 A6 61 74 3D 4E 74 09 83 C7 20 ; ?撻}韟at=Nt. 000000e0h: 3B FB 72 E7 EB DD FE 0E D8 7D 7B A7 BE 7F 7D AC ;; 賨毼.堩{屁}? 000000f0h: 98 03 F0 AC 98 40 74 0C 48 74 13 B4 0E BB 07 00 ; ?藇 t.Ht.??. 00000100h: CD 10 EB EF BE 82 7D EB E6 BE 80 7D EB E1 CD 16 ; ?錝?}錛?}錆? 00000110h: 5E 1F 66 8F 04 CD 19 BE 81 7D 8B 7D 1A 8D 45 FE ; ^.f???} . ? 00000120h: 8A 4E 0D F7 E1 03 46 FC 13 56 FE B1 04 E8 C2 00 ; .欒.F?V .餔. 00000130h: 72 D7 EA 00 02 70 00 52 50 06 53 6A 01 6A 10 91 ;r郰..p.RP.Sj.j.? 00000140h: 8B 46 18 A2 26 05 96 92 33 D2 F7 F6 91 F7 F6 42 ; .?.?3窉?蘾B 00000150h: 87 CA F7 76 1A 8A F2 8A E8 C0 CC 02 0A CC B8 01 ; 饔. 檜..抶. 00000160h: 02 80 7E 02 0E 75 04 B4 42 8B F4 8A 56 24 CD 13 ; .~..u.婿 $? 00000170h: 61 61 72 0A 40 75 01 42 03 5E 0B 49 75 77 C3 03 ; aar.@u.B.^.Iuw? 00000180h: 18 01 27 0D 0A 49 6E 76 61 6C 69 64 20 73 79 73 ; ..'..Invalidsys 00000190h: 74 65 6D 20 64 69 73 6B FF 0D 0A 44 69 73 6B 20 ; temdisk ..Disk 000001a0h: 49 2F 4F 20 65 72 72 6F 72 FF 0D 0A 52 65 70 6C ; I/Oerror ..Repl 000001b0h: 61 63 65 20 74 68 65 20 64 69 73 6B 2C 20 61 6E ; ace the disk,an 000001c0h: 64 20 74 68 65 6E 20 70 72 65 73 73 20 61 6E 79 ; d then pressany 000001d0h: 20 6B 65 79 0D 0A 00 00 49 4F 20 20 20 20 20 20 ; key....IO 000001e0h: 53 59 53 4D 53 44 4F 53 20 20 20 53 59 53 7F 01 ; SYSMSDOSSYS. 000001f0h: 00 41 BB 00 07 60 66 6A 00 E9 3B FF 00 00 55 AA ;.A?.`fj.? ..U
該BPB磁區的結束標記是0x55、0xAA,這代表它是一個正確的BPB磁區。
資料整理如下
OEM Name | MSWIN4.1 |
---|---|
Byte Per Section | 512 Bytes |
Sector Per Cluster | 32 Sectors |
Reserved Sector Count | 1 Sector |
Number of FAT Table | 2 FAT Tables |
Root Directory Entry Count | 512 Files |
Media Type | Fixed Media |
FAT Table Size | 12 Sectors |
Sector Per Track | 32 Sectors |
Number of Head | 8 Sectors |
Hidden Sectors | 39 Sectors |
Total Sectors | 129145 Sectors(129145 x 512 = 64M Bytes) |
Media Type | FAT12 |
經由上面表格的分析,可以知道Ninjan Master's SDCard是FAT12的格式。
接著我們需要找出根目錄磁區,它是位於第64磁區的位置,內容如下
00000000h: 55 44 49 53 4B 20 20 20 20 20 20 08 00 00 00 00 ;UDISK..... 00000010h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000020h: 41 63 00 61 00 72 00 64 00 5F 00 0F 00 AF 67 00 ;Ac.a.r.d._...症. 00000030h: 61 00 6D 00 65 00 00 00 FF FF 00 00 FF FF FF FF ;a.m.e... .. 00000040h: 43 41 52 44 5F 47 7E 31 20 20 20 10 00 A8 E5 72 ;CARD_G~1..典r 00000050h: 58 41 58 41 00 00 E6 72 58 41 02 00 00 00 00 00 ;XAXA..熳XA...... 00000060h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000070h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000080h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000090h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000000f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000100h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000110h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000120h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000130h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000140h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000150h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000160h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000170h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000180h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 00000190h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001a0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001b0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001c0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001d0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................ 000001f0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ;................
FAT目錄是每32個位元組為一個單位,因此,經由分析,第一個UDISK是一個磁碟標籤,而接下來的是一個檔案目錄,它的名稱是card_game,檔案內容如下