{"id":593,"date":"2010-08-26T02:20:34","date_gmt":"2010-08-25T18:20:34","guid":{"rendered":"http:\/\/www.computersolutions.cn\/blog\/?p=593"},"modified":"2010-08-26T03:07:49","modified_gmt":"2010-08-25T19:07:49","slug":"dell-mini-3i-firmware-exploration","status":"publish","type":"post","link":"https:\/\/www.computersolutions.cn\/blog\/2010\/08\/dell-mini-3i-firmware-exploration\/","title":{"rendered":"Dell Mini 3i (possibly also Dell Aero too) Firmware Exploration"},"content":{"rendered":"<p>As I&#8217;ve been reasonably successful in the past at figuring out file systems from flat files, I thought I&#8217;d have a go at the Dell Mini 3i 1.5 Firmware that surfaced at damipan (<a href=\"http:\/\/www.namipan.com\/d\/DELL_MINI3I_OMS1.5.rar\/a5ba3b06ab0bfc9baeb2f09b44f54aa40bac3457ee8ebc04\">http:\/\/www.namipan.com\/d\/DELL_MINI3I_OMS1.5.rar\/a5ba3b06ab0bfc9baeb2f09b44f54aa40bac3457ee8ebc04<\/a>)<\/p>\n<p>The rar file unzips to a MFF file.<\/p>\n<p>This I&#8217;m probably guessing is probably named after Marvell File Format or Marvell Flasher File.<br \/>\nHere&#8217;s my initial work on the file system of MFF format, based on  DELL_Mini3i_OMS1.5.mff<\/p>\n<p><strong>Initial 80 bytes [0x0 &#8211; 0x080] (MFF HEADER)<\/strong><\/p>\n<p>0x00 &#8211;  0x03 :  3 Bytes Header MFF<br \/>\n0x03 &#8211; 0x07 : Still to figure out, probably file length  or crc.<br \/>\nHave to grab another firmware file to check though..<\/p>\n<p>0x08 : Number of files?  9 listed, so quite probably&#8230;<br \/>\nRest of header padded out with zero&#8217;s to end of 80 bytes.<\/p>\n<p><strong>[0x80 &#8211; 0x180]  File Allocation Table<\/strong><br \/>\n0x80 &#8211; our first file.  Looks like 0x100 \/ 256 bytes per file listed, padded with 0x0&#8217;s<\/p>\n<p>File listing looks like this:<\/p>\n<p>File header (for each file)<br \/>\n8 bytes, then filename, padded with 0&#8217;s to fill 256 bytes length<\/p>\n<p>First 4 bytes &#8211; offset in MFF of start of file.<br \/>\nSecond 4 bytes &#8211; length of file.<\/p>\n<p>Remaining files repeat from next 256 byte intervals.<\/p>\n<p>eg<br \/>\n0x180 &#8211; 0x280<br \/>\n0x280 &#8211; 0x380<br \/>\n&#8230;<\/p>\n<p><strong>[0x80 + 9 files x 0x100 bytes = 0x980]  Start of Data.<\/strong><\/p>\n<p>How did I work this out?<\/p>\n<p>HEADER                            | Filename (not in hex below as easier to read)<br \/>\n80 09 00 00 34 BB 00 00  | Tavor Flasher_Samsung_ONENAND_h.bin<\/p>\n<p>0x0980 is the start of our first file data, so the first 2 bytes are definitely File Start.<br \/>\n0xBB34 looks quite possibly like File Length.<\/p>\n<p>We can check this easily with one of the plain text files.<\/p>\n<p>Flash_Protection_table.ini is prefixed with 63 EA AD 09   4B 00 00 00<\/p>\n<p>So it should start at  0x09 AD &#8211; hmm, readable text starts at offset 9AD D564.<br \/>\nNot quite right.  Start offset looks close though.<\/p>\n<p>Lets look at another one.<\/p>\n<p>Tavor_saar_onenand.ini &#8211; prefix says<br \/>\n64 d5 ad 09 6f 01 00 00<\/p>\n<p>Ah, 0x9 AD D5 64 is actually our Tavor_saar_onenand.ini content.  Cool, a match.  So, the first 4 bytes are definitely our location pointer.<\/p>\n<p>Lets look at the Flash protection table again Flash_Protection_table.ini<\/p>\n<p>63 EA AD 09   |  4B 00 00 00<br \/>\nShould start at 09 AD EA 63, and go for 4B length.  Bingo, it does \ud83d\ude42<\/p>\n<p>Our file contents for that area are:<\/p>\n<p>[PROTECTED_REGION_0]<br \/>\nBlock_Offset=0x100000<br \/>\nLength=0x20000<br \/>\nMode=SKIP_BLOCKS<\/p>\n<p>So, now we can start to split the files apart into their associated parts.<\/p>\n<p>factory_BENZ2GWIFI.fbf is probably going to be the most interesting, as its the largest.<\/p>\n<p>That starts at 0xC564, length of 0x09AD1000 and starts with &#8220;Marvell_FBF&#8221;<br \/>\nBasic math says that 0x9ADD564 (0x09AD1000 + 0xC564) should be our end of file.<br \/>\nWell, it is, as we know flash protection table.ini starts at 9add564.<\/p>\n<p>So, should be fairly easy with that info to write an unpacker tool to rip out the first interior files from the MFF file format.<br \/>\nSome of the files inside are also &#8220;packed&#8221;, but those appear to be fairly easy to rip apart also \ud83d\ude42<\/p>\n<p>I&#8217;m guessing with a bit more work I&#8217;ll be able to replace parts of the firmware with different versions quite soonish.<\/p>\n<p>The file I&#8217;m using off of namipan has the following files inside:<\/p>\n<blockquote><p>TavorFlasher_SAMSUNG_ONENAND_h.bin<br \/>\nTavorFlasher_SAMSUNG_ONENAND_TIM.bin<br \/>\nfactory_BENZ2GWIFI.fbf<br \/>\nTavor_SAAR_OneNAND.ini<br \/>\nfactory_BENZ2GWIFI.mff.mlt<br \/>\nmagic_fbf.ini<br \/>\nmagic_fbf_inner.ini<br \/>\nNTIM_fbw.ini<br \/>\nFlash_Protection_Table.ini<\/p><\/blockquote>\n<p>I&#8217;m guessing that our fbf file will probably be able to be split into parts as per our ntim_fbw.ini data.<br \/>\nFBF = Flash Binary Format?<\/p>\n<p>some interesting files listed<br \/>\nntim.bin &#8211; non trusted image module?<br \/>\nblob_full.bin &#8211; from the borq&#8217;s blob gz?<br \/>\nTavor_M05_Poleg_AI_B0_Flash.bin &#8211; tavor = our product chip, as we&#8217;re running on a Marvel PXA935 (aka Tavor-P65)<\/p>\n<p>Interesting thing of note &#8211; our OEM UniqueID: 0xF00F00 in Unicode is what glyph?<br \/>\nHint &#8211; its not an orange, or a pear \ud83d\ude09<\/p>\n<p><strong>NTIM_fbw.ini<\/strong><\/p>\n<blockquote><p>Version: 0x030102<br \/>\nTrusted: 0<\/p>\n<p>Issue Date: 0x08142006<br \/>\nOEM UniqueID: 0xf00f00<br \/>\nBoot Flash Signature: 0x4e414e02<br \/>\nNumber of Images: 10<br \/>\nSize of Reserved in bytes: 0x40<\/p>\n<p>Image ID: 0x54494D48<br \/>\nNext Image ID: 0x4F424D49<br \/>\nFlash Entry Address: 0x0<br \/>\nLoad Address: 0x5c008000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: NTIM.bin<\/p>\n<p>Image ID: 0x4F424D49<br \/>\nNext Image ID: 0x4F534C4F<br \/>\nFlash Entry Address: 0x20000<br \/>\nLoad Address: 0x5c013000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: obm_full.bin<\/p>\n<p>Image ID: 0x4F534C4F<br \/>\nNext Image ID: 0x5349474E<br \/>\nFlash Entry Address: 0x80000<br \/>\nLoad Address: 0x83000000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: blob_full.bin<\/p>\n<p>Image ID: 0x5349474E<br \/>\nNext Image ID: 0x494D4549<br \/>\nFlash Entry Address: 0x00120000<br \/>\nLoad Address: 0x84000000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: signature_full.bin<\/p>\n<p>Image ID: 0x494D4549<br \/>\nNext Image ID: 0x4152424C<br \/>\nFlash Entry Address: 0x00100000<br \/>\nLoad Address: 0xBFEE0000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: reliable_full.bin<\/p>\n<p>Image ID: 0x4152424C<br \/>\nNext Image ID: 0x47524249<br \/>\nFlash Entry Address: 0x00140000<br \/>\nLoad Address: 0xBF600000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: arbel_full.bin<\/p>\n<p>Image ID: 0x47524249<br \/>\nNext Image ID: 0x62746C67<br \/>\nFlash Entry Address: 0x00840000<br \/>\nLoad Address: 0xBFF00000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: tavor_full.bin<\/p>\n<p>Image ID: 0x62746C67<br \/>\nNext Image ID: 0x70636C67<br \/>\nFlash Entry Address: 0x00A00000<br \/>\nLoad Address: 0xBF300000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: bootlogo_full.bin<\/p>\n<p>Image ID: 0x70636C67<br \/>\nNext Image ID: 0x464F5441<br \/>\nFlash Entry Address: 0x00A20000<br \/>\nLoad Address: 0x8F300000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: prechangelogo_full.bin<\/p>\n<p>Image ID: 0x464F5441<br \/>\nNext Image ID: 0xFFFFFFFF<br \/>\nFlash Entry Address: 0x0EA40000<br \/>\nLoad Address: 0x80100000<br \/>\nImage Size To CRC in bytes: 0x0<br \/>\nImage Filename: fota_full.bin<\/p>\n<p>Reserved Data:<br \/>\n0x4F505448<br \/>\n0x00000002<br \/>\n0x55415254<br \/>\n0x00000010<br \/>\n0x00004646<br \/>\n0x00000001<br \/>\n0x50524F49<br \/>\n0x00000020<br \/>\n0x00000002<br \/>\n0x00000000<br \/>\n0x00000000<br \/>\n0x00000000<br \/>\n0x00000001<br \/>\n0x00000000<br \/>\n0x5465726D<br \/>\n0x00000008<\/p><\/blockquote>\n<p><strong>Flash_Protection_Table.ini<\/strong><\/p>\n<blockquote><p>[PROTECTED_REGION_0]<br \/>\nBlock_Offset=0x100000<br \/>\nLength=0x20000<br \/>\nMode=SKIP_BLOCKS<\/p><\/blockquote>\n<p><strong>magic_fbf_inner.ini<\/strong><\/p>\n<blockquote><p>[INTEL_FLASH_DEVICE_INPUT_FILE]<br \/>\nNumber_of_Images=20<\/p>\n<p>[IMAGE_HEADER_0]<br \/>\nStart_Address=0xfa00000<br \/>\nImage_Length=0x80000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=0<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_1]<br \/>\nStart_Address=0xdd40000<br \/>\nImage_Length=0x800000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=0<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_2]<br \/>\nStart_Address=0xeb40000<br \/>\nImage_Length=0x8c0000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=0<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_3]<br \/>\nFilename=NTIM.bin<br \/>\nStart_Address=0x00000000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_4]<br \/>\nFilename=Arbel_NVM_SAC_NOCOMMRTC.bin<br \/>\nStart_Address=0x00140000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_5]<br \/>\nFilename=blob<br \/>\nStart_Address=0x00080000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_6]<br \/>\nStart_Address=0x0bd40000<br \/>\nImage_Length=0x02000000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=0<br \/>\nVerifyWrite=0<br \/>\n[IMAGE_HEADER_7]<br \/>\nFilename=opl.img.yaffs<br \/>\nStart_Address=0x0bd40000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_8]<br \/>\nFilename=ramdisk_len.img<br \/>\nStart_Address=0x00c40000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_9]<br \/>\nFilename=ramdisk-recovery_len.img<br \/>\nStart_Address=0x00cc0000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_10]<br \/>\nStart_Address=0x00d40000<br \/>\nImage_Length=0x08000000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=0<br \/>\nVerifyWrite=0<br \/>\n[IMAGE_HEADER_11]<br \/>\nFilename=system.img.yaffs<br \/>\nStart_Address=0x00d40000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_12]<br \/>\nFilename=TAVOR_LINUX_NTOBM.bin<br \/>\nStart_Address=0x00020000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_13]<br \/>\nFilename=Tavor_M05_Poleg_AI_B0_Flash.bin<br \/>\nStart_Address=0x00840000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_14]<br \/>\nStart_Address=0x08d40000<br \/>\nImage_Length=0x03000000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=0<br \/>\nVerifyWrite=0<br \/>\n[IMAGE_HEADER_15]<br \/>\nFilename=userdata.img.yaffs<br \/>\nStart_Address=0x08d40000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_16]<br \/>\nFilename=zImage<br \/>\nStart_Address=0x00a40000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_17]<br \/>\nFilename=prdcfg.bin<br \/>\nStart_Address=0x00940000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_18]<br \/>\nFilename=precharge_logo.out<br \/>\nStart_Address=0x00a20000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p>\n<p>[IMAGE_HEADER_19]<br \/>\nFilename=logo_pic.gz.out<br \/>\nStart_Address=0x00a00000<br \/>\nEraseBlocks=1<br \/>\nWriteImage=1<br \/>\nVerifyWrite=0<\/p><\/blockquote>\n<p>Lastly, hi to the people at http:\/\/www.allphone.com.cn  \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As I&#8217;ve been reasonably successful in the past at figuring out file systems from flat files, I thought I&#8217;d have a go at the Dell Mini 3i 1.5 Firmware that surfaced at damipan (http:\/\/www.namipan.com\/d\/DELL_MINI3I_OMS1.5.rar\/a5ba3b06ab0bfc9baeb2f09b44f54aa40bac3457ee8ebc04) The rar file unzips to a MFF file. This I&#8217;m probably guessing is probably named after Marvell File Format or Marvell [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[282,25],"tags":[283,284,197,286,285,196,194,287,288],"class_list":["post-593","post","type-post","status-publish","format-standard","hentry","category-firmware-2","category-technical-mumbo-jumbo","tag-borqs","tag-dell","tag-firmware","tag-marvell","tag-mini-3i","tag-mini3i","tag-ophone","tag-pxa935","tag-tavor"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/posts\/593","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/comments?post=593"}],"version-history":[{"count":6,"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/posts\/593\/revisions"}],"predecessor-version":[{"id":595,"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/posts\/593\/revisions\/595"}],"wp:attachment":[{"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/media?parent=593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/categories?post=593"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.computersolutions.cn\/blog\/wp-json\/wp\/v2\/tags?post=593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}