mirror of
				https://mojerepo.cf/NeoBoot/NeoBoot-9.git
				synced 2025-10-31 16:55:46 +01:00 
			
		
		
		
	Add files via upload
This commit is contained in:
		
							
								
								
									
										1506
									
								
								NeoBoot/ubi_reader/argparse_neo.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1506
									
								
								NeoBoot/ubi_reader/argparse_neo.py
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/argparse_neo.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/argparse_neo.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										139
									
								
								NeoBoot/ubi_reader/ubi/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								NeoBoot/ubi_reader/ubi/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,139 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import re | ||||||
|  | from ubi.volume import get_volumes | ||||||
|  | from ubi.block import sort, get_blocks_in_list, extract_blocks | ||||||
|  | from ubi.defines import * | ||||||
|  | from ubi import display | ||||||
|  | from ubi.image import description as image | ||||||
|  | from ubi.block import layout | ||||||
|  |  | ||||||
|  | class ubi: | ||||||
|  |  | ||||||
|  |     def __init__(self, ubi_file): | ||||||
|  |         self._file = ubi_file | ||||||
|  |         self._first_peb_num = 0 | ||||||
|  |         self._blocks = extract_blocks(self) | ||||||
|  |         self._block_count = len(self.blocks) | ||||||
|  |         if self._block_count <= 0: | ||||||
|  |             raise Exception('No blocks found.') | ||||||
|  |         layout_list, data_list, int_vol_list, unknown_list = sort.by_type(self.blocks) | ||||||
|  |         self._layout_blocks_list = layout_list | ||||||
|  |         self._data_blocks_list = data_list | ||||||
|  |         self._int_vol_blocks_list = int_vol_list | ||||||
|  |         self._unknown_blocks_list = unknown_list | ||||||
|  |         arbitrary_block = self.blocks.itervalues().next() | ||||||
|  |         self._min_io_size = arbitrary_block.ec_hdr.vid_hdr_offset | ||||||
|  |         self._leb_size = self.file.block_size - arbitrary_block.ec_hdr.data_offset | ||||||
|  |         layout_pairs = layout.group_pairs(self.blocks, self.layout_blocks_list) | ||||||
|  |         layout_infos = layout.associate_blocks(self.blocks, layout_pairs, self.first_peb_num) | ||||||
|  |         self._images = [] | ||||||
|  |         for i in range(0, len(layout_infos)): | ||||||
|  |             self._images.append(image(self.blocks, layout_infos[i])) | ||||||
|  |  | ||||||
|  |     def _get_file(self): | ||||||
|  |         return self._file | ||||||
|  |  | ||||||
|  |     file = property(_get_file) | ||||||
|  |  | ||||||
|  |     def _get_images(self): | ||||||
|  |         return self._images | ||||||
|  |  | ||||||
|  |     images = property(_get_images) | ||||||
|  |  | ||||||
|  |     def _get_data_blocks_list(self): | ||||||
|  |         return self._data_blocks_list | ||||||
|  |  | ||||||
|  |     data_blocks_list = property(_get_data_blocks_list) | ||||||
|  |  | ||||||
|  |     def _get_layout_blocks_list(self): | ||||||
|  |         return self._layout_blocks_list | ||||||
|  |  | ||||||
|  |     layout_blocks_list = property(_get_layout_blocks_list) | ||||||
|  |  | ||||||
|  |     def _get_int_vol_blocks_list(self): | ||||||
|  |         return self._int_vol_blocks_list | ||||||
|  |  | ||||||
|  |     int_vol_blocks_list = property(_get_int_vol_blocks_list) | ||||||
|  |  | ||||||
|  |     def _get_unknown_blocks_list(self): | ||||||
|  |         return self._unknown_blocks_list | ||||||
|  |  | ||||||
|  |     unknown_blocks_list = property(_get_unknown_blocks_list) | ||||||
|  |  | ||||||
|  |     def _get_block_count(self): | ||||||
|  |         return self._block_count | ||||||
|  |  | ||||||
|  |     block_count = property(_get_block_count) | ||||||
|  |  | ||||||
|  |     def _set_first_peb_num(self, i): | ||||||
|  |         self._first_peb_num = i | ||||||
|  |  | ||||||
|  |     def _get_first_peb_num(self): | ||||||
|  |         return self._first_peb_num | ||||||
|  |  | ||||||
|  |     first_peb_num = property(_get_first_peb_num, _set_first_peb_num) | ||||||
|  |  | ||||||
|  |     def _get_leb_size(self): | ||||||
|  |         return self._leb_size | ||||||
|  |  | ||||||
|  |     leb_size = property(_get_leb_size) | ||||||
|  |  | ||||||
|  |     def _get_peb_size(self): | ||||||
|  |         return self.file.block_size | ||||||
|  |  | ||||||
|  |     peb_size = property(_get_peb_size) | ||||||
|  |  | ||||||
|  |     def _get_min_io_size(self): | ||||||
|  |         return self._min_io_size | ||||||
|  |  | ||||||
|  |     min_io_size = property(_get_min_io_size) | ||||||
|  |  | ||||||
|  |     def _get_blocks(self): | ||||||
|  |         return self._blocks | ||||||
|  |  | ||||||
|  |     blocks = property(_get_blocks) | ||||||
|  |  | ||||||
|  |     def display(self, tab = ''): | ||||||
|  |         display.ubi(self, tab) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_peb_size(path): | ||||||
|  |     file_offset = 0 | ||||||
|  |     offsets = [] | ||||||
|  |     f = open(path, 'rb') | ||||||
|  |     f.seek(0, 2) | ||||||
|  |     file_size = f.tell() + 1 | ||||||
|  |     f.seek(0) | ||||||
|  |     for i in range(0, file_size, FILE_CHUNK_SZ): | ||||||
|  |         buf = f.read(FILE_CHUNK_SZ) | ||||||
|  |         for m in re.finditer(UBI_EC_HDR_MAGIC, buf): | ||||||
|  |             start = m.start() | ||||||
|  |             if not file_offset: | ||||||
|  |                 file_offset = start | ||||||
|  |                 idx = start | ||||||
|  |             else: | ||||||
|  |                 idx = start + file_offset | ||||||
|  |             offsets.append(idx) | ||||||
|  |  | ||||||
|  |         file_offset += FILE_CHUNK_SZ | ||||||
|  |  | ||||||
|  |     f.close() | ||||||
|  |     occurances = {} | ||||||
|  |     for i in range(0, len(offsets)): | ||||||
|  |         try: | ||||||
|  |             diff = offsets[i] - offsets[i - 1] | ||||||
|  |         except: | ||||||
|  |             diff = offsets[i] | ||||||
|  |  | ||||||
|  |         if diff not in occurances: | ||||||
|  |             occurances[diff] = 0 | ||||||
|  |         occurances[diff] += 1 | ||||||
|  |  | ||||||
|  |     most_frequent = 0 | ||||||
|  |     block_size = 0 | ||||||
|  |     for offset in occurances: | ||||||
|  |         if occurances[offset] > most_frequent: | ||||||
|  |             most_frequent = occurances[offset] | ||||||
|  |             block_size = offset | ||||||
|  |  | ||||||
|  |     return block_size | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										59
									
								
								NeoBoot/ubi_reader/ubi/block/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								NeoBoot/ubi_reader/ubi/block/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import re | ||||||
|  | from ubi import display | ||||||
|  | from ubi.defines import * | ||||||
|  | from ubi.headers import * | ||||||
|  |  | ||||||
|  | class description(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, block_buf): | ||||||
|  |         self.file_offset = -1 | ||||||
|  |         self.peb_num = -1 | ||||||
|  |         self.leb_num = -1 | ||||||
|  |         self.size = -1 | ||||||
|  |         self.vid_hdr = None | ||||||
|  |         self.is_internal_vol = False | ||||||
|  |         self.vtbl_recs = [] | ||||||
|  |         self.ec_hdr = extract_ec_hdr(block_buf[0:UBI_EC_HDR_SZ]) | ||||||
|  |         if not self.ec_hdr.errors: | ||||||
|  |             self.vid_hdr = extract_vid_hdr(block_buf[self.ec_hdr.vid_hdr_offset:self.ec_hdr.vid_hdr_offset + UBI_VID_HDR_SZ]) | ||||||
|  |             self.is_internal_vol = self.vid_hdr.vol_id >= UBI_INTERNAL_VOL_START | ||||||
|  |             if self.vid_hdr.vol_id >= UBI_INTERNAL_VOL_START: | ||||||
|  |                 self.vtbl_recs = extract_vtbl_rec(block_buf[self.ec_hdr.data_offset:]) | ||||||
|  |             self.leb_num = self.vid_hdr.lnum | ||||||
|  |         self.is_vtbl = bool(self.vtbl_recs) or False | ||||||
|  |         self.is_valid = not self.ec_hdr.errors and not self.vid_hdr.errors | ||||||
|  |         return | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Block: PEB# %s: LEB# %s' % (self.peb_num, self.leb_num) | ||||||
|  |  | ||||||
|  |     def display(self, tab = ''): | ||||||
|  |         display.block(self, tab) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_blocks_in_list(blocks, idx_list): | ||||||
|  |     return {i:blocks[i] for i in idx_list} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_blocks(ubi): | ||||||
|  |     blocks = {} | ||||||
|  |     start_peb = 0 | ||||||
|  |     ubi.file.seek(ubi.file.start_offset) | ||||||
|  |     peb_count = 0 | ||||||
|  |     cur_offset = 0 | ||||||
|  |     for i in range(ubi.file.start_offset, ubi.file.end_offset, ubi.file.block_size): | ||||||
|  |         buf = ubi.file.read(ubi.file.block_size) | ||||||
|  |         if buf.startswith(UBI_EC_HDR_MAGIC): | ||||||
|  |             blk = description(buf) | ||||||
|  |             blk.file_offset = i | ||||||
|  |             blk.peb_num = ubi.first_peb_num + peb_count | ||||||
|  |             blk.size = ubi.file.block_size | ||||||
|  |             blocks[blk.peb_num] = blk | ||||||
|  |             peb_count += 1 | ||||||
|  |         else: | ||||||
|  |             cur_offset += ubi.file.block_size | ||||||
|  |             ubi.first_peb_num = cur_offset / ubi.file.block_size | ||||||
|  |             ubi.file.start_offset = cur_offset | ||||||
|  |  | ||||||
|  |     return blocks | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/block/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/block/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										23
									
								
								NeoBoot/ubi_reader/ubi/block/layout.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								NeoBoot/ubi_reader/ubi/block/layout.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi.block import sort | ||||||
|  |  | ||||||
|  | def group_pairs(blocks, layout_blocks_list): | ||||||
|  |     layouts_grouped = [[blocks[layout_blocks_list[0]].peb_num]] | ||||||
|  |     for l in layout_blocks_list[1:]: | ||||||
|  |         for lnd in layouts_grouped: | ||||||
|  |             if blocks[l].vtbl_recs[0].name == blocks[lnd[0]].vtbl_recs[0].name: | ||||||
|  |                 lnd.append(blocks[l].peb_num) | ||||||
|  |                 break | ||||||
|  |         else: | ||||||
|  |             layouts_grouped.append([blocks[l].peb_num]) | ||||||
|  |  | ||||||
|  |     return layouts_grouped | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def associate_blocks(blocks, layout_pairs, start_peb_num): | ||||||
|  |     seq_blocks = [] | ||||||
|  |     for layout_pair in layout_pairs: | ||||||
|  |         seq_blocks = sort.by_image_seq(blocks, blocks[layout_pair[0]].ec_hdr.image_seq) | ||||||
|  |         layout_pair.append(seq_blocks) | ||||||
|  |  | ||||||
|  |     return layout_pairs | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/block/layout.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/block/layout.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										84
									
								
								NeoBoot/ubi_reader/ubi/block/sort.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								NeoBoot/ubi_reader/ubi/block/sort.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | def list_by_list(blist, slist): | ||||||
|  |     slist_blocks = [] | ||||||
|  |     for block in blist: | ||||||
|  |         if block in slist: | ||||||
|  |             slist_blocks.append(block) | ||||||
|  |  | ||||||
|  |     return slist_blocks | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_image_seq(blocks, image_seq): | ||||||
|  |     seq_blocks = [] | ||||||
|  |     for block in blocks: | ||||||
|  |         if blocks[block].ec_hdr.image_seq == image_seq: | ||||||
|  |             seq_blocks.append(block) | ||||||
|  |  | ||||||
|  |     return seq_blocks | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_range(blocks, block_range): | ||||||
|  |     peb_range = range(block_range[0], block_range[1]) | ||||||
|  |     return [ i for i in blocks if i in peb_range ] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_leb(blocks): | ||||||
|  |     slist_len = len(blocks) | ||||||
|  |     slist = ['x'] * slist_len | ||||||
|  |     for block in blocks: | ||||||
|  |         if blocks[block].leb_num >= slist_len: | ||||||
|  |             add_elements = blocks[block].leb_num - slist_len + 1 | ||||||
|  |             slist += ['x'] * add_elements | ||||||
|  |             slist_len = len(slist) | ||||||
|  |         slist[blocks[block].leb_num] = block | ||||||
|  |  | ||||||
|  |     return slist | ||||||
|  |     return sorted(blocks.iterkeys(), key=lambda x: blocks[x].leb_num) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_vol_id(blocks, slist = None): | ||||||
|  |     vol_blocks = {} | ||||||
|  |     for i in blocks: | ||||||
|  |         if slist and i not in slist: | ||||||
|  |             continue | ||||||
|  |         elif not blocks[i].is_valid: | ||||||
|  |             continue | ||||||
|  |         if blocks[i].vid_hdr.vol_id not in vol_blocks: | ||||||
|  |             vol_blocks[blocks[i].vid_hdr.vol_id] = [] | ||||||
|  |         vol_blocks[blocks[i].vid_hdr.vol_id].append(blocks[i].peb_num) | ||||||
|  |  | ||||||
|  |     return vol_blocks | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def clean_bad(blocks, slist = None): | ||||||
|  |     clean_blocks = [] | ||||||
|  |     for i in range(0, len(blocks)): | ||||||
|  |         if slist and i not in slist: | ||||||
|  |             continue | ||||||
|  |         if blocks[i].is_valid: | ||||||
|  |             clean_blocks.append(i) | ||||||
|  |  | ||||||
|  |     return clean_blocks | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_type(blocks, slist = None): | ||||||
|  |     layout = [] | ||||||
|  |     data = [] | ||||||
|  |     int_vol = [] | ||||||
|  |     unknown = [] | ||||||
|  |     for i in blocks: | ||||||
|  |         if slist and i not in slist: | ||||||
|  |             continue | ||||||
|  |         if blocks[i].is_vtbl and blocks[i].is_valid: | ||||||
|  |             layout.append(i) | ||||||
|  |         elif blocks[i].is_internal_vol and blocks[i].is_valid: | ||||||
|  |             int_vol.append(i) | ||||||
|  |         elif blocks[i].is_valid: | ||||||
|  |             data.append(i) | ||||||
|  |         else: | ||||||
|  |             unknown.append(i) | ||||||
|  |  | ||||||
|  |     return (layout, | ||||||
|  |      data, | ||||||
|  |      int_vol, | ||||||
|  |      unknown) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/block/sort.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/block/sort.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										63
									
								
								NeoBoot/ubi_reader/ubi/defines.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								NeoBoot/ubi_reader/ubi/defines.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import struct | ||||||
|  | UBI_CRC32_INIT = 4294967295L | ||||||
|  | UBI_MAX_VOLUMES = 128 | ||||||
|  | UBI_INTERNAL_VOL_START = 2147479551 | ||||||
|  | UBI_EC_HDR_MAGIC = 'UBI#' | ||||||
|  | EC_HDR_FORMAT = '>4sB3sQIII32sI' | ||||||
|  | EC_HDR_FIELDS = ['magic', | ||||||
|  |  'version', | ||||||
|  |  'padding', | ||||||
|  |  'ec', | ||||||
|  |  'vid_hdr_offset', | ||||||
|  |  'data_offset', | ||||||
|  |  'image_seq', | ||||||
|  |  'padding2', | ||||||
|  |  'hdr_crc'] | ||||||
|  | UBI_EC_HDR_SZ = struct.calcsize(EC_HDR_FORMAT) | ||||||
|  | UBI_VID_HDR_MAGIC = 'UBI!' | ||||||
|  | VID_HDR_FORMAT = '>4sBBBBII4sIIII4sQ12sI' | ||||||
|  | VID_HDR_FIELDS = ['magic', | ||||||
|  |  'version', | ||||||
|  |  'vol_type', | ||||||
|  |  'copy_flag', | ||||||
|  |  'compat', | ||||||
|  |  'vol_id', | ||||||
|  |  'lnum', | ||||||
|  |  'padding', | ||||||
|  |  'data_size', | ||||||
|  |  'used_ebs', | ||||||
|  |  'data_pad', | ||||||
|  |  'data_crc', | ||||||
|  |  'padding2', | ||||||
|  |  'sqnum', | ||||||
|  |  'padding3', | ||||||
|  |  'hdr_crc'] | ||||||
|  | UBI_VID_HDR_SZ = struct.calcsize(VID_HDR_FORMAT) | ||||||
|  | VTBL_REC_FORMAT = '>IIIBBH128sB23sI' | ||||||
|  | VTBL_REC_FIELDS = ['reserved_pebs', | ||||||
|  |  'alignment', | ||||||
|  |  'data_pad', | ||||||
|  |  'vol_type', | ||||||
|  |  'upd_marker', | ||||||
|  |  'name_len', | ||||||
|  |  'name', | ||||||
|  |  'flags', | ||||||
|  |  'padding', | ||||||
|  |  'crc'] | ||||||
|  | UBI_VTBL_REC_SZ = struct.calcsize(VTBL_REC_FORMAT) | ||||||
|  | UBI_VID_DYNAMIC = 1 | ||||||
|  | UBI_VID_STATIC = 2 | ||||||
|  | PRINT_VOL_TYPE_LIST = [0, 'dynamic', 'static'] | ||||||
|  | UBI_VTBL_AUTORESIZE_FLG = 1 | ||||||
|  | UBI_COMPAT_DELETE = 1 | ||||||
|  | UBI_COMPAT_RO = 2 | ||||||
|  | UBI_COMPAT_PRESERVE = 4 | ||||||
|  | UBI_COMPAT_REJECT = 5 | ||||||
|  | PRINT_COMPAT_LIST = [0, | ||||||
|  |  'Delete', | ||||||
|  |  'Read Only', | ||||||
|  |  0, | ||||||
|  |  'Preserve', | ||||||
|  |  'Reject'] | ||||||
|  | FILE_CHUNK_SZ = 5242880 | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/defines.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/defines.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										108
									
								
								NeoBoot/ubi_reader/ubi/display.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								NeoBoot/ubi_reader/ubi/display.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi.defines import PRINT_COMPAT_LIST, PRINT_VOL_TYPE_LIST, UBI_VTBL_AUTORESIZE_FLG | ||||||
|  |  | ||||||
|  | def ubi(ubi, tab = ''): | ||||||
|  |     print '%sUBI File' % tab | ||||||
|  |     print '%s---------------------' % tab | ||||||
|  |     print '\t%sMin I/O: %s' % (tab, ubi.min_io_size) | ||||||
|  |     print '\t%sLEB Size: %s' % (tab, ubi.leb_size) | ||||||
|  |     print '\t%sPEB Size: %s' % (tab, ubi.peb_size) | ||||||
|  |     print '\t%sTotal Block Count: %s' % (tab, ubi.block_count) | ||||||
|  |     print '\t%sData Block Count: %s' % (tab, len(ubi.data_blocks_list)) | ||||||
|  |     print '\t%sLayout Block Count: %s' % (tab, len(ubi.layout_blocks_list)) | ||||||
|  |     print '\t%sInternal Volume Block Count: %s' % (tab, len(ubi.int_vol_blocks_list)) | ||||||
|  |     print '\t%sUnknown Block Count: %s' % (tab, len(ubi.unknown_blocks_list)) | ||||||
|  |     print '\t%sFirst UBI PEB Number: %s' % (tab, ubi.first_peb_num) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def image(image, tab = ''): | ||||||
|  |     print '%s%s' % (tab, image) | ||||||
|  |     print '%s---------------------' % tab | ||||||
|  |     print '\t%sImage Sequence Num: %s' % (tab, image.image_seq) | ||||||
|  |     for volume in image.volumes: | ||||||
|  |         print '\t%sVolume Name:%s' % (tab, volume) | ||||||
|  |  | ||||||
|  |     print '\t%sPEB Range: %s - %s' % (tab, image.peb_range[0], image.peb_range[1]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def volume(volume, tab = ''): | ||||||
|  |     print '%s%s' % (tab, volume) | ||||||
|  |     print '%s---------------------' % tab | ||||||
|  |     print '\t%sVol ID: %s' % (tab, volume.vol_id) | ||||||
|  |     print '\t%sName: %s' % (tab, volume.name) | ||||||
|  |     print '\t%sBlock Count: %s' % (tab, volume.block_count) | ||||||
|  |     print '\n' | ||||||
|  |     print '\t%sVolume Record' % tab | ||||||
|  |     print '\t%s---------------------' % tab | ||||||
|  |     vol_rec(volume.vol_rec, '\t\t%s' % tab) | ||||||
|  |     print '\n' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def block(block, tab = '\t'): | ||||||
|  |     print '%s%s' % (tab, block) | ||||||
|  |     print '%s---------------------' % tab | ||||||
|  |     print '\t%sFile Offset: %s' % (tab, block.file_offset) | ||||||
|  |     print '\t%sPEB #: %s' % (tab, block.peb_num) | ||||||
|  |     print '\t%sLEB #: %s' % (tab, block.leb_num) | ||||||
|  |     print '\t%sBlock Size: %s' % (tab, block.size) | ||||||
|  |     print '\t%sInternal Volume: %s' % (tab, block.is_internal_vol) | ||||||
|  |     print '\t%sIs Volume Table: %s' % (tab, block.is_vtbl) | ||||||
|  |     print '\t%sIs Valid: %s' % (tab, block.is_valid) | ||||||
|  |     if not block.ec_hdr.errors: | ||||||
|  |         print '\n' | ||||||
|  |         print '\t%sErase Count Header' % tab | ||||||
|  |         print '\t%s---------------------' % tab | ||||||
|  |         ec_hdr(block.ec_hdr, '\t\t%s' % tab) | ||||||
|  |     if block.vid_hdr and not block.vid_hdr.errors: | ||||||
|  |         print '\n' | ||||||
|  |         print '\t%sVID Header Header' % tab | ||||||
|  |         print '\t%s---------------------' % tab | ||||||
|  |         vid_hdr(block.vid_hdr, '\t\t%s' % tab) | ||||||
|  |     if block.vtbl_recs: | ||||||
|  |         print '\n' | ||||||
|  |         print '\t%sVolume Records' % tab | ||||||
|  |         print '\t%s---------------------' % tab | ||||||
|  |         for vol in block.vtbl_recs: | ||||||
|  |             vol_rec(vol, '\t\t%s' % tab) | ||||||
|  |  | ||||||
|  |     print '\n' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def ec_hdr(ec_hdr, tab = ''): | ||||||
|  |     for key, value in ec_hdr: | ||||||
|  |         if key == 'errors': | ||||||
|  |             value = ','.join(value) | ||||||
|  |         print '%s%s: %r' % (tab, key, value) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def vid_hdr(vid_hdr, tab = ''): | ||||||
|  |     for key, value in vid_hdr: | ||||||
|  |         if key == 'errors': | ||||||
|  |             value = ','.join(value) | ||||||
|  |         elif key == 'compat': | ||||||
|  |             if value in PRINT_COMPAT_LIST: | ||||||
|  |                 value = PRINT_COMPAT_LIST[value] | ||||||
|  |             else: | ||||||
|  |                 value = -1 | ||||||
|  |         elif key == 'vol_type': | ||||||
|  |             if value < len(PRINT_VOL_TYPE_LIST): | ||||||
|  |                 value = PRINT_VOL_TYPE_LIST[value] | ||||||
|  |             else: | ||||||
|  |                 value = -1 | ||||||
|  |         print '%s%s: %s' % (tab, key, value) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def vol_rec(vol_rec, tab = ''): | ||||||
|  |     for key, value in vol_rec: | ||||||
|  |         if key == 'errors': | ||||||
|  |             value = ','.join(value) | ||||||
|  |         elif key == 'vol_type': | ||||||
|  |             if value < len(PRINT_VOL_TYPE_LIST): | ||||||
|  |                 value = PRINT_VOL_TYPE_LIST[value] | ||||||
|  |             else: | ||||||
|  |                 value = -1 | ||||||
|  |         elif key == 'flags' and value == UBI_VTBL_AUTORESIZE_FLG: | ||||||
|  |             value = 'autoresize' | ||||||
|  |         elif key == 'name': | ||||||
|  |             value = value.strip('\x00') | ||||||
|  |         print '%s%s: %s' % (tab, key, value) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/display.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/display.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										89
									
								
								NeoBoot/ubi_reader/ubi/headers/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								NeoBoot/ubi_reader/ubi/headers/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import struct | ||||||
|  | from ubi.defines import * | ||||||
|  | from ubi.headers import errors | ||||||
|  |  | ||||||
|  | class ec_hdr(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(EC_HDR_FIELDS, struct.unpack(EC_HDR_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'errors', []) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Error Count Header' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class vid_hdr(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(VID_HDR_FIELDS, struct.unpack(VID_HDR_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'errors', []) | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'VID Header' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class vtbl_rec(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(VTBL_REC_FIELDS, struct.unpack(VTBL_REC_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'errors', []) | ||||||
|  |         setattr(self, 'rec_index', -1) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Volume Table Record: %s' % getattr(self, 'name') | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_ec_hdr(buf): | ||||||
|  |     ec_hdr_buf = buf | ||||||
|  |     ec_hdr_ret = ec_hdr(ec_hdr_buf) | ||||||
|  |     errors.ec_hdr(ec_hdr_ret, ec_hdr_buf) | ||||||
|  |     return ec_hdr_ret | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_vid_hdr(buf): | ||||||
|  |     vid_hdr_buf = buf | ||||||
|  |     vid_hdr_ret = vid_hdr(vid_hdr_buf) | ||||||
|  |     errors.vid_hdr(vid_hdr_ret, vid_hdr_buf) | ||||||
|  |     return vid_hdr_ret | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_vtbl_rec(buf): | ||||||
|  |     data_buf = buf | ||||||
|  |     vtbl_recs = [] | ||||||
|  |     vtbl_rec_ret = '' | ||||||
|  |     for i in range(0, UBI_MAX_VOLUMES): | ||||||
|  |         offset = i * UBI_VTBL_REC_SZ | ||||||
|  |         vtbl_rec_buf = data_buf[offset:offset + UBI_VTBL_REC_SZ] | ||||||
|  |         if len(vtbl_rec_buf) == UBI_VTBL_REC_SZ: | ||||||
|  |             vtbl_rec_ret = vtbl_rec(vtbl_rec_buf) | ||||||
|  |             errors.vtbl_rec(vtbl_rec_ret, vtbl_rec_buf) | ||||||
|  |             if len(vtbl_rec_ret.errors) == 0: | ||||||
|  |                 vtbl_rec_ret.rec_index = i | ||||||
|  |                 vtbl_recs.append(vtbl_rec_ret) | ||||||
|  |  | ||||||
|  |     return vtbl_recs | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/headers/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/headers/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										28
									
								
								NeoBoot/ubi_reader/ubi/headers/errors.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								NeoBoot/ubi_reader/ubi/headers/errors.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from zlib import crc32 | ||||||
|  | from ubi.defines import * | ||||||
|  |  | ||||||
|  | def ec_hdr(ec_hdr, buf): | ||||||
|  |     if ec_hdr.hdr_crc != ~crc32(buf[:-4]) & 4294967295L: | ||||||
|  |         ec_hdr.errors.append('crc') | ||||||
|  |     return ec_hdr | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def vid_hdr(vid_hdr, buf): | ||||||
|  |     vid_hdr.errors = [] | ||||||
|  |     if vid_hdr.hdr_crc != ~crc32(buf[:-4]) & 4294967295L: | ||||||
|  |         vid_hdr.errors.append('crc') | ||||||
|  |     return vid_hdr | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def vtbl_rec(vtbl_rec, buf): | ||||||
|  |     likely_vtbl = True | ||||||
|  |     if vtbl_rec.name_len != len(vtbl_rec.name.strip('\x00')): | ||||||
|  |         likely_vtbl = False | ||||||
|  |     elif vtbl_rec.vol_type not in (1, 2): | ||||||
|  |         likely_vtbl = False | ||||||
|  |     if vtbl_rec.crc != ~crc32(buf[:-4]) & 4294967295L: | ||||||
|  |         vtbl_rec.errors.append('crc') | ||||||
|  |     if not likely_vtbl: | ||||||
|  |         vtbl_rec.errors = ['False'] | ||||||
|  |     return vtbl_rec | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/headers/errors.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/headers/errors.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										38
									
								
								NeoBoot/ubi_reader/ubi/image.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								NeoBoot/ubi_reader/ubi/image.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi import display | ||||||
|  | from ubi.volume import get_volumes | ||||||
|  | from ubi.block import get_blocks_in_list | ||||||
|  |  | ||||||
|  | class description(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, blocks, layout_info): | ||||||
|  |         self._image_seq = blocks[layout_info[0]].ec_hdr.image_seq | ||||||
|  |         self.vid_hdr_offset = blocks[layout_info[0]].ec_hdr.vid_hdr_offset | ||||||
|  |         self.version = blocks[layout_info[0]].ec_hdr.version | ||||||
|  |         self._start_peb = min(layout_info[2]) | ||||||
|  |         self._end_peb = max(layout_info[2]) | ||||||
|  |         self._volumes = get_volumes(blocks, layout_info) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Image: %s' % self.image_seq | ||||||
|  |  | ||||||
|  |     def get_blocks(self, blocks): | ||||||
|  |         return get_blocks_in_list(blocks, range(self._start_peb, self._end_peb + 1)) | ||||||
|  |  | ||||||
|  |     def _get_peb_range(self): | ||||||
|  |         return [self._start_peb, self._end_peb] | ||||||
|  |  | ||||||
|  |     peb_range = property(_get_peb_range) | ||||||
|  |  | ||||||
|  |     def _get_image_seq(self): | ||||||
|  |         return self._image_seq | ||||||
|  |  | ||||||
|  |     image_seq = property(_get_image_seq) | ||||||
|  |  | ||||||
|  |     def _get_volumes(self): | ||||||
|  |         return self._volumes | ||||||
|  |  | ||||||
|  |     volumes = property(_get_volumes) | ||||||
|  |  | ||||||
|  |     def display(self, tab = ''): | ||||||
|  |         display.image(self, tab) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/image.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/image.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										67
									
								
								NeoBoot/ubi_reader/ubi/volume/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								NeoBoot/ubi_reader/ubi/volume/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi import display | ||||||
|  | from ubi.block import sort, get_blocks_in_list | ||||||
|  |  | ||||||
|  | class description(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, vol_id, vol_rec, block_list): | ||||||
|  |         self._vol_id = vol_id | ||||||
|  |         self._vol_rec = vol_rec | ||||||
|  |         self._name = self._vol_rec.name | ||||||
|  |         self._block_list = block_list | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Volume: %s' % self.name | ||||||
|  |  | ||||||
|  |     def _get_name(self): | ||||||
|  |         return self._name | ||||||
|  |  | ||||||
|  |     name = property(_get_name) | ||||||
|  |  | ||||||
|  |     def _get_vol_id(self): | ||||||
|  |         return self._vol_id | ||||||
|  |  | ||||||
|  |     vol_id = property(_get_vol_id) | ||||||
|  |  | ||||||
|  |     def _get_block_count(self): | ||||||
|  |         return len(self._block_list) | ||||||
|  |  | ||||||
|  |     block_count = property(_get_block_count) | ||||||
|  |  | ||||||
|  |     def _get_vol_rec(self): | ||||||
|  |         return self._vol_rec | ||||||
|  |  | ||||||
|  |     vol_rec = property(_get_vol_rec) | ||||||
|  |  | ||||||
|  |     def _get_block_list(self): | ||||||
|  |         return self._block_list | ||||||
|  |  | ||||||
|  |     block_list = property(_get_block_list) | ||||||
|  |  | ||||||
|  |     def get_blocks(self, blocks): | ||||||
|  |         return get_blocks_in_list(blocks, self._block_list) | ||||||
|  |  | ||||||
|  |     def display(self, tab = ''): | ||||||
|  |         display.volume(self, tab) | ||||||
|  |  | ||||||
|  |     def reader(self, ubi): | ||||||
|  |         last_leb = 0 | ||||||
|  |         for block in sort.by_leb(self.get_blocks(ubi.blocks)): | ||||||
|  |             if block == 'x': | ||||||
|  |                 last_leb += 1 | ||||||
|  |                 yield '\xff' * ubi.leb_size | ||||||
|  |             else: | ||||||
|  |                 last_leb += 1 | ||||||
|  |                 yield ubi.file.read_block_data(ubi.blocks[block]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_volumes(blocks, layout_info): | ||||||
|  |     volumes = {} | ||||||
|  |     vol_blocks_lists = sort.by_vol_id(blocks, layout_info[2]) | ||||||
|  |     for vol_rec in blocks[layout_info[0]].vtbl_recs: | ||||||
|  |         vol_name = vol_rec.name.strip('\x00') | ||||||
|  |         if vol_rec.rec_index not in vol_blocks_lists: | ||||||
|  |             vol_blocks_lists[vol_rec.rec_index] = [] | ||||||
|  |         volumes[vol_name] = description(vol_rec.rec_index, vol_rec, vol_blocks_lists[vol_rec.rec_index]) | ||||||
|  |  | ||||||
|  |     return volumes | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/volume/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi/volume/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										65
									
								
								NeoBoot/ubi_reader/ubi_extract_files.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								NeoBoot/ubi_reader/ubi_extract_files.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | import os | ||||||
|  | import sys | ||||||
|  | import argparse_neo | ||||||
|  | from ubi import ubi, get_peb_size | ||||||
|  | from ubifs import ubifs | ||||||
|  | from ubi_io import ubi_file, leb_virtual_file | ||||||
|  | from ui.common import extract_files, output_dir | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     os.system('echo "\n[NeoBoot] Zip file unzipped.\nInstallation in progress, please wait ..."') | ||||||
|  |     description = 'Extract contents of UBI image.' | ||||||
|  |     usage = 'ubi_extract_files.py [options] filepath' | ||||||
|  |     parser = argparse_neo.ArgumentParser(usage=usage, description=description) | ||||||
|  |     parser.add_argument('-l', '--log-file', dest='logpath', help='Log output to file output/LOGPATH. (default: ubifs_output.log)') | ||||||
|  |     parser.add_argument('-k', '--keep-permissions', action='store_true', dest='permissions', help='Maintain file permissions, requires running as root. (default: False)') | ||||||
|  |     parser.add_argument('-q', '--quiet', action='store_true', dest='quiet', help='Suppress warnings and non-fatal errors. (default: False)') | ||||||
|  |     parser.add_argument('-p', '--peb-size', type=int, dest='block_size', help='Specify PEB size.') | ||||||
|  |     parser.add_argument('-o', '--output-dir', dest='output_path', help='Specify output directory path.') | ||||||
|  |     parser.add_argument('filepath', help='File to extract contents of.') | ||||||
|  |     if len(sys.argv) == 1: | ||||||
|  |         parser.print_help() | ||||||
|  |         sys.exit() | ||||||
|  |     args = parser.parse_args() | ||||||
|  |     if args.filepath: | ||||||
|  |         path = args.filepath | ||||||
|  |         if not os.path.exists(path): | ||||||
|  |             parser.error("File path doesn't exist.") | ||||||
|  |     if args.output_path: | ||||||
|  |         output_path = args.output_path | ||||||
|  |     else: | ||||||
|  |         img_name = os.path.splitext(os.path.basename(path))[0] | ||||||
|  |         output_path = os.path.join(output_dir, img_name) | ||||||
|  |     if args.logpath: | ||||||
|  |         log_to_file = True | ||||||
|  |         log_file = args.logpath | ||||||
|  |     else: | ||||||
|  |         log_to_file = None | ||||||
|  |         log_file = None | ||||||
|  |     if args.block_size: | ||||||
|  |         block_size = args.block_size | ||||||
|  |     else: | ||||||
|  |         block_size = get_peb_size(path) | ||||||
|  |     perms = args.permissions | ||||||
|  |     quiet = args.quiet | ||||||
|  |     if not os.path.exists(output_path): | ||||||
|  |         os.makedirs(output_path) | ||||||
|  |     ufile = ubi_file(path, block_size) | ||||||
|  |     uubi = ubi(ufile) | ||||||
|  |     for image in uubi.images: | ||||||
|  |         for volume in image.volumes: | ||||||
|  |             vol_out_path = os.path.join(output_path, volume) | ||||||
|  |             if not os.path.exists(vol_out_path): | ||||||
|  |                 os.makedirs(vol_out_path) | ||||||
|  |             elif os.listdir(vol_out_path): | ||||||
|  |                 parser.error('Volume output directory is not empty. %s' % vol_out_path) | ||||||
|  |             ufsfile = leb_virtual_file(uubi, image.volumes[volume]) | ||||||
|  |             uubifs = ubifs(ufsfile) | ||||||
|  |             uubifs.log.log_file = log_file | ||||||
|  |             uubifs.log.log_to_file = log_to_file | ||||||
|  |             uubifs.log.quiet = quiet | ||||||
|  |             print 'Wait almost over ...\nLoading the image to: %s' % vol_out_path | ||||||
|  |             extract_files(uubifs, vol_out_path, perms) | ||||||
|  |  | ||||||
|  |     sys.exit(0) | ||||||
							
								
								
									
										116
									
								
								NeoBoot/ubi_reader/ubi_io/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								NeoBoot/ubi_reader/ubi_io/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi.block import sort | ||||||
|  |  | ||||||
|  | class ubi_file(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, path, block_size, start_offset = 0, end_offset = None): | ||||||
|  |         self._fhandle = open(path, 'rb') | ||||||
|  |         self._start_offset = start_offset | ||||||
|  |         if end_offset: | ||||||
|  |             self._end_offset = end_offset | ||||||
|  |         else: | ||||||
|  |             self._fhandle.seek(0, 2) | ||||||
|  |             self._end_offset = self.tell() | ||||||
|  |         self._block_size = block_size | ||||||
|  |         if start_offset >= self._end_offset: | ||||||
|  |             raise Exception('Start offset larger than file size!') | ||||||
|  |         self._fhandle.seek(self._start_offset) | ||||||
|  |  | ||||||
|  |     def _set_start(self, i): | ||||||
|  |         self._start_offset = i | ||||||
|  |  | ||||||
|  |     def _get_start(self): | ||||||
|  |         return self._start_offset | ||||||
|  |  | ||||||
|  |     start_offset = property(_get_start, _set_start) | ||||||
|  |  | ||||||
|  |     def _get_end(self): | ||||||
|  |         return self._end_offset | ||||||
|  |  | ||||||
|  |     end_offset = property(_get_end) | ||||||
|  |  | ||||||
|  |     def _get_block_size(self): | ||||||
|  |         return self._block_size | ||||||
|  |  | ||||||
|  |     block_size = property(_get_block_size) | ||||||
|  |  | ||||||
|  |     def seek(self, offset): | ||||||
|  |         self._fhandle.seek(offset) | ||||||
|  |  | ||||||
|  |     def read(self, size): | ||||||
|  |         return self._fhandle.read(size) | ||||||
|  |  | ||||||
|  |     def tell(self): | ||||||
|  |         return self._fhandle.tell() | ||||||
|  |  | ||||||
|  |     def reset(self): | ||||||
|  |         self._fhandle.seek(self.start_offset) | ||||||
|  |  | ||||||
|  |     def reader(self): | ||||||
|  |         self.reset() | ||||||
|  |         while True: | ||||||
|  |             cur_loc = self._fhandle.tell() | ||||||
|  |             if self.end_offset and cur_loc > self.end_offset: | ||||||
|  |                 break | ||||||
|  |             elif self.end_offset and self.end_offset - cur_loc < self.block_size: | ||||||
|  |                 chunk_size = self.end_offset - cur_loc | ||||||
|  |             else: | ||||||
|  |                 chunk_size = self.block_size | ||||||
|  |             buf = self.read(chunk_size) | ||||||
|  |             if not buf: | ||||||
|  |                 break | ||||||
|  |             yield buf | ||||||
|  |  | ||||||
|  |     def read_block(self, block): | ||||||
|  |         self.seek(block.file_offset) | ||||||
|  |         return self._fhandle.read(block.size) | ||||||
|  |  | ||||||
|  |     def read_block_data(self, block): | ||||||
|  |         self.seek(block.file_offset + block.ec_hdr.data_offset) | ||||||
|  |         buf = self._fhandle.read(block.size - block.ec_hdr.data_offset - block.vid_hdr.data_pad) | ||||||
|  |         return buf | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class leb_virtual_file: | ||||||
|  |  | ||||||
|  |     def __init__(self, ubi, volume): | ||||||
|  |         self._ubi = ubi | ||||||
|  |         self._volume = volume | ||||||
|  |         self._blocks = sort.by_leb(self._volume.get_blocks(self._ubi.blocks)) | ||||||
|  |         self._seek = 0 | ||||||
|  |         self.leb_data_size = len(self._blocks) * self._ubi.leb_size | ||||||
|  |         self._last_leb = -1 | ||||||
|  |         self._last_buf = '' | ||||||
|  |  | ||||||
|  |     def read(self, i): | ||||||
|  |         buf = '' | ||||||
|  |         leb = int(self.tell() / self._ubi.leb_size) | ||||||
|  |         offset = self.tell() % self._ubi.leb_size | ||||||
|  |         if leb == self._last_leb: | ||||||
|  |             self.seek(self.tell() + i) | ||||||
|  |             return self._last_buf[offset:offset + i] | ||||||
|  |         else: | ||||||
|  |             buf = self._ubi.file.read_block_data(self._ubi.blocks[self._blocks[leb]]) | ||||||
|  |             self._last_buf = buf | ||||||
|  |             self._last_leb = leb | ||||||
|  |             self.seek(self.tell() + i) | ||||||
|  |             return buf[offset:offset + i] | ||||||
|  |  | ||||||
|  |     def reset(self): | ||||||
|  |         self.seek(0) | ||||||
|  |  | ||||||
|  |     def seek(self, offset): | ||||||
|  |         self._seek = offset | ||||||
|  |  | ||||||
|  |     def tell(self): | ||||||
|  |         return self._seek | ||||||
|  |  | ||||||
|  |     def reader(self): | ||||||
|  |         last_leb = 0 | ||||||
|  |         for block in self._blocks: | ||||||
|  |             while 0 != self._ubi.blocks[block].leb_num - last_leb: | ||||||
|  |                 last_leb += 1 | ||||||
|  |                 yield '\xff' * self._ubi.leb_size | ||||||
|  |  | ||||||
|  |             last_leb += 1 | ||||||
|  |             yield self._ubi.file.read_block_data(self._ubi.blocks[block]) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_io/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_io/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										1506
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/argparse_neo.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1506
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/argparse_neo.py
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/argparse_neo.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/argparse_neo.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										139
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,139 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import re | ||||||
|  | from ubi.volume import get_volumes | ||||||
|  | from ubi.block import sort, get_blocks_in_list, extract_blocks | ||||||
|  | from ubi.defines import * | ||||||
|  | from ubi import display | ||||||
|  | from ubi.image import description as image | ||||||
|  | from ubi.block import layout | ||||||
|  |  | ||||||
|  | class ubi: | ||||||
|  |  | ||||||
|  |     def __init__(self, ubi_file): | ||||||
|  |         self._file = ubi_file | ||||||
|  |         self._first_peb_num = 0 | ||||||
|  |         self._blocks = extract_blocks(self) | ||||||
|  |         self._block_count = len(self.blocks) | ||||||
|  |         if self._block_count <= 0: | ||||||
|  |             raise Exception('No blocks found.') | ||||||
|  |         layout_list, data_list, int_vol_list, unknown_list = sort.by_type(self.blocks) | ||||||
|  |         self._layout_blocks_list = layout_list | ||||||
|  |         self._data_blocks_list = data_list | ||||||
|  |         self._int_vol_blocks_list = int_vol_list | ||||||
|  |         self._unknown_blocks_list = unknown_list | ||||||
|  |         arbitrary_block = self.blocks.itervalues().next() | ||||||
|  |         self._min_io_size = arbitrary_block.ec_hdr.vid_hdr_offset | ||||||
|  |         self._leb_size = self.file.block_size - arbitrary_block.ec_hdr.data_offset | ||||||
|  |         layout_pairs = layout.group_pairs(self.blocks, self.layout_blocks_list) | ||||||
|  |         layout_infos = layout.associate_blocks(self.blocks, layout_pairs, self.first_peb_num) | ||||||
|  |         self._images = [] | ||||||
|  |         for i in range(0, len(layout_infos)): | ||||||
|  |             self._images.append(image(self.blocks, layout_infos[i])) | ||||||
|  |  | ||||||
|  |     def _get_file(self): | ||||||
|  |         return self._file | ||||||
|  |  | ||||||
|  |     file = property(_get_file) | ||||||
|  |  | ||||||
|  |     def _get_images(self): | ||||||
|  |         return self._images | ||||||
|  |  | ||||||
|  |     images = property(_get_images) | ||||||
|  |  | ||||||
|  |     def _get_data_blocks_list(self): | ||||||
|  |         return self._data_blocks_list | ||||||
|  |  | ||||||
|  |     data_blocks_list = property(_get_data_blocks_list) | ||||||
|  |  | ||||||
|  |     def _get_layout_blocks_list(self): | ||||||
|  |         return self._layout_blocks_list | ||||||
|  |  | ||||||
|  |     layout_blocks_list = property(_get_layout_blocks_list) | ||||||
|  |  | ||||||
|  |     def _get_int_vol_blocks_list(self): | ||||||
|  |         return self._int_vol_blocks_list | ||||||
|  |  | ||||||
|  |     int_vol_blocks_list = property(_get_int_vol_blocks_list) | ||||||
|  |  | ||||||
|  |     def _get_unknown_blocks_list(self): | ||||||
|  |         return self._unknown_blocks_list | ||||||
|  |  | ||||||
|  |     unknown_blocks_list = property(_get_unknown_blocks_list) | ||||||
|  |  | ||||||
|  |     def _get_block_count(self): | ||||||
|  |         return self._block_count | ||||||
|  |  | ||||||
|  |     block_count = property(_get_block_count) | ||||||
|  |  | ||||||
|  |     def _set_first_peb_num(self, i): | ||||||
|  |         self._first_peb_num = i | ||||||
|  |  | ||||||
|  |     def _get_first_peb_num(self): | ||||||
|  |         return self._first_peb_num | ||||||
|  |  | ||||||
|  |     first_peb_num = property(_get_first_peb_num, _set_first_peb_num) | ||||||
|  |  | ||||||
|  |     def _get_leb_size(self): | ||||||
|  |         return self._leb_size | ||||||
|  |  | ||||||
|  |     leb_size = property(_get_leb_size) | ||||||
|  |  | ||||||
|  |     def _get_peb_size(self): | ||||||
|  |         return self.file.block_size | ||||||
|  |  | ||||||
|  |     peb_size = property(_get_peb_size) | ||||||
|  |  | ||||||
|  |     def _get_min_io_size(self): | ||||||
|  |         return self._min_io_size | ||||||
|  |  | ||||||
|  |     min_io_size = property(_get_min_io_size) | ||||||
|  |  | ||||||
|  |     def _get_blocks(self): | ||||||
|  |         return self._blocks | ||||||
|  |  | ||||||
|  |     blocks = property(_get_blocks) | ||||||
|  |  | ||||||
|  |     def display(self, tab = ''): | ||||||
|  |         display.ubi(self, tab) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_peb_size(path): | ||||||
|  |     file_offset = 0 | ||||||
|  |     offsets = [] | ||||||
|  |     f = open(path, 'rb') | ||||||
|  |     f.seek(0, 2) | ||||||
|  |     file_size = f.tell() + 1 | ||||||
|  |     f.seek(0) | ||||||
|  |     for i in range(0, file_size, FILE_CHUNK_SZ): | ||||||
|  |         buf = f.read(FILE_CHUNK_SZ) | ||||||
|  |         for m in re.finditer(UBI_EC_HDR_MAGIC, buf): | ||||||
|  |             start = m.start() | ||||||
|  |             if not file_offset: | ||||||
|  |                 file_offset = start | ||||||
|  |                 idx = start | ||||||
|  |             else: | ||||||
|  |                 idx = start + file_offset | ||||||
|  |             offsets.append(idx) | ||||||
|  |  | ||||||
|  |         file_offset += FILE_CHUNK_SZ | ||||||
|  |  | ||||||
|  |     f.close() | ||||||
|  |     occurances = {} | ||||||
|  |     for i in range(0, len(offsets)): | ||||||
|  |         try: | ||||||
|  |             diff = offsets[i] - offsets[i - 1] | ||||||
|  |         except: | ||||||
|  |             diff = offsets[i] | ||||||
|  |  | ||||||
|  |         if diff not in occurances: | ||||||
|  |             occurances[diff] = 0 | ||||||
|  |         occurances[diff] += 1 | ||||||
|  |  | ||||||
|  |     most_frequent = 0 | ||||||
|  |     block_size = 0 | ||||||
|  |     for offset in occurances: | ||||||
|  |         if occurances[offset] > most_frequent: | ||||||
|  |             most_frequent = occurances[offset] | ||||||
|  |             block_size = offset | ||||||
|  |  | ||||||
|  |     return block_size | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										59
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import re | ||||||
|  | from ubi import display | ||||||
|  | from ubi.defines import * | ||||||
|  | from ubi.headers import * | ||||||
|  |  | ||||||
|  | class description(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, block_buf): | ||||||
|  |         self.file_offset = -1 | ||||||
|  |         self.peb_num = -1 | ||||||
|  |         self.leb_num = -1 | ||||||
|  |         self.size = -1 | ||||||
|  |         self.vid_hdr = None | ||||||
|  |         self.is_internal_vol = False | ||||||
|  |         self.vtbl_recs = [] | ||||||
|  |         self.ec_hdr = extract_ec_hdr(block_buf[0:UBI_EC_HDR_SZ]) | ||||||
|  |         if not self.ec_hdr.errors: | ||||||
|  |             self.vid_hdr = extract_vid_hdr(block_buf[self.ec_hdr.vid_hdr_offset:self.ec_hdr.vid_hdr_offset + UBI_VID_HDR_SZ]) | ||||||
|  |             self.is_internal_vol = self.vid_hdr.vol_id >= UBI_INTERNAL_VOL_START | ||||||
|  |             if self.vid_hdr.vol_id >= UBI_INTERNAL_VOL_START: | ||||||
|  |                 self.vtbl_recs = extract_vtbl_rec(block_buf[self.ec_hdr.data_offset:]) | ||||||
|  |             self.leb_num = self.vid_hdr.lnum | ||||||
|  |         self.is_vtbl = bool(self.vtbl_recs) or False | ||||||
|  |         self.is_valid = not self.ec_hdr.errors and not self.vid_hdr.errors | ||||||
|  |         return | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Block: PEB# %s: LEB# %s' % (self.peb_num, self.leb_num) | ||||||
|  |  | ||||||
|  |     def display(self, tab = ''): | ||||||
|  |         display.block(self, tab) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_blocks_in_list(blocks, idx_list): | ||||||
|  |     return {i:blocks[i] for i in idx_list} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_blocks(ubi): | ||||||
|  |     blocks = {} | ||||||
|  |     start_peb = 0 | ||||||
|  |     ubi.file.seek(ubi.file.start_offset) | ||||||
|  |     peb_count = 0 | ||||||
|  |     cur_offset = 0 | ||||||
|  |     for i in range(ubi.file.start_offset, ubi.file.end_offset, ubi.file.block_size): | ||||||
|  |         buf = ubi.file.read(ubi.file.block_size) | ||||||
|  |         if buf.startswith(UBI_EC_HDR_MAGIC): | ||||||
|  |             blk = description(buf) | ||||||
|  |             blk.file_offset = i | ||||||
|  |             blk.peb_num = ubi.first_peb_num + peb_count | ||||||
|  |             blk.size = ubi.file.block_size | ||||||
|  |             blocks[blk.peb_num] = blk | ||||||
|  |             peb_count += 1 | ||||||
|  |         else: | ||||||
|  |             cur_offset += ubi.file.block_size | ||||||
|  |             ubi.first_peb_num = cur_offset / ubi.file.block_size | ||||||
|  |             ubi.file.start_offset = cur_offset | ||||||
|  |  | ||||||
|  |     return blocks | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										23
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/layout.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/layout.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi.block import sort | ||||||
|  |  | ||||||
|  | def group_pairs(blocks, layout_blocks_list): | ||||||
|  |     layouts_grouped = [[blocks[layout_blocks_list[0]].peb_num]] | ||||||
|  |     for l in layout_blocks_list[1:]: | ||||||
|  |         for lnd in layouts_grouped: | ||||||
|  |             if blocks[l].vtbl_recs[0].name == blocks[lnd[0]].vtbl_recs[0].name: | ||||||
|  |                 lnd.append(blocks[l].peb_num) | ||||||
|  |                 break | ||||||
|  |         else: | ||||||
|  |             layouts_grouped.append([blocks[l].peb_num]) | ||||||
|  |  | ||||||
|  |     return layouts_grouped | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def associate_blocks(blocks, layout_pairs, start_peb_num): | ||||||
|  |     seq_blocks = [] | ||||||
|  |     for layout_pair in layout_pairs: | ||||||
|  |         seq_blocks = sort.by_image_seq(blocks, blocks[layout_pair[0]].ec_hdr.image_seq) | ||||||
|  |         layout_pair.append(seq_blocks) | ||||||
|  |  | ||||||
|  |     return layout_pairs | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/layout.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/layout.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										84
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/sort.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/sort.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | def list_by_list(blist, slist): | ||||||
|  |     slist_blocks = [] | ||||||
|  |     for block in blist: | ||||||
|  |         if block in slist: | ||||||
|  |             slist_blocks.append(block) | ||||||
|  |  | ||||||
|  |     return slist_blocks | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_image_seq(blocks, image_seq): | ||||||
|  |     seq_blocks = [] | ||||||
|  |     for block in blocks: | ||||||
|  |         if blocks[block].ec_hdr.image_seq == image_seq: | ||||||
|  |             seq_blocks.append(block) | ||||||
|  |  | ||||||
|  |     return seq_blocks | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_range(blocks, block_range): | ||||||
|  |     peb_range = range(block_range[0], block_range[1]) | ||||||
|  |     return [ i for i in blocks if i in peb_range ] | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_leb(blocks): | ||||||
|  |     slist_len = len(blocks) | ||||||
|  |     slist = ['x'] * slist_len | ||||||
|  |     for block in blocks: | ||||||
|  |         if blocks[block].leb_num >= slist_len: | ||||||
|  |             add_elements = blocks[block].leb_num - slist_len + 1 | ||||||
|  |             slist += ['x'] * add_elements | ||||||
|  |             slist_len = len(slist) | ||||||
|  |         slist[blocks[block].leb_num] = block | ||||||
|  |  | ||||||
|  |     return slist | ||||||
|  |     return sorted(blocks.iterkeys(), key=lambda x: blocks[x].leb_num) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_vol_id(blocks, slist = None): | ||||||
|  |     vol_blocks = {} | ||||||
|  |     for i in blocks: | ||||||
|  |         if slist and i not in slist: | ||||||
|  |             continue | ||||||
|  |         elif not blocks[i].is_valid: | ||||||
|  |             continue | ||||||
|  |         if blocks[i].vid_hdr.vol_id not in vol_blocks: | ||||||
|  |             vol_blocks[blocks[i].vid_hdr.vol_id] = [] | ||||||
|  |         vol_blocks[blocks[i].vid_hdr.vol_id].append(blocks[i].peb_num) | ||||||
|  |  | ||||||
|  |     return vol_blocks | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def clean_bad(blocks, slist = None): | ||||||
|  |     clean_blocks = [] | ||||||
|  |     for i in range(0, len(blocks)): | ||||||
|  |         if slist and i not in slist: | ||||||
|  |             continue | ||||||
|  |         if blocks[i].is_valid: | ||||||
|  |             clean_blocks.append(i) | ||||||
|  |  | ||||||
|  |     return clean_blocks | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def by_type(blocks, slist = None): | ||||||
|  |     layout = [] | ||||||
|  |     data = [] | ||||||
|  |     int_vol = [] | ||||||
|  |     unknown = [] | ||||||
|  |     for i in blocks: | ||||||
|  |         if slist and i not in slist: | ||||||
|  |             continue | ||||||
|  |         if blocks[i].is_vtbl and blocks[i].is_valid: | ||||||
|  |             layout.append(i) | ||||||
|  |         elif blocks[i].is_internal_vol and blocks[i].is_valid: | ||||||
|  |             int_vol.append(i) | ||||||
|  |         elif blocks[i].is_valid: | ||||||
|  |             data.append(i) | ||||||
|  |         else: | ||||||
|  |             unknown.append(i) | ||||||
|  |  | ||||||
|  |     return (layout, | ||||||
|  |      data, | ||||||
|  |      int_vol, | ||||||
|  |      unknown) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/sort.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/block/sort.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										63
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/defines.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/defines.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import struct | ||||||
|  | UBI_CRC32_INIT = 4294967295L | ||||||
|  | UBI_MAX_VOLUMES = 128 | ||||||
|  | UBI_INTERNAL_VOL_START = 2147479551 | ||||||
|  | UBI_EC_HDR_MAGIC = 'UBI#' | ||||||
|  | EC_HDR_FORMAT = '>4sB3sQIII32sI' | ||||||
|  | EC_HDR_FIELDS = ['magic', | ||||||
|  |  'version', | ||||||
|  |  'padding', | ||||||
|  |  'ec', | ||||||
|  |  'vid_hdr_offset', | ||||||
|  |  'data_offset', | ||||||
|  |  'image_seq', | ||||||
|  |  'padding2', | ||||||
|  |  'hdr_crc'] | ||||||
|  | UBI_EC_HDR_SZ = struct.calcsize(EC_HDR_FORMAT) | ||||||
|  | UBI_VID_HDR_MAGIC = 'UBI!' | ||||||
|  | VID_HDR_FORMAT = '>4sBBBBII4sIIII4sQ12sI' | ||||||
|  | VID_HDR_FIELDS = ['magic', | ||||||
|  |  'version', | ||||||
|  |  'vol_type', | ||||||
|  |  'copy_flag', | ||||||
|  |  'compat', | ||||||
|  |  'vol_id', | ||||||
|  |  'lnum', | ||||||
|  |  'padding', | ||||||
|  |  'data_size', | ||||||
|  |  'used_ebs', | ||||||
|  |  'data_pad', | ||||||
|  |  'data_crc', | ||||||
|  |  'padding2', | ||||||
|  |  'sqnum', | ||||||
|  |  'padding3', | ||||||
|  |  'hdr_crc'] | ||||||
|  | UBI_VID_HDR_SZ = struct.calcsize(VID_HDR_FORMAT) | ||||||
|  | VTBL_REC_FORMAT = '>IIIBBH128sB23sI' | ||||||
|  | VTBL_REC_FIELDS = ['reserved_pebs', | ||||||
|  |  'alignment', | ||||||
|  |  'data_pad', | ||||||
|  |  'vol_type', | ||||||
|  |  'upd_marker', | ||||||
|  |  'name_len', | ||||||
|  |  'name', | ||||||
|  |  'flags', | ||||||
|  |  'padding', | ||||||
|  |  'crc'] | ||||||
|  | UBI_VTBL_REC_SZ = struct.calcsize(VTBL_REC_FORMAT) | ||||||
|  | UBI_VID_DYNAMIC = 1 | ||||||
|  | UBI_VID_STATIC = 2 | ||||||
|  | PRINT_VOL_TYPE_LIST = [0, 'dynamic', 'static'] | ||||||
|  | UBI_VTBL_AUTORESIZE_FLG = 1 | ||||||
|  | UBI_COMPAT_DELETE = 1 | ||||||
|  | UBI_COMPAT_RO = 2 | ||||||
|  | UBI_COMPAT_PRESERVE = 4 | ||||||
|  | UBI_COMPAT_REJECT = 5 | ||||||
|  | PRINT_COMPAT_LIST = [0, | ||||||
|  |  'Delete', | ||||||
|  |  'Read Only', | ||||||
|  |  0, | ||||||
|  |  'Preserve', | ||||||
|  |  'Reject'] | ||||||
|  | FILE_CHUNK_SZ = 5242880 | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/defines.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/defines.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										108
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/display.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/display.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi.defines import PRINT_COMPAT_LIST, PRINT_VOL_TYPE_LIST, UBI_VTBL_AUTORESIZE_FLG | ||||||
|  |  | ||||||
|  | def ubi(ubi, tab = ''): | ||||||
|  |     print '%sUBI File' % tab | ||||||
|  |     print '%s---------------------' % tab | ||||||
|  |     print '\t%sMin I/O: %s' % (tab, ubi.min_io_size) | ||||||
|  |     print '\t%sLEB Size: %s' % (tab, ubi.leb_size) | ||||||
|  |     print '\t%sPEB Size: %s' % (tab, ubi.peb_size) | ||||||
|  |     print '\t%sTotal Block Count: %s' % (tab, ubi.block_count) | ||||||
|  |     print '\t%sData Block Count: %s' % (tab, len(ubi.data_blocks_list)) | ||||||
|  |     print '\t%sLayout Block Count: %s' % (tab, len(ubi.layout_blocks_list)) | ||||||
|  |     print '\t%sInternal Volume Block Count: %s' % (tab, len(ubi.int_vol_blocks_list)) | ||||||
|  |     print '\t%sUnknown Block Count: %s' % (tab, len(ubi.unknown_blocks_list)) | ||||||
|  |     print '\t%sFirst UBI PEB Number: %s' % (tab, ubi.first_peb_num) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def image(image, tab = ''): | ||||||
|  |     print '%s%s' % (tab, image) | ||||||
|  |     print '%s---------------------' % tab | ||||||
|  |     print '\t%sImage Sequence Num: %s' % (tab, image.image_seq) | ||||||
|  |     for volume in image.volumes: | ||||||
|  |         print '\t%sVolume Name:%s' % (tab, volume) | ||||||
|  |  | ||||||
|  |     print '\t%sPEB Range: %s - %s' % (tab, image.peb_range[0], image.peb_range[1]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def volume(volume, tab = ''): | ||||||
|  |     print '%s%s' % (tab, volume) | ||||||
|  |     print '%s---------------------' % tab | ||||||
|  |     print '\t%sVol ID: %s' % (tab, volume.vol_id) | ||||||
|  |     print '\t%sName: %s' % (tab, volume.name) | ||||||
|  |     print '\t%sBlock Count: %s' % (tab, volume.block_count) | ||||||
|  |     print '\n' | ||||||
|  |     print '\t%sVolume Record' % tab | ||||||
|  |     print '\t%s---------------------' % tab | ||||||
|  |     vol_rec(volume.vol_rec, '\t\t%s' % tab) | ||||||
|  |     print '\n' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def block(block, tab = '\t'): | ||||||
|  |     print '%s%s' % (tab, block) | ||||||
|  |     print '%s---------------------' % tab | ||||||
|  |     print '\t%sFile Offset: %s' % (tab, block.file_offset) | ||||||
|  |     print '\t%sPEB #: %s' % (tab, block.peb_num) | ||||||
|  |     print '\t%sLEB #: %s' % (tab, block.leb_num) | ||||||
|  |     print '\t%sBlock Size: %s' % (tab, block.size) | ||||||
|  |     print '\t%sInternal Volume: %s' % (tab, block.is_internal_vol) | ||||||
|  |     print '\t%sIs Volume Table: %s' % (tab, block.is_vtbl) | ||||||
|  |     print '\t%sIs Valid: %s' % (tab, block.is_valid) | ||||||
|  |     if not block.ec_hdr.errors: | ||||||
|  |         print '\n' | ||||||
|  |         print '\t%sErase Count Header' % tab | ||||||
|  |         print '\t%s---------------------' % tab | ||||||
|  |         ec_hdr(block.ec_hdr, '\t\t%s' % tab) | ||||||
|  |     if block.vid_hdr and not block.vid_hdr.errors: | ||||||
|  |         print '\n' | ||||||
|  |         print '\t%sVID Header Header' % tab | ||||||
|  |         print '\t%s---------------------' % tab | ||||||
|  |         vid_hdr(block.vid_hdr, '\t\t%s' % tab) | ||||||
|  |     if block.vtbl_recs: | ||||||
|  |         print '\n' | ||||||
|  |         print '\t%sVolume Records' % tab | ||||||
|  |         print '\t%s---------------------' % tab | ||||||
|  |         for vol in block.vtbl_recs: | ||||||
|  |             vol_rec(vol, '\t\t%s' % tab) | ||||||
|  |  | ||||||
|  |     print '\n' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def ec_hdr(ec_hdr, tab = ''): | ||||||
|  |     for key, value in ec_hdr: | ||||||
|  |         if key == 'errors': | ||||||
|  |             value = ','.join(value) | ||||||
|  |         print '%s%s: %r' % (tab, key, value) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def vid_hdr(vid_hdr, tab = ''): | ||||||
|  |     for key, value in vid_hdr: | ||||||
|  |         if key == 'errors': | ||||||
|  |             value = ','.join(value) | ||||||
|  |         elif key == 'compat': | ||||||
|  |             if value in PRINT_COMPAT_LIST: | ||||||
|  |                 value = PRINT_COMPAT_LIST[value] | ||||||
|  |             else: | ||||||
|  |                 value = -1 | ||||||
|  |         elif key == 'vol_type': | ||||||
|  |             if value < len(PRINT_VOL_TYPE_LIST): | ||||||
|  |                 value = PRINT_VOL_TYPE_LIST[value] | ||||||
|  |             else: | ||||||
|  |                 value = -1 | ||||||
|  |         print '%s%s: %s' % (tab, key, value) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def vol_rec(vol_rec, tab = ''): | ||||||
|  |     for key, value in vol_rec: | ||||||
|  |         if key == 'errors': | ||||||
|  |             value = ','.join(value) | ||||||
|  |         elif key == 'vol_type': | ||||||
|  |             if value < len(PRINT_VOL_TYPE_LIST): | ||||||
|  |                 value = PRINT_VOL_TYPE_LIST[value] | ||||||
|  |             else: | ||||||
|  |                 value = -1 | ||||||
|  |         elif key == 'flags' and value == UBI_VTBL_AUTORESIZE_FLG: | ||||||
|  |             value = 'autoresize' | ||||||
|  |         elif key == 'name': | ||||||
|  |             value = value.strip('\x00') | ||||||
|  |         print '%s%s: %s' % (tab, key, value) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/display.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/display.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										89
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/headers/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/headers/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,89 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import struct | ||||||
|  | from ubi.defines import * | ||||||
|  | from ubi.headers import errors | ||||||
|  |  | ||||||
|  | class ec_hdr(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(EC_HDR_FIELDS, struct.unpack(EC_HDR_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'errors', []) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Error Count Header' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class vid_hdr(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(VID_HDR_FIELDS, struct.unpack(VID_HDR_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'errors', []) | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'VID Header' | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class vtbl_rec(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(VTBL_REC_FIELDS, struct.unpack(VTBL_REC_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'errors', []) | ||||||
|  |         setattr(self, 'rec_index', -1) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Volume Table Record: %s' % getattr(self, 'name') | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_ec_hdr(buf): | ||||||
|  |     ec_hdr_buf = buf | ||||||
|  |     ec_hdr_ret = ec_hdr(ec_hdr_buf) | ||||||
|  |     errors.ec_hdr(ec_hdr_ret, ec_hdr_buf) | ||||||
|  |     return ec_hdr_ret | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_vid_hdr(buf): | ||||||
|  |     vid_hdr_buf = buf | ||||||
|  |     vid_hdr_ret = vid_hdr(vid_hdr_buf) | ||||||
|  |     errors.vid_hdr(vid_hdr_ret, vid_hdr_buf) | ||||||
|  |     return vid_hdr_ret | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def extract_vtbl_rec(buf): | ||||||
|  |     data_buf = buf | ||||||
|  |     vtbl_recs = [] | ||||||
|  |     vtbl_rec_ret = '' | ||||||
|  |     for i in range(0, UBI_MAX_VOLUMES): | ||||||
|  |         offset = i * UBI_VTBL_REC_SZ | ||||||
|  |         vtbl_rec_buf = data_buf[offset:offset + UBI_VTBL_REC_SZ] | ||||||
|  |         if len(vtbl_rec_buf) == UBI_VTBL_REC_SZ: | ||||||
|  |             vtbl_rec_ret = vtbl_rec(vtbl_rec_buf) | ||||||
|  |             errors.vtbl_rec(vtbl_rec_ret, vtbl_rec_buf) | ||||||
|  |             if len(vtbl_rec_ret.errors) == 0: | ||||||
|  |                 vtbl_rec_ret.rec_index = i | ||||||
|  |                 vtbl_recs.append(vtbl_rec_ret) | ||||||
|  |  | ||||||
|  |     return vtbl_recs | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/headers/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/headers/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										28
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/headers/errors.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/headers/errors.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from zlib import crc32 | ||||||
|  | from ubi.defines import * | ||||||
|  |  | ||||||
|  | def ec_hdr(ec_hdr, buf): | ||||||
|  |     if ec_hdr.hdr_crc != ~crc32(buf[:-4]) & 4294967295L: | ||||||
|  |         ec_hdr.errors.append('crc') | ||||||
|  |     return ec_hdr | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def vid_hdr(vid_hdr, buf): | ||||||
|  |     vid_hdr.errors = [] | ||||||
|  |     if vid_hdr.hdr_crc != ~crc32(buf[:-4]) & 4294967295L: | ||||||
|  |         vid_hdr.errors.append('crc') | ||||||
|  |     return vid_hdr | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def vtbl_rec(vtbl_rec, buf): | ||||||
|  |     likely_vtbl = True | ||||||
|  |     if vtbl_rec.name_len != len(vtbl_rec.name.strip('\x00')): | ||||||
|  |         likely_vtbl = False | ||||||
|  |     elif vtbl_rec.vol_type not in (1, 2): | ||||||
|  |         likely_vtbl = False | ||||||
|  |     if vtbl_rec.crc != ~crc32(buf[:-4]) & 4294967295L: | ||||||
|  |         vtbl_rec.errors.append('crc') | ||||||
|  |     if not likely_vtbl: | ||||||
|  |         vtbl_rec.errors = ['False'] | ||||||
|  |     return vtbl_rec | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/headers/errors.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/headers/errors.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										38
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/image.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/image.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi import display | ||||||
|  | from ubi.volume import get_volumes | ||||||
|  | from ubi.block import get_blocks_in_list | ||||||
|  |  | ||||||
|  | class description(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, blocks, layout_info): | ||||||
|  |         self._image_seq = blocks[layout_info[0]].ec_hdr.image_seq | ||||||
|  |         self.vid_hdr_offset = blocks[layout_info[0]].ec_hdr.vid_hdr_offset | ||||||
|  |         self.version = blocks[layout_info[0]].ec_hdr.version | ||||||
|  |         self._start_peb = min(layout_info[2]) | ||||||
|  |         self._end_peb = max(layout_info[2]) | ||||||
|  |         self._volumes = get_volumes(blocks, layout_info) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Image: %s' % self.image_seq | ||||||
|  |  | ||||||
|  |     def get_blocks(self, blocks): | ||||||
|  |         return get_blocks_in_list(blocks, range(self._start_peb, self._end_peb + 1)) | ||||||
|  |  | ||||||
|  |     def _get_peb_range(self): | ||||||
|  |         return [self._start_peb, self._end_peb] | ||||||
|  |  | ||||||
|  |     peb_range = property(_get_peb_range) | ||||||
|  |  | ||||||
|  |     def _get_image_seq(self): | ||||||
|  |         return self._image_seq | ||||||
|  |  | ||||||
|  |     image_seq = property(_get_image_seq) | ||||||
|  |  | ||||||
|  |     def _get_volumes(self): | ||||||
|  |         return self._volumes | ||||||
|  |  | ||||||
|  |     volumes = property(_get_volumes) | ||||||
|  |  | ||||||
|  |     def display(self, tab = ''): | ||||||
|  |         display.image(self, tab) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/image.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/image.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										67
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/volume/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/volume/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi import display | ||||||
|  | from ubi.block import sort, get_blocks_in_list | ||||||
|  |  | ||||||
|  | class description(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, vol_id, vol_rec, block_list): | ||||||
|  |         self._vol_id = vol_id | ||||||
|  |         self._vol_rec = vol_rec | ||||||
|  |         self._name = self._vol_rec.name | ||||||
|  |         self._block_list = block_list | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'Volume: %s' % self.name | ||||||
|  |  | ||||||
|  |     def _get_name(self): | ||||||
|  |         return self._name | ||||||
|  |  | ||||||
|  |     name = property(_get_name) | ||||||
|  |  | ||||||
|  |     def _get_vol_id(self): | ||||||
|  |         return self._vol_id | ||||||
|  |  | ||||||
|  |     vol_id = property(_get_vol_id) | ||||||
|  |  | ||||||
|  |     def _get_block_count(self): | ||||||
|  |         return len(self._block_list) | ||||||
|  |  | ||||||
|  |     block_count = property(_get_block_count) | ||||||
|  |  | ||||||
|  |     def _get_vol_rec(self): | ||||||
|  |         return self._vol_rec | ||||||
|  |  | ||||||
|  |     vol_rec = property(_get_vol_rec) | ||||||
|  |  | ||||||
|  |     def _get_block_list(self): | ||||||
|  |         return self._block_list | ||||||
|  |  | ||||||
|  |     block_list = property(_get_block_list) | ||||||
|  |  | ||||||
|  |     def get_blocks(self, blocks): | ||||||
|  |         return get_blocks_in_list(blocks, self._block_list) | ||||||
|  |  | ||||||
|  |     def display(self, tab = ''): | ||||||
|  |         display.volume(self, tab) | ||||||
|  |  | ||||||
|  |     def reader(self, ubi): | ||||||
|  |         last_leb = 0 | ||||||
|  |         for block in sort.by_leb(self.get_blocks(ubi.blocks)): | ||||||
|  |             if block == 'x': | ||||||
|  |                 last_leb += 1 | ||||||
|  |                 yield '\xff' * ubi.leb_size | ||||||
|  |             else: | ||||||
|  |                 last_leb += 1 | ||||||
|  |                 yield ubi.file.read_block_data(ubi.blocks[block]) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_volumes(blocks, layout_info): | ||||||
|  |     volumes = {} | ||||||
|  |     vol_blocks_lists = sort.by_vol_id(blocks, layout_info[2]) | ||||||
|  |     for vol_rec in blocks[layout_info[0]].vtbl_recs: | ||||||
|  |         vol_name = vol_rec.name.strip('\x00') | ||||||
|  |         if vol_rec.rec_index not in vol_blocks_lists: | ||||||
|  |             vol_blocks_lists[vol_rec.rec_index] = [] | ||||||
|  |         volumes[vol_name] = description(vol_rec.rec_index, vol_rec, vol_blocks_lists[vol_rec.rec_index]) | ||||||
|  |  | ||||||
|  |     return volumes | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/volume/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi/volume/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										65
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi_extract_files.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi_extract_files.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,65 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  |  | ||||||
|  | import os | ||||||
|  | import sys | ||||||
|  | import argparse_neo | ||||||
|  | from ubi import ubi, get_peb_size | ||||||
|  | from ubifs import ubifs | ||||||
|  | from ubi_io import ubi_file, leb_virtual_file | ||||||
|  | from ui.common import extract_files, output_dir | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     os.system('echo "\n[NeoBoot] Zip file unzipped.\nInstallation in progress, please wait ..."') | ||||||
|  |     description = 'Extract contents of UBI image.' | ||||||
|  |     usage = 'ubi_extract_files.py [options] filepath' | ||||||
|  |     parser = argparse_neo.ArgumentParser(usage=usage, description=description) | ||||||
|  |     parser.add_argument('-l', '--log-file', dest='logpath', help='Log output to file output/LOGPATH. (default: ubifs_output.log)') | ||||||
|  |     parser.add_argument('-k', '--keep-permissions', action='store_true', dest='permissions', help='Maintain file permissions, requires running as root. (default: False)') | ||||||
|  |     parser.add_argument('-q', '--quiet', action='store_true', dest='quiet', help='Suppress warnings and non-fatal errors. (default: False)') | ||||||
|  |     parser.add_argument('-p', '--peb-size', type=int, dest='block_size', help='Specify PEB size.') | ||||||
|  |     parser.add_argument('-o', '--output-dir', dest='output_path', help='Specify output directory path.') | ||||||
|  |     parser.add_argument('filepath', help='File to extract contents of.') | ||||||
|  |     if len(sys.argv) == 1: | ||||||
|  |         parser.print_help() | ||||||
|  |         sys.exit() | ||||||
|  |     args = parser.parse_args() | ||||||
|  |     if args.filepath: | ||||||
|  |         path = args.filepath | ||||||
|  |         if not os.path.exists(path): | ||||||
|  |             parser.error("File path doesn't exist.") | ||||||
|  |     if args.output_path: | ||||||
|  |         output_path = args.output_path | ||||||
|  |     else: | ||||||
|  |         img_name = os.path.splitext(os.path.basename(path))[0] | ||||||
|  |         output_path = os.path.join(output_dir, img_name) | ||||||
|  |     if args.logpath: | ||||||
|  |         log_to_file = True | ||||||
|  |         log_file = args.logpath | ||||||
|  |     else: | ||||||
|  |         log_to_file = None | ||||||
|  |         log_file = None | ||||||
|  |     if args.block_size: | ||||||
|  |         block_size = args.block_size | ||||||
|  |     else: | ||||||
|  |         block_size = get_peb_size(path) | ||||||
|  |     perms = args.permissions | ||||||
|  |     quiet = args.quiet | ||||||
|  |     if not os.path.exists(output_path): | ||||||
|  |         os.makedirs(output_path) | ||||||
|  |     ufile = ubi_file(path, block_size) | ||||||
|  |     uubi = ubi(ufile) | ||||||
|  |     for image in uubi.images: | ||||||
|  |         for volume in image.volumes: | ||||||
|  |             vol_out_path = os.path.join(output_path, volume) | ||||||
|  |             if not os.path.exists(vol_out_path): | ||||||
|  |                 os.makedirs(vol_out_path) | ||||||
|  |             elif os.listdir(vol_out_path): | ||||||
|  |                 parser.error('Volume output directory is not empty. %s' % vol_out_path) | ||||||
|  |             ufsfile = leb_virtual_file(uubi, image.volumes[volume]) | ||||||
|  |             uubifs = ubifs(ufsfile) | ||||||
|  |             uubifs.log.log_file = log_file | ||||||
|  |             uubifs.log.log_to_file = log_to_file | ||||||
|  |             uubifs.log.quiet = quiet | ||||||
|  |             print 'Wait almost over ...\nLoading the image to: %s' % vol_out_path | ||||||
|  |             extract_files(uubifs, vol_out_path, perms) | ||||||
|  |  | ||||||
|  |     sys.exit(0) | ||||||
							
								
								
									
										116
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi_io/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi_io/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubi.block import sort | ||||||
|  |  | ||||||
|  | class ubi_file(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, path, block_size, start_offset = 0, end_offset = None): | ||||||
|  |         self._fhandle = open(path, 'rb') | ||||||
|  |         self._start_offset = start_offset | ||||||
|  |         if end_offset: | ||||||
|  |             self._end_offset = end_offset | ||||||
|  |         else: | ||||||
|  |             self._fhandle.seek(0, 2) | ||||||
|  |             self._end_offset = self.tell() | ||||||
|  |         self._block_size = block_size | ||||||
|  |         if start_offset >= self._end_offset: | ||||||
|  |             raise Exception('Start offset larger than file size!') | ||||||
|  |         self._fhandle.seek(self._start_offset) | ||||||
|  |  | ||||||
|  |     def _set_start(self, i): | ||||||
|  |         self._start_offset = i | ||||||
|  |  | ||||||
|  |     def _get_start(self): | ||||||
|  |         return self._start_offset | ||||||
|  |  | ||||||
|  |     start_offset = property(_get_start, _set_start) | ||||||
|  |  | ||||||
|  |     def _get_end(self): | ||||||
|  |         return self._end_offset | ||||||
|  |  | ||||||
|  |     end_offset = property(_get_end) | ||||||
|  |  | ||||||
|  |     def _get_block_size(self): | ||||||
|  |         return self._block_size | ||||||
|  |  | ||||||
|  |     block_size = property(_get_block_size) | ||||||
|  |  | ||||||
|  |     def seek(self, offset): | ||||||
|  |         self._fhandle.seek(offset) | ||||||
|  |  | ||||||
|  |     def read(self, size): | ||||||
|  |         return self._fhandle.read(size) | ||||||
|  |  | ||||||
|  |     def tell(self): | ||||||
|  |         return self._fhandle.tell() | ||||||
|  |  | ||||||
|  |     def reset(self): | ||||||
|  |         self._fhandle.seek(self.start_offset) | ||||||
|  |  | ||||||
|  |     def reader(self): | ||||||
|  |         self.reset() | ||||||
|  |         while True: | ||||||
|  |             cur_loc = self._fhandle.tell() | ||||||
|  |             if self.end_offset and cur_loc > self.end_offset: | ||||||
|  |                 break | ||||||
|  |             elif self.end_offset and self.end_offset - cur_loc < self.block_size: | ||||||
|  |                 chunk_size = self.end_offset - cur_loc | ||||||
|  |             else: | ||||||
|  |                 chunk_size = self.block_size | ||||||
|  |             buf = self.read(chunk_size) | ||||||
|  |             if not buf: | ||||||
|  |                 break | ||||||
|  |             yield buf | ||||||
|  |  | ||||||
|  |     def read_block(self, block): | ||||||
|  |         self.seek(block.file_offset) | ||||||
|  |         return self._fhandle.read(block.size) | ||||||
|  |  | ||||||
|  |     def read_block_data(self, block): | ||||||
|  |         self.seek(block.file_offset + block.ec_hdr.data_offset) | ||||||
|  |         buf = self._fhandle.read(block.size - block.ec_hdr.data_offset - block.vid_hdr.data_pad) | ||||||
|  |         return buf | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class leb_virtual_file: | ||||||
|  |  | ||||||
|  |     def __init__(self, ubi, volume): | ||||||
|  |         self._ubi = ubi | ||||||
|  |         self._volume = volume | ||||||
|  |         self._blocks = sort.by_leb(self._volume.get_blocks(self._ubi.blocks)) | ||||||
|  |         self._seek = 0 | ||||||
|  |         self.leb_data_size = len(self._blocks) * self._ubi.leb_size | ||||||
|  |         self._last_leb = -1 | ||||||
|  |         self._last_buf = '' | ||||||
|  |  | ||||||
|  |     def read(self, i): | ||||||
|  |         buf = '' | ||||||
|  |         leb = int(self.tell() / self._ubi.leb_size) | ||||||
|  |         offset = self.tell() % self._ubi.leb_size | ||||||
|  |         if leb == self._last_leb: | ||||||
|  |             self.seek(self.tell() + i) | ||||||
|  |             return self._last_buf[offset:offset + i] | ||||||
|  |         else: | ||||||
|  |             buf = self._ubi.file.read_block_data(self._ubi.blocks[self._blocks[leb]]) | ||||||
|  |             self._last_buf = buf | ||||||
|  |             self._last_leb = leb | ||||||
|  |             self.seek(self.tell() + i) | ||||||
|  |             return buf[offset:offset + i] | ||||||
|  |  | ||||||
|  |     def reset(self): | ||||||
|  |         self.seek(0) | ||||||
|  |  | ||||||
|  |     def seek(self, offset): | ||||||
|  |         self._seek = offset | ||||||
|  |  | ||||||
|  |     def tell(self): | ||||||
|  |         return self._seek | ||||||
|  |  | ||||||
|  |     def reader(self): | ||||||
|  |         last_leb = 0 | ||||||
|  |         for block in self._blocks: | ||||||
|  |             while 0 != self._ubi.blocks[block].leb_num - last_leb: | ||||||
|  |                 last_leb += 1 | ||||||
|  |                 yield '\xff' * self._ubi.leb_size | ||||||
|  |  | ||||||
|  |             last_leb += 1 | ||||||
|  |             yield self._ubi.file.read_block_data(self._ubi.blocks[block]) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi_io/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubi_io/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										76
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import re | ||||||
|  | import struct | ||||||
|  | from ubifs.defines import * | ||||||
|  | from ubifs import nodes | ||||||
|  | from ubifs.nodes import extract | ||||||
|  | from ubifs.log import log | ||||||
|  |  | ||||||
|  | class ubifs: | ||||||
|  |  | ||||||
|  |     def __init__(self, ubifs_file): | ||||||
|  |         self.log = log() | ||||||
|  |         self._file = ubifs_file | ||||||
|  |         self._sb_node = extract.sb_node(self, UBIFS_COMMON_HDR_SZ) | ||||||
|  |         self._min_io_size = self._sb_node.min_io_size | ||||||
|  |         self._leb_size = self._sb_node.leb_size | ||||||
|  |         self._mst_node = extract.mst_node(self, 1, UBIFS_COMMON_HDR_SZ) | ||||||
|  |         self._mst_node = extract.mst_node(self, 2, UBIFS_COMMON_HDR_SZ) | ||||||
|  |  | ||||||
|  |     def _get_file(self): | ||||||
|  |         return self._file | ||||||
|  |  | ||||||
|  |     file = property(_get_file) | ||||||
|  |  | ||||||
|  |     def _get_superblock(self): | ||||||
|  |         return self._sb_node | ||||||
|  |  | ||||||
|  |     superblock_node = property(_get_superblock) | ||||||
|  |  | ||||||
|  |     def _get_master_node(self): | ||||||
|  |         return self._mst_node | ||||||
|  |  | ||||||
|  |     master_node = property(_get_master_node) | ||||||
|  |  | ||||||
|  |     def _get_master_node2(self): | ||||||
|  |         return self._mst_node | ||||||
|  |  | ||||||
|  |     master_node2 = property(_get_master_node2) | ||||||
|  |  | ||||||
|  |     def _get_leb_size(self): | ||||||
|  |         return self._leb_size | ||||||
|  |  | ||||||
|  |     leb_size = property(_get_leb_size) | ||||||
|  |  | ||||||
|  |     def _get_min_io_size(self): | ||||||
|  |         return self._min_io_size | ||||||
|  |  | ||||||
|  |     min_io_size = property(_get_min_io_size) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_leb_size(path): | ||||||
|  |     f = open(path, 'rb') | ||||||
|  |     f.seek(0, 2) | ||||||
|  |     file_size = f.tell() + 1 | ||||||
|  |     f.seek(0) | ||||||
|  |     block_size = 0 | ||||||
|  |     for i in range(0, file_size, FILE_CHUNK_SZ): | ||||||
|  |         buf = f.read(FILE_CHUNK_SZ) | ||||||
|  |         for m in re.finditer(UBIFS_NODE_MAGIC, buf): | ||||||
|  |             start = m.start() | ||||||
|  |             chdr = nodes.common_hdr(buf[start:start + UBIFS_COMMON_HDR_SZ]) | ||||||
|  |             if chdr and chdr.node_type == UBIFS_SB_NODE: | ||||||
|  |                 sb_start = start + UBIFS_COMMON_HDR_SZ | ||||||
|  |                 sb_end = sb_start + UBIFS_SB_NODE_SZ | ||||||
|  |                 if chdr.len != len(buf[sb_start:sb_end]): | ||||||
|  |                     f.seek(sb_start) | ||||||
|  |                     buf = f.read(UBIFS_SB_NODE_SZ) | ||||||
|  |                 else: | ||||||
|  |                     buf = buf[sb_start:sb_end] | ||||||
|  |                 sbn = nodes.sb_node(buf) | ||||||
|  |                 block_size = sbn.leb_size | ||||||
|  |                 f.close() | ||||||
|  |                 return block_size | ||||||
|  |  | ||||||
|  |     f.close() | ||||||
|  |     return block_size | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										221
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/defines.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/defines.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,221 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import struct | ||||||
|  | UBIFS_NODE_MAGIC = '1\x18\x10\x06' | ||||||
|  | UBIFS_CRC32_INIT = 4294967295L | ||||||
|  | UBIFS_MIN_COMPR_LEN = 128 | ||||||
|  | UBIFS_MIN_COMPRESS_DIFF = 64 | ||||||
|  | UBIFS_ROOT_INO = 1 | ||||||
|  | UBIFS_FIRST_INO = 64 | ||||||
|  | UBIFS_MAX_NLEN = 255 | ||||||
|  | UBIFS_MAX_JHEADS = 1 | ||||||
|  | UBIFS_BLOCK_SIZE = 4096 | ||||||
|  | UBIFS_BLOCK_SHIFT = 12 | ||||||
|  | UBIFS_PADDING_BYTE = '\xce' | ||||||
|  | UBIFS_MAX_KEY_LEN = 16 | ||||||
|  | UBIFS_SK_LEN = 8 | ||||||
|  | UBIFS_MIN_FANOUT = 3 | ||||||
|  | UBIFS_MAX_LEVELS = 512 | ||||||
|  | UBIFS_MAX_INO_DATA = UBIFS_BLOCK_SIZE | ||||||
|  | UBIFS_LPT_FANOUT = 4 | ||||||
|  | UBIFS_LPT_FANOUT_SHIFT = 2 | ||||||
|  | UBIFS_LPT_CRC_BITS = 16 | ||||||
|  | UBIFS_LPT_CRC_BYTES = 2 | ||||||
|  | UBIFS_LPT_TYPE_BITS = 4 | ||||||
|  | UBIFS_LPT_PNODE = 0 | ||||||
|  | UBIFS_LPT_NNODE = 1 | ||||||
|  | UBIFS_LPT_LTAB = 2 | ||||||
|  | UBIFS_LPT_LSAVE = 3 | ||||||
|  | UBIFS_LPT_NODE_CNT = 4 | ||||||
|  | UBIFS_LPT_NOT_A_NODE = (1 << UBIFS_LPT_TYPE_BITS) - 1 | ||||||
|  | UBIFS_ITYPE_REG = 0 | ||||||
|  | UBIFS_ITYPE_DIR = 1 | ||||||
|  | UBIFS_ITYPE_LNK = 2 | ||||||
|  | UBIFS_ITYPE_BLK = 3 | ||||||
|  | UBIFS_ITYPE_CHR = 4 | ||||||
|  | UBIFS_ITYPE_FIFO = 5 | ||||||
|  | UBIFS_ITYPE_SOCK = 6 | ||||||
|  | UBIFS_ITYPES_CNT = 7 | ||||||
|  | UBIFS_KEY_HASH_R5 = 0 | ||||||
|  | UBIFS_KEY_HASH_TEST = 1 | ||||||
|  | PRINT_UBIFS_KEY_HASH = ['r5', 'test'] | ||||||
|  | UBIFS_SIMPLE_KEY_FMT = 0 | ||||||
|  | UBIFS_S_KEY_BLOCK_BITS = 29 | ||||||
|  | UBIFS_S_KEY_BLOCK_MASK = 536870911 | ||||||
|  | UBIFS_S_KEY_HASH_BITS = UBIFS_S_KEY_BLOCK_BITS | ||||||
|  | UBIFS_S_KEY_HASH_MASK = UBIFS_S_KEY_BLOCK_MASK | ||||||
|  | UBIFS_INO_KEY = 0 | ||||||
|  | UBIFS_DATA_KEY = 1 | ||||||
|  | UBIFS_DENT_KEY = 2 | ||||||
|  | UBIFS_XENT_KEY = 3 | ||||||
|  | UBIFS_KEY_TYPES_CNT = 4 | ||||||
|  | UBIFS_SB_LEBS = 1 | ||||||
|  | UBIFS_MST_LEBS = 2 | ||||||
|  | UBIFS_SB_LNUM = 0 | ||||||
|  | UBIFS_MST_LNUM = UBIFS_SB_LNUM + UBIFS_SB_LEBS | ||||||
|  | UBIFS_LOG_LNUM = UBIFS_MST_LNUM + UBIFS_MST_LEBS | ||||||
|  | UBIFS_COMPR_FL = 1 | ||||||
|  | UBIFS_SYNC_FL = 2 | ||||||
|  | UBIFS_IMMUTABLE_FL = 4 | ||||||
|  | UBIFS_APPEND_FL = 8 | ||||||
|  | UBIFS_DIRSYNC_FL = 16 | ||||||
|  | UBIFS_XATTR_FL = 32 | ||||||
|  | UBIFS_FL_MASK = 31 | ||||||
|  | UBIFS_COMPR_NONE = 0 | ||||||
|  | UBIFS_COMPR_LZO = 1 | ||||||
|  | UBIFS_COMPR_ZLIB = 2 | ||||||
|  | UBIFS_COMPR_TYPES_CNT = 3 | ||||||
|  | PRINT_UBIFS_COMPR = ['none', 'lzo', 'zlib'] | ||||||
|  | UBIFS_INO_NODE = 0 | ||||||
|  | UBIFS_DATA_NODE = 1 | ||||||
|  | UBIFS_DENT_NODE = 2 | ||||||
|  | UBIFS_XENT_NODE = 3 | ||||||
|  | UBIFS_TRUN_NODE = 4 | ||||||
|  | UBIFS_PAD_NODE = 5 | ||||||
|  | UBIFS_SB_NODE = 6 | ||||||
|  | UBIFS_MST_NODE = 7 | ||||||
|  | UBIFS_REF_NODE = 8 | ||||||
|  | UBIFS_IDX_NODE = 9 | ||||||
|  | UBIFS_CS_NODE = 10 | ||||||
|  | UBIFS_ORPH_NODE = 11 | ||||||
|  | UBIFS_NODE_TYPES_CNT = 12 | ||||||
|  | UBIFS_MST_DIRTY = 1 | ||||||
|  | UBIFS_MST_NO_ORPHS = 2 | ||||||
|  | UBIFS_MST_RCVRY = 4 | ||||||
|  | UBIFS_NO_NODE_GROUP = 0 | ||||||
|  | UBIFS_IN_NODE_GROUP = 1 | ||||||
|  | UBIFS_LAST_OF_NODE_GROUP = 2 | ||||||
|  | UBIFS_FLG_BIGLPT = 2 | ||||||
|  | UBIFS_FLG_SPACE_FIXUP = 4 | ||||||
|  | UBIFS_COMMON_HDR_FORMAT = '<IIQIBB2s' | ||||||
|  | UBIFS_COMMON_HDR_FIELDS = ['magic', | ||||||
|  |  'crc', | ||||||
|  |  'sqnum', | ||||||
|  |  'len', | ||||||
|  |  'node_type', | ||||||
|  |  'group_type', | ||||||
|  |  'padding'] | ||||||
|  | UBIFS_COMMON_HDR_SZ = struct.calcsize(UBIFS_COMMON_HDR_FORMAT) | ||||||
|  | UBIFS_KEY_OFFSET = UBIFS_COMMON_HDR_SZ | ||||||
|  | UBIFS_DEV_DESC_FORMAT = '<IQ' | ||||||
|  | UBIFS_DEV_DESC_FIELDS = ['new', 'huge'] | ||||||
|  | UBIFS_DEV_DESC_SZ = struct.calcsize(UBIFS_DEV_DESC_FORMAT) | ||||||
|  | UBIFS_INO_NODE_FORMAT = '<%ssQQQQQIIIIIIIIIII4sIH26s' % UBIFS_MAX_KEY_LEN | ||||||
|  | UBIFS_INO_NODE_FIELDS = ['key', | ||||||
|  |  'creat_sqnum', | ||||||
|  |  'size', | ||||||
|  |  'atime_sec', | ||||||
|  |  'ctime_sec', | ||||||
|  |  'mtime_sec', | ||||||
|  |  'atime_nsec', | ||||||
|  |  'ctime_nsec', | ||||||
|  |  'mtime_nsec', | ||||||
|  |  'nlink', | ||||||
|  |  'uid', | ||||||
|  |  'gid', | ||||||
|  |  'mode', | ||||||
|  |  'flags', | ||||||
|  |  'data_len', | ||||||
|  |  'xattr_cnt', | ||||||
|  |  'xattr_size', | ||||||
|  |  'padding1', | ||||||
|  |  'xattr_names', | ||||||
|  |  'compr_type', | ||||||
|  |  'padding2'] | ||||||
|  | UBIFS_INO_NODE_SZ = struct.calcsize(UBIFS_INO_NODE_FORMAT) | ||||||
|  | UBIFS_DENT_NODE_FORMAT = '<%ssQBBH4s' % UBIFS_MAX_KEY_LEN | ||||||
|  | UBIFS_DENT_NODE_FIELDS = ['key', | ||||||
|  |  'inum', | ||||||
|  |  'padding1', | ||||||
|  |  'type', | ||||||
|  |  'nlen', | ||||||
|  |  'padding2'] | ||||||
|  | UBIFS_DENT_NODE_SZ = struct.calcsize(UBIFS_DENT_NODE_FORMAT) | ||||||
|  | UBIFS_DATA_NODE_FORMAT = '<%ssIH2s' % UBIFS_MAX_KEY_LEN | ||||||
|  | UBIFS_DATA_NODE_FIELDS = ['key', | ||||||
|  |  'size', | ||||||
|  |  'compr_type', | ||||||
|  |  'padding'] | ||||||
|  | UBIFS_DATA_NODE_SZ = struct.calcsize(UBIFS_DATA_NODE_FORMAT) | ||||||
|  | UBIFS_TRUN_NODE_FORMAT = '<I12sQQ' | ||||||
|  | UBIFS_TRUN_NODE_FIELDS = ['inum', | ||||||
|  |  'padding', | ||||||
|  |  'old_size', | ||||||
|  |  'new_size'] | ||||||
|  | UBIFS_TRUN_NODE_SZ = struct.calcsize(UBIFS_TRUN_NODE_FORMAT) | ||||||
|  | UBIFS_PAD_NODE_FORMAT = '<I' | ||||||
|  | UBIFS_PAD_NODE_FIELDS = ['pad_len'] | ||||||
|  | UBIFS_PAD_NODE_SZ = struct.calcsize(UBIFS_PAD_NODE_FORMAT) | ||||||
|  | UBIFS_SB_NODE_FORMAT = '<2sBBIIIIIQIIIIIIIH2sIIQI16sI3968s' | ||||||
|  | UBIFS_SB_NODE_FIELDS = ['padding', | ||||||
|  |  'key_hash', | ||||||
|  |  'key_fmt', | ||||||
|  |  'flags', | ||||||
|  |  'min_io_size', | ||||||
|  |  'leb_size', | ||||||
|  |  'leb_cnt', | ||||||
|  |  'max_leb_cnt', | ||||||
|  |  'max_bud_bytes', | ||||||
|  |  'log_lebs', | ||||||
|  |  'lpt_lebs', | ||||||
|  |  'orph_lebs', | ||||||
|  |  'jhead_cnt', | ||||||
|  |  'fanout', | ||||||
|  |  'lsave_cnt', | ||||||
|  |  'fmt_version', | ||||||
|  |  'default_compr', | ||||||
|  |  'padding1', | ||||||
|  |  'rp_uid', | ||||||
|  |  'rp_gid', | ||||||
|  |  'rp_size', | ||||||
|  |  'time_gran', | ||||||
|  |  'uuid', | ||||||
|  |  'ro_compat_version', | ||||||
|  |  'padding2'] | ||||||
|  | UBIFS_SB_NODE_SZ = struct.calcsize(UBIFS_SB_NODE_FORMAT) | ||||||
|  | UBIFS_MST_NODE_FORMAT = '<QQIIIIIIIIQQQQQQIIIIIIIIIIII344s' | ||||||
|  | UBIFS_MST_NODE_FIELDS = ['highest_inum', | ||||||
|  |  'cmt_no', | ||||||
|  |  'flags', | ||||||
|  |  'log_lnum', | ||||||
|  |  'root_lnum', | ||||||
|  |  'root_offs', | ||||||
|  |  'root_len', | ||||||
|  |  'gc_lnum', | ||||||
|  |  'ihead_lnum', | ||||||
|  |  'ihead_offs', | ||||||
|  |  'index_size', | ||||||
|  |  'total_free', | ||||||
|  |  'total_dirty', | ||||||
|  |  'total_used', | ||||||
|  |  'total_dead', | ||||||
|  |  'total_dark', | ||||||
|  |  'lpt_lnum', | ||||||
|  |  'lpt_offs', | ||||||
|  |  'nhead_lnum', | ||||||
|  |  'nhead_offs', | ||||||
|  |  'ltab_lnum', | ||||||
|  |  'ltab_offs', | ||||||
|  |  'lsave_lnum', | ||||||
|  |  'lsave_offs', | ||||||
|  |  'lscan_lnum', | ||||||
|  |  'empty_lebs', | ||||||
|  |  'idx_lebs', | ||||||
|  |  'leb_cnt', | ||||||
|  |  'padding'] | ||||||
|  | UBIFS_MST_NODE_SZ = struct.calcsize(UBIFS_MST_NODE_FORMAT) | ||||||
|  | UBIFS_REF_NODE_FORMAT = '<III28s' | ||||||
|  | UBIFS_REF_NODE_FIELDS = ['lnum', | ||||||
|  |  'offs', | ||||||
|  |  'jhead', | ||||||
|  |  'padding'] | ||||||
|  | UBIFS_REF_NODE_SZ = struct.calcsize(UBIFS_REF_NODE_FORMAT) | ||||||
|  | UBIFS_BRANCH_FORMAT = '<III%ss' % UBIFS_SK_LEN | ||||||
|  | UBIFS_BRANCH_FIELDS = ['lnum', | ||||||
|  |  'offs', | ||||||
|  |  'len', | ||||||
|  |  'key'] | ||||||
|  | UBIFS_BRANCH_SZ = struct.calcsize(UBIFS_BRANCH_FORMAT) | ||||||
|  | UBIFS_IDX_NODE_FORMAT = '<HH' | ||||||
|  | UBIFS_IDX_NODE_FIELDS = ['child_cnt', 'level'] | ||||||
|  | UBIFS_IDX_NODE_SZ = struct.calcsize(UBIFS_IDX_NODE_FORMAT) | ||||||
|  | FILE_CHUNK_SZ = 5242880 | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/defines.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/defines.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										33
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/log.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/log.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import os | ||||||
|  | import sys | ||||||
|  | import ui | ||||||
|  |  | ||||||
|  | class log: | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self.log_to_file = False | ||||||
|  |         self.log_file = 'ubifs_output.log' | ||||||
|  |         self.exit_on_except = False | ||||||
|  |         self.quiet = False | ||||||
|  |  | ||||||
|  |     def _out(self, s): | ||||||
|  |         if not self.quiet: | ||||||
|  |             if self.log_to_file: | ||||||
|  |                 with open(os.path.join(ui.common.output_dir, self.log_file), 'a') as f: | ||||||
|  |                     f.write('%s\n' % s) | ||||||
|  |                 f.close() | ||||||
|  |             else: | ||||||
|  |                 print '%s' % s | ||||||
|  |         if self.exit_on_except: | ||||||
|  |             sys.exit() | ||||||
|  |  | ||||||
|  |     def write(self, s): | ||||||
|  |         self._out(s) | ||||||
|  |  | ||||||
|  |     def write_node(self, n): | ||||||
|  |         buf = '%s\n' % n | ||||||
|  |         for key, value in n: | ||||||
|  |             buf += '\t%s: %s\n' % (key, value) | ||||||
|  |  | ||||||
|  |         self._out(buf) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/log.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/log.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/lzo.so
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/lzo.so
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										46
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/misc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/misc.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | #import lzo | ||||||
|  | import struct | ||||||
|  | import zlib | ||||||
|  | from ubifs.defines import * | ||||||
|  | ino_types = ['file', | ||||||
|  |  'dir', | ||||||
|  |  'lnk', | ||||||
|  |  'blk', | ||||||
|  |  'chr', | ||||||
|  |  'fifo', | ||||||
|  |  'sock'] | ||||||
|  | node_types = ['ino', | ||||||
|  |  'data', | ||||||
|  |  'dent', | ||||||
|  |  'xent', | ||||||
|  |  'trun', | ||||||
|  |  'pad', | ||||||
|  |  'sb', | ||||||
|  |  'mst', | ||||||
|  |  'ref', | ||||||
|  |  'idx', | ||||||
|  |  'cs', | ||||||
|  |  'orph'] | ||||||
|  | key_types = ['ino', | ||||||
|  |  'data', | ||||||
|  |  'dent', | ||||||
|  |  'xent'] | ||||||
|  |  | ||||||
|  | def parse_key(key): | ||||||
|  |     hkey, lkey = struct.unpack('<II', key[0:UBIFS_SK_LEN]) | ||||||
|  |     ino_num = hkey & UBIFS_S_KEY_HASH_MASK | ||||||
|  |     key_type = lkey >> UBIFS_S_KEY_BLOCK_BITS | ||||||
|  |     khash = lkey | ||||||
|  |     return {'type': key_type, | ||||||
|  |      'ino_num': ino_num, | ||||||
|  |      'khash': khash} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def decompress(ctype, unc_len, data): | ||||||
|  |     #if ctype == UBIFS_COMPR_LZO: | ||||||
|  |         #return lzo.decompress(''.join(('\xf0', struct.pack('>I', unc_len), data))) | ||||||
|  |     if ctype == UBIFS_COMPR_ZLIB: | ||||||
|  |         return zlib.decompress(data, -11) | ||||||
|  |     else: | ||||||
|  |         return data | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/misc.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/misc.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										151
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/nodes/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/nodes/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import struct | ||||||
|  | from ubifs.defines import * | ||||||
|  | from ubifs.misc import parse_key | ||||||
|  |  | ||||||
|  | class common_hdr(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_COMMON_HDR_FIELDS, struct.unpack(UBIFS_COMMON_HDR_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'errors', []) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Common Header' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class sb_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_SB_NODE_FIELDS, struct.unpack(UBIFS_SB_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Super Block Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class mst_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_MST_NODE_FIELDS, struct.unpack(UBIFS_MST_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Master Block Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class dent_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_DENT_NODE_FIELDS, struct.unpack(UBIFS_DENT_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             if key == 'key': | ||||||
|  |                 setattr(self, key, parse_key(fields[key])) | ||||||
|  |             else: | ||||||
|  |                 setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'name', '') | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Directory Entry Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class data_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_DATA_NODE_FIELDS, struct.unpack(UBIFS_DATA_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             if key == 'key': | ||||||
|  |                 setattr(self, key, parse_key(fields[key])) | ||||||
|  |             else: | ||||||
|  |                 setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'offset', 0) | ||||||
|  |         setattr(self, 'compr_len', 0) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Data Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class idx_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_IDX_NODE_FIELDS, struct.unpack(UBIFS_IDX_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'branches', []) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Index Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ino_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_INO_NODE_FIELDS, struct.unpack(UBIFS_INO_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             if key == 'key': | ||||||
|  |                 setattr(self, key, parse_key(fields[key])) | ||||||
|  |             else: | ||||||
|  |                 setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'data', '') | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Ino Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class branch(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_BRANCH_FIELDS, struct.unpack(UBIFS_BRANCH_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Branch' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/nodes/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/nodes/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										48
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/nodes/extract.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/nodes/extract.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubifs import nodes | ||||||
|  | from ubifs.defines import * | ||||||
|  |  | ||||||
|  | def common_hdr(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     return nodes.common_hdr(ubifs.file.read(UBIFS_COMMON_HDR_SZ)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def ino_node(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     inon = nodes.ino_node(ubifs.file.read(UBIFS_INO_NODE_SZ)) | ||||||
|  |     inon.data = ubifs.file.read(inon.data_len) | ||||||
|  |     return inon | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def mst_node(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     return nodes.mst_node(ubifs.file.read(UBIFS_MST_NODE_SZ)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def sb_node(ubifs, offset = 0): | ||||||
|  |     ubifs.file.seek(offset) | ||||||
|  |     return nodes.sb_node(ubifs.file.read(UBIFS_SB_NODE_SZ)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def dent_node(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     den = nodes.dent_node(ubifs.file.read(UBIFS_DENT_NODE_SZ)) | ||||||
|  |     den.name = '%s' % ubifs.file.read(den.nlen) | ||||||
|  |     return den | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def data_node(ubifs, lnum, offset = 0, node_len = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     datn = nodes.data_node(ubifs.file.read(UBIFS_DATA_NODE_SZ)) | ||||||
|  |     datn.offset = ubifs.leb_size * lnum + offset + UBIFS_DATA_NODE_SZ | ||||||
|  |     datn.compr_len = node_len - UBIFS_COMMON_HDR_SZ - UBIFS_DATA_NODE_SZ | ||||||
|  |     return datn | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def idx_node(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     idxn = nodes.idx_node(ubifs.file.read(UBIFS_IDX_NODE_SZ)) | ||||||
|  |     for i in range(0, idxn.child_cnt): | ||||||
|  |         idxn.branches.append(nodes.branch(ubifs.file.read(UBIFS_BRANCH_SZ))) | ||||||
|  |  | ||||||
|  |     return idxn | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/nodes/extract.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/nodes/extract.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										114
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/output.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/output.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import os | ||||||
|  | import struct | ||||||
|  | from ubifs.defines import * | ||||||
|  | from ubifs.misc import decompress | ||||||
|  |  | ||||||
|  | def dents(ubifs, inodes, dent_node, path = '', perms = False): | ||||||
|  |     inode = inodes[dent_node.inum] | ||||||
|  |     dent_path = os.path.join(path, dent_node.name) | ||||||
|  |     if dent_node.type == UBIFS_ITYPE_DIR: | ||||||
|  |         try: | ||||||
|  |             if not os.path.exists(dent_path): | ||||||
|  |                 os.mkdir(dent_path) | ||||||
|  |                 if perms: | ||||||
|  |                     set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('DIR Fail: %s' % e) | ||||||
|  |  | ||||||
|  |         if 'dent' in inode: | ||||||
|  |             for dnode in inode['dent']: | ||||||
|  |                 dents(ubifs, inodes, dnode, dent_path, perms) | ||||||
|  |  | ||||||
|  |     elif dent_node.type == UBIFS_ITYPE_REG: | ||||||
|  |         try: | ||||||
|  |             if inode['ino'].nlink > 1: | ||||||
|  |                 if 'hlink' not in inode: | ||||||
|  |                     inode['hlink'] = dent_path | ||||||
|  |                     buf = process_reg_file(ubifs, inode, dent_path) | ||||||
|  |                     write_reg_file(dent_path, buf) | ||||||
|  |                 else: | ||||||
|  |                     os.link(inode['hlink'], dent_path) | ||||||
|  |             else: | ||||||
|  |                 buf = process_reg_file(ubifs, inode, dent_path) | ||||||
|  |                 write_reg_file(dent_path, buf) | ||||||
|  |             if perms: | ||||||
|  |                 set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('FILE Fail: %s' % e) | ||||||
|  |  | ||||||
|  |     elif dent_node.type == UBIFS_ITYPE_LNK: | ||||||
|  |         try: | ||||||
|  |             os.symlink('%s' % inode['ino'].data, dent_path) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('SYMLINK Fail: %s : %s' % (inode['ino'].data, dent_path)) | ||||||
|  |  | ||||||
|  |     elif dent_node.type in [UBIFS_ITYPE_BLK, UBIFS_ITYPE_CHR]: | ||||||
|  |         try: | ||||||
|  |             dev = struct.unpack('<II', inode['ino'].data)[0] | ||||||
|  |             if perms: | ||||||
|  |                 os.mknod(dent_path, inode['ino'].mode, dev) | ||||||
|  |                 if perms: | ||||||
|  |                     set_file_perms(path, inode) | ||||||
|  |             else: | ||||||
|  |                 write_reg_file(dent_path, str(dev)) | ||||||
|  |                 if perms: | ||||||
|  |                     set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('DEV Fail: %s : %s' % (dent_path, e)) | ||||||
|  |  | ||||||
|  |     elif dent_node.type == UBIFS_ITYPE_FIFO: | ||||||
|  |         try: | ||||||
|  |             os.mkfifo(dent_path, inode['ino'].mode) | ||||||
|  |             if perms: | ||||||
|  |                 set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('FIFO Fail: %s : %s' % (dent_path, e)) | ||||||
|  |  | ||||||
|  |     elif dent_node.type == UBIFS_ITYPE_SOCK: | ||||||
|  |         try: | ||||||
|  |             write_reg_file(dent_path, '') | ||||||
|  |             if perms: | ||||||
|  |                 set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('SOCK Fail: %s' % dent_path) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def set_file_perms(path, inode): | ||||||
|  |     try: | ||||||
|  |         os.chmod(path, inode['ino'].mode) | ||||||
|  |         os.chown(path, inode['ino'].uid, inode['ino'].gid) | ||||||
|  |     except: | ||||||
|  |         raise Exception('Failed File Permissions: %s' % path) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def write_reg_file(path, data): | ||||||
|  |     with open(path, 'wb') as f: | ||||||
|  |         f.write(data) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def process_reg_file(ubifs, inode, path): | ||||||
|  |     try: | ||||||
|  |         buf = '' | ||||||
|  |         if 'data' in inode: | ||||||
|  |             compr_type = 0 | ||||||
|  |             sorted_data = sorted(inode['data'], key=lambda x: x.key['khash']) | ||||||
|  |             last_khash = sorted_data[0].key['khash'] - 1 | ||||||
|  |             for data in sorted_data: | ||||||
|  |                 if data.key['khash'] - last_khash != 1: | ||||||
|  |                     while 1 != data.key['khash'] - last_khash: | ||||||
|  |                         buf += '\x00' * UBIFS_BLOCK_SIZE | ||||||
|  |                         last_khash += 1 | ||||||
|  |  | ||||||
|  |                 compr_type = data.compr_type | ||||||
|  |                 ubifs.file.seek(data.offset) | ||||||
|  |                 d = ubifs.file.read(data.compr_len) | ||||||
|  |                 buf += decompress(compr_type, data.size, d) | ||||||
|  |                 last_khash = data.key['khash'] | ||||||
|  |  | ||||||
|  |     except Exception as e: | ||||||
|  |         raise Exception('inode num:%s :%s' % (inode['ino'].key['ino_num'], e)) | ||||||
|  |  | ||||||
|  |     if inode['ino'].size > len(buf): | ||||||
|  |         buf += '\x00' * (inode['ino'].size - len(buf)) | ||||||
|  |     return buf | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/output.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/output.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										33
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/walk.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/walk.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubifs import extract | ||||||
|  | from ubifs.defines import * | ||||||
|  |  | ||||||
|  | def index(ubifs, lnum, offset, inodes = {}): | ||||||
|  |     chdr = extract.common_hdr(ubifs, lnum, offset) | ||||||
|  |     if chdr.node_type == UBIFS_IDX_NODE: | ||||||
|  |         idxn = extract.idx_node(ubifs, lnum, offset + UBIFS_COMMON_HDR_SZ) | ||||||
|  |         for branch in idxn.branches: | ||||||
|  |             index(ubifs, branch.lnum, branch.offs, inodes) | ||||||
|  |  | ||||||
|  |     elif chdr.node_type == UBIFS_INO_NODE: | ||||||
|  |         inon = extract.ino_node(ubifs, lnum, offset + UBIFS_COMMON_HDR_SZ) | ||||||
|  |         ino_num = inon.key['ino_num'] | ||||||
|  |         if ino_num not in inodes: | ||||||
|  |             inodes[ino_num] = {} | ||||||
|  |         inodes[ino_num]['ino'] = inon | ||||||
|  |     elif chdr.node_type == UBIFS_DATA_NODE: | ||||||
|  |         datn = extract.data_node(ubifs, lnum, offset + UBIFS_COMMON_HDR_SZ, chdr.len) | ||||||
|  |         ino_num = datn.key['ino_num'] | ||||||
|  |         if ino_num not in inodes: | ||||||
|  |             inodes[ino_num] = {} | ||||||
|  |         if 'data' not in inodes[ino_num]: | ||||||
|  |             inodes[ino_num]['data'] = [] | ||||||
|  |         inodes[ino_num]['data'].append(datn) | ||||||
|  |     elif chdr.node_type == UBIFS_DENT_NODE: | ||||||
|  |         dn = extract.dent_node(ubifs, lnum, offset + UBIFS_COMMON_HDR_SZ) | ||||||
|  |         ino_num = dn.key['ino_num'] | ||||||
|  |         if ino_num not in inodes: | ||||||
|  |             inodes[ino_num] = {} | ||||||
|  |         if 'dent' not in inodes[ino_num]: | ||||||
|  |             inodes[ino_num]['dent'] = [] | ||||||
|  |         inodes[ino_num]['dent'].append(dn) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/walk.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ubifs/walk.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ui/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ui/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										88
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ui/common.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ui/common.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import os | ||||||
|  | from ubi_io import leb_virtual_file | ||||||
|  | from ubifs import ubifs, walk, output | ||||||
|  | from ubifs.defines import PRINT_UBIFS_KEY_HASH, PRINT_UBIFS_COMPR | ||||||
|  | from ubi.defines import PRINT_VOL_TYPE_LIST, UBI_VTBL_AUTORESIZE_FLG | ||||||
|  | output_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'output') | ||||||
|  |  | ||||||
|  | def extract_files(ubifs, out_path, perms = False): | ||||||
|  |     try: | ||||||
|  |         inodes = {} | ||||||
|  |         walk.index(ubifs, ubifs.master_node.root_lnum, ubifs.master_node.root_offs, inodes) | ||||||
|  |         for dent in inodes[1]['dent']: | ||||||
|  |             output.dents(ubifs, inodes, dent, out_path, perms) | ||||||
|  |  | ||||||
|  |     except Exception as e: | ||||||
|  |         import traceback | ||||||
|  |         ubifs.log.write('%s' % e) | ||||||
|  |         traceback.print_exc() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_ubi_params(ubi): | ||||||
|  |     ubi_flags = {'min_io_size': '-m', | ||||||
|  |      'max_bud_bytes': '-j', | ||||||
|  |      'leb_size': '-e', | ||||||
|  |      'default_compr': '-x', | ||||||
|  |      'sub_page_size': '-s', | ||||||
|  |      'fanout': '-f', | ||||||
|  |      'key_hash': '-k', | ||||||
|  |      'orph_lebs': '-p', | ||||||
|  |      'log_lebs': '-l', | ||||||
|  |      'max_leb_cnt': '-c', | ||||||
|  |      'peb_size': '-p', | ||||||
|  |      'sub_page_size': '-s', | ||||||
|  |      'vid_hdr_offset': '-O', | ||||||
|  |      'version': '-x', | ||||||
|  |      'image_seq': '-Q', | ||||||
|  |      'alignment': '-a', | ||||||
|  |      'vol_id': '-n', | ||||||
|  |      'name': '-N'} | ||||||
|  |     ubi_params = {} | ||||||
|  |     ubi_args = {} | ||||||
|  |     ini_params = {} | ||||||
|  |     for image in ubi.images: | ||||||
|  |         img_seq = image.image_seq | ||||||
|  |         ubi_params[img_seq] = {} | ||||||
|  |         ubi_args[img_seq] = {} | ||||||
|  |         ini_params[img_seq] = {} | ||||||
|  |         for volume in image.volumes: | ||||||
|  |             ubi_args[img_seq][volume] = {} | ||||||
|  |             ini_params[img_seq][volume] = {} | ||||||
|  |             ini_params[img_seq][volume]['vol_type'] = PRINT_VOL_TYPE_LIST[image.volumes[volume].vol_rec.vol_type] | ||||||
|  |             if image.volumes[volume].vol_rec.flags == UBI_VTBL_AUTORESIZE_FLG: | ||||||
|  |                 ini_params[img_seq][volume]['vol_flags'] = 'autoresize' | ||||||
|  |             else: | ||||||
|  |                 ini_params[img_seq][volume]['vol_flags'] = image.volumes[volume].vol_rec.flags | ||||||
|  |             ini_params[img_seq][volume]['vol_id'] = image.volumes[volume].vol_id | ||||||
|  |             ini_params[img_seq][volume]['vol_name'] = image.volumes[volume].name.rstrip('\x00') | ||||||
|  |             ini_params[img_seq][volume]['vol_alignment'] = image.volumes[volume].vol_rec.alignment | ||||||
|  |             ini_params[img_seq][volume]['vol_size'] = image.volumes[volume].vol_rec.reserved_pebs * ubi.leb_size | ||||||
|  |             ufsfile = leb_virtual_file(ubi, image.volumes[volume]) | ||||||
|  |             uubifs = ubifs(ufsfile) | ||||||
|  |             for key, value in uubifs.superblock_node: | ||||||
|  |                 if key == 'key_hash': | ||||||
|  |                     value = PRINT_UBIFS_KEY_HASH[value] | ||||||
|  |                 elif key == 'default_compr': | ||||||
|  |                     value = PRINT_UBIFS_COMPR[value] | ||||||
|  |                 if key in ubi_flags: | ||||||
|  |                     ubi_args[img_seq][volume][key] = value | ||||||
|  |  | ||||||
|  |             for key, value in image.volumes[volume].vol_rec: | ||||||
|  |                 if key == 'name': | ||||||
|  |                     value = value.rstrip('\x00') | ||||||
|  |                 if key in ubi_flags: | ||||||
|  |                     ubi_args[img_seq][volume][key] = value | ||||||
|  |  | ||||||
|  |             ubi_args[img_seq][volume]['version'] = image.version | ||||||
|  |             ubi_args[img_seq][volume]['vid_hdr_offset'] = image.vid_hdr_offset | ||||||
|  |             ubi_args[img_seq][volume]['sub_page_size'] = ubi_args[img_seq][volume]['vid_hdr_offset'] | ||||||
|  |             ubi_args[img_seq][volume]['sub_page_size'] = ubi_args[img_seq][volume]['vid_hdr_offset'] | ||||||
|  |             ubi_args[img_seq][volume]['image_seq'] = image.image_seq | ||||||
|  |             ubi_args[img_seq][volume]['peb_size'] = ubi.peb_size | ||||||
|  |             ubi_args[img_seq][volume]['vol_id'] = image.volumes[volume].vol_id | ||||||
|  |             ubi_params[img_seq][volume] = {'flags': ubi_flags, | ||||||
|  |              'args': ubi_args[img_seq][volume], | ||||||
|  |              'ini': ini_params[img_seq][volume]} | ||||||
|  |  | ||||||
|  |     return ubi_params | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ui/common.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubi_reader_arm/ui/common.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										76
									
								
								NeoBoot/ubi_reader/ubifs/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								NeoBoot/ubi_reader/ubifs/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import re | ||||||
|  | import struct | ||||||
|  | from ubifs.defines import * | ||||||
|  | from ubifs import nodes | ||||||
|  | from ubifs.nodes import extract | ||||||
|  | from ubifs.log import log | ||||||
|  |  | ||||||
|  | class ubifs: | ||||||
|  |  | ||||||
|  |     def __init__(self, ubifs_file): | ||||||
|  |         self.log = log() | ||||||
|  |         self._file = ubifs_file | ||||||
|  |         self._sb_node = extract.sb_node(self, UBIFS_COMMON_HDR_SZ) | ||||||
|  |         self._min_io_size = self._sb_node.min_io_size | ||||||
|  |         self._leb_size = self._sb_node.leb_size | ||||||
|  |         self._mst_node = extract.mst_node(self, 1, UBIFS_COMMON_HDR_SZ) | ||||||
|  |         self._mst_node = extract.mst_node(self, 2, UBIFS_COMMON_HDR_SZ) | ||||||
|  |  | ||||||
|  |     def _get_file(self): | ||||||
|  |         return self._file | ||||||
|  |  | ||||||
|  |     file = property(_get_file) | ||||||
|  |  | ||||||
|  |     def _get_superblock(self): | ||||||
|  |         return self._sb_node | ||||||
|  |  | ||||||
|  |     superblock_node = property(_get_superblock) | ||||||
|  |  | ||||||
|  |     def _get_master_node(self): | ||||||
|  |         return self._mst_node | ||||||
|  |  | ||||||
|  |     master_node = property(_get_master_node) | ||||||
|  |  | ||||||
|  |     def _get_master_node2(self): | ||||||
|  |         return self._mst_node | ||||||
|  |  | ||||||
|  |     master_node2 = property(_get_master_node2) | ||||||
|  |  | ||||||
|  |     def _get_leb_size(self): | ||||||
|  |         return self._leb_size | ||||||
|  |  | ||||||
|  |     leb_size = property(_get_leb_size) | ||||||
|  |  | ||||||
|  |     def _get_min_io_size(self): | ||||||
|  |         return self._min_io_size | ||||||
|  |  | ||||||
|  |     min_io_size = property(_get_min_io_size) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_leb_size(path): | ||||||
|  |     f = open(path, 'rb') | ||||||
|  |     f.seek(0, 2) | ||||||
|  |     file_size = f.tell() + 1 | ||||||
|  |     f.seek(0) | ||||||
|  |     block_size = 0 | ||||||
|  |     for i in range(0, file_size, FILE_CHUNK_SZ): | ||||||
|  |         buf = f.read(FILE_CHUNK_SZ) | ||||||
|  |         for m in re.finditer(UBIFS_NODE_MAGIC, buf): | ||||||
|  |             start = m.start() | ||||||
|  |             chdr = nodes.common_hdr(buf[start:start + UBIFS_COMMON_HDR_SZ]) | ||||||
|  |             if chdr and chdr.node_type == UBIFS_SB_NODE: | ||||||
|  |                 sb_start = start + UBIFS_COMMON_HDR_SZ | ||||||
|  |                 sb_end = sb_start + UBIFS_SB_NODE_SZ | ||||||
|  |                 if chdr.len != len(buf[sb_start:sb_end]): | ||||||
|  |                     f.seek(sb_start) | ||||||
|  |                     buf = f.read(UBIFS_SB_NODE_SZ) | ||||||
|  |                 else: | ||||||
|  |                     buf = buf[sb_start:sb_end] | ||||||
|  |                 sbn = nodes.sb_node(buf) | ||||||
|  |                 block_size = sbn.leb_size | ||||||
|  |                 f.close() | ||||||
|  |                 return block_size | ||||||
|  |  | ||||||
|  |     f.close() | ||||||
|  |     return block_size | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										221
									
								
								NeoBoot/ubi_reader/ubifs/defines.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								NeoBoot/ubi_reader/ubifs/defines.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,221 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import struct | ||||||
|  | UBIFS_NODE_MAGIC = '1\x18\x10\x06' | ||||||
|  | UBIFS_CRC32_INIT = 4294967295L | ||||||
|  | UBIFS_MIN_COMPR_LEN = 128 | ||||||
|  | UBIFS_MIN_COMPRESS_DIFF = 64 | ||||||
|  | UBIFS_ROOT_INO = 1 | ||||||
|  | UBIFS_FIRST_INO = 64 | ||||||
|  | UBIFS_MAX_NLEN = 255 | ||||||
|  | UBIFS_MAX_JHEADS = 1 | ||||||
|  | UBIFS_BLOCK_SIZE = 4096 | ||||||
|  | UBIFS_BLOCK_SHIFT = 12 | ||||||
|  | UBIFS_PADDING_BYTE = '\xce' | ||||||
|  | UBIFS_MAX_KEY_LEN = 16 | ||||||
|  | UBIFS_SK_LEN = 8 | ||||||
|  | UBIFS_MIN_FANOUT = 3 | ||||||
|  | UBIFS_MAX_LEVELS = 512 | ||||||
|  | UBIFS_MAX_INO_DATA = UBIFS_BLOCK_SIZE | ||||||
|  | UBIFS_LPT_FANOUT = 4 | ||||||
|  | UBIFS_LPT_FANOUT_SHIFT = 2 | ||||||
|  | UBIFS_LPT_CRC_BITS = 16 | ||||||
|  | UBIFS_LPT_CRC_BYTES = 2 | ||||||
|  | UBIFS_LPT_TYPE_BITS = 4 | ||||||
|  | UBIFS_LPT_PNODE = 0 | ||||||
|  | UBIFS_LPT_NNODE = 1 | ||||||
|  | UBIFS_LPT_LTAB = 2 | ||||||
|  | UBIFS_LPT_LSAVE = 3 | ||||||
|  | UBIFS_LPT_NODE_CNT = 4 | ||||||
|  | UBIFS_LPT_NOT_A_NODE = (1 << UBIFS_LPT_TYPE_BITS) - 1 | ||||||
|  | UBIFS_ITYPE_REG = 0 | ||||||
|  | UBIFS_ITYPE_DIR = 1 | ||||||
|  | UBIFS_ITYPE_LNK = 2 | ||||||
|  | UBIFS_ITYPE_BLK = 3 | ||||||
|  | UBIFS_ITYPE_CHR = 4 | ||||||
|  | UBIFS_ITYPE_FIFO = 5 | ||||||
|  | UBIFS_ITYPE_SOCK = 6 | ||||||
|  | UBIFS_ITYPES_CNT = 7 | ||||||
|  | UBIFS_KEY_HASH_R5 = 0 | ||||||
|  | UBIFS_KEY_HASH_TEST = 1 | ||||||
|  | PRINT_UBIFS_KEY_HASH = ['r5', 'test'] | ||||||
|  | UBIFS_SIMPLE_KEY_FMT = 0 | ||||||
|  | UBIFS_S_KEY_BLOCK_BITS = 29 | ||||||
|  | UBIFS_S_KEY_BLOCK_MASK = 536870911 | ||||||
|  | UBIFS_S_KEY_HASH_BITS = UBIFS_S_KEY_BLOCK_BITS | ||||||
|  | UBIFS_S_KEY_HASH_MASK = UBIFS_S_KEY_BLOCK_MASK | ||||||
|  | UBIFS_INO_KEY = 0 | ||||||
|  | UBIFS_DATA_KEY = 1 | ||||||
|  | UBIFS_DENT_KEY = 2 | ||||||
|  | UBIFS_XENT_KEY = 3 | ||||||
|  | UBIFS_KEY_TYPES_CNT = 4 | ||||||
|  | UBIFS_SB_LEBS = 1 | ||||||
|  | UBIFS_MST_LEBS = 2 | ||||||
|  | UBIFS_SB_LNUM = 0 | ||||||
|  | UBIFS_MST_LNUM = UBIFS_SB_LNUM + UBIFS_SB_LEBS | ||||||
|  | UBIFS_LOG_LNUM = UBIFS_MST_LNUM + UBIFS_MST_LEBS | ||||||
|  | UBIFS_COMPR_FL = 1 | ||||||
|  | UBIFS_SYNC_FL = 2 | ||||||
|  | UBIFS_IMMUTABLE_FL = 4 | ||||||
|  | UBIFS_APPEND_FL = 8 | ||||||
|  | UBIFS_DIRSYNC_FL = 16 | ||||||
|  | UBIFS_XATTR_FL = 32 | ||||||
|  | UBIFS_FL_MASK = 31 | ||||||
|  | UBIFS_COMPR_NONE = 0 | ||||||
|  | UBIFS_COMPR_LZO = 1 | ||||||
|  | UBIFS_COMPR_ZLIB = 2 | ||||||
|  | UBIFS_COMPR_TYPES_CNT = 3 | ||||||
|  | PRINT_UBIFS_COMPR = ['none', 'lzo', 'zlib'] | ||||||
|  | UBIFS_INO_NODE = 0 | ||||||
|  | UBIFS_DATA_NODE = 1 | ||||||
|  | UBIFS_DENT_NODE = 2 | ||||||
|  | UBIFS_XENT_NODE = 3 | ||||||
|  | UBIFS_TRUN_NODE = 4 | ||||||
|  | UBIFS_PAD_NODE = 5 | ||||||
|  | UBIFS_SB_NODE = 6 | ||||||
|  | UBIFS_MST_NODE = 7 | ||||||
|  | UBIFS_REF_NODE = 8 | ||||||
|  | UBIFS_IDX_NODE = 9 | ||||||
|  | UBIFS_CS_NODE = 10 | ||||||
|  | UBIFS_ORPH_NODE = 11 | ||||||
|  | UBIFS_NODE_TYPES_CNT = 12 | ||||||
|  | UBIFS_MST_DIRTY = 1 | ||||||
|  | UBIFS_MST_NO_ORPHS = 2 | ||||||
|  | UBIFS_MST_RCVRY = 4 | ||||||
|  | UBIFS_NO_NODE_GROUP = 0 | ||||||
|  | UBIFS_IN_NODE_GROUP = 1 | ||||||
|  | UBIFS_LAST_OF_NODE_GROUP = 2 | ||||||
|  | UBIFS_FLG_BIGLPT = 2 | ||||||
|  | UBIFS_FLG_SPACE_FIXUP = 4 | ||||||
|  | UBIFS_COMMON_HDR_FORMAT = '<IIQIBB2s' | ||||||
|  | UBIFS_COMMON_HDR_FIELDS = ['magic', | ||||||
|  |  'crc', | ||||||
|  |  'sqnum', | ||||||
|  |  'len', | ||||||
|  |  'node_type', | ||||||
|  |  'group_type', | ||||||
|  |  'padding'] | ||||||
|  | UBIFS_COMMON_HDR_SZ = struct.calcsize(UBIFS_COMMON_HDR_FORMAT) | ||||||
|  | UBIFS_KEY_OFFSET = UBIFS_COMMON_HDR_SZ | ||||||
|  | UBIFS_DEV_DESC_FORMAT = '<IQ' | ||||||
|  | UBIFS_DEV_DESC_FIELDS = ['new', 'huge'] | ||||||
|  | UBIFS_DEV_DESC_SZ = struct.calcsize(UBIFS_DEV_DESC_FORMAT) | ||||||
|  | UBIFS_INO_NODE_FORMAT = '<%ssQQQQQIIIIIIIIIII4sIH26s' % UBIFS_MAX_KEY_LEN | ||||||
|  | UBIFS_INO_NODE_FIELDS = ['key', | ||||||
|  |  'creat_sqnum', | ||||||
|  |  'size', | ||||||
|  |  'atime_sec', | ||||||
|  |  'ctime_sec', | ||||||
|  |  'mtime_sec', | ||||||
|  |  'atime_nsec', | ||||||
|  |  'ctime_nsec', | ||||||
|  |  'mtime_nsec', | ||||||
|  |  'nlink', | ||||||
|  |  'uid', | ||||||
|  |  'gid', | ||||||
|  |  'mode', | ||||||
|  |  'flags', | ||||||
|  |  'data_len', | ||||||
|  |  'xattr_cnt', | ||||||
|  |  'xattr_size', | ||||||
|  |  'padding1', | ||||||
|  |  'xattr_names', | ||||||
|  |  'compr_type', | ||||||
|  |  'padding2'] | ||||||
|  | UBIFS_INO_NODE_SZ = struct.calcsize(UBIFS_INO_NODE_FORMAT) | ||||||
|  | UBIFS_DENT_NODE_FORMAT = '<%ssQBBH4s' % UBIFS_MAX_KEY_LEN | ||||||
|  | UBIFS_DENT_NODE_FIELDS = ['key', | ||||||
|  |  'inum', | ||||||
|  |  'padding1', | ||||||
|  |  'type', | ||||||
|  |  'nlen', | ||||||
|  |  'padding2'] | ||||||
|  | UBIFS_DENT_NODE_SZ = struct.calcsize(UBIFS_DENT_NODE_FORMAT) | ||||||
|  | UBIFS_DATA_NODE_FORMAT = '<%ssIH2s' % UBIFS_MAX_KEY_LEN | ||||||
|  | UBIFS_DATA_NODE_FIELDS = ['key', | ||||||
|  |  'size', | ||||||
|  |  'compr_type', | ||||||
|  |  'padding'] | ||||||
|  | UBIFS_DATA_NODE_SZ = struct.calcsize(UBIFS_DATA_NODE_FORMAT) | ||||||
|  | UBIFS_TRUN_NODE_FORMAT = '<I12sQQ' | ||||||
|  | UBIFS_TRUN_NODE_FIELDS = ['inum', | ||||||
|  |  'padding', | ||||||
|  |  'old_size', | ||||||
|  |  'new_size'] | ||||||
|  | UBIFS_TRUN_NODE_SZ = struct.calcsize(UBIFS_TRUN_NODE_FORMAT) | ||||||
|  | UBIFS_PAD_NODE_FORMAT = '<I' | ||||||
|  | UBIFS_PAD_NODE_FIELDS = ['pad_len'] | ||||||
|  | UBIFS_PAD_NODE_SZ = struct.calcsize(UBIFS_PAD_NODE_FORMAT) | ||||||
|  | UBIFS_SB_NODE_FORMAT = '<2sBBIIIIIQIIIIIIIH2sIIQI16sI3968s' | ||||||
|  | UBIFS_SB_NODE_FIELDS = ['padding', | ||||||
|  |  'key_hash', | ||||||
|  |  'key_fmt', | ||||||
|  |  'flags', | ||||||
|  |  'min_io_size', | ||||||
|  |  'leb_size', | ||||||
|  |  'leb_cnt', | ||||||
|  |  'max_leb_cnt', | ||||||
|  |  'max_bud_bytes', | ||||||
|  |  'log_lebs', | ||||||
|  |  'lpt_lebs', | ||||||
|  |  'orph_lebs', | ||||||
|  |  'jhead_cnt', | ||||||
|  |  'fanout', | ||||||
|  |  'lsave_cnt', | ||||||
|  |  'fmt_version', | ||||||
|  |  'default_compr', | ||||||
|  |  'padding1', | ||||||
|  |  'rp_uid', | ||||||
|  |  'rp_gid', | ||||||
|  |  'rp_size', | ||||||
|  |  'time_gran', | ||||||
|  |  'uuid', | ||||||
|  |  'ro_compat_version', | ||||||
|  |  'padding2'] | ||||||
|  | UBIFS_SB_NODE_SZ = struct.calcsize(UBIFS_SB_NODE_FORMAT) | ||||||
|  | UBIFS_MST_NODE_FORMAT = '<QQIIIIIIIIQQQQQQIIIIIIIIIIII344s' | ||||||
|  | UBIFS_MST_NODE_FIELDS = ['highest_inum', | ||||||
|  |  'cmt_no', | ||||||
|  |  'flags', | ||||||
|  |  'log_lnum', | ||||||
|  |  'root_lnum', | ||||||
|  |  'root_offs', | ||||||
|  |  'root_len', | ||||||
|  |  'gc_lnum', | ||||||
|  |  'ihead_lnum', | ||||||
|  |  'ihead_offs', | ||||||
|  |  'index_size', | ||||||
|  |  'total_free', | ||||||
|  |  'total_dirty', | ||||||
|  |  'total_used', | ||||||
|  |  'total_dead', | ||||||
|  |  'total_dark', | ||||||
|  |  'lpt_lnum', | ||||||
|  |  'lpt_offs', | ||||||
|  |  'nhead_lnum', | ||||||
|  |  'nhead_offs', | ||||||
|  |  'ltab_lnum', | ||||||
|  |  'ltab_offs', | ||||||
|  |  'lsave_lnum', | ||||||
|  |  'lsave_offs', | ||||||
|  |  'lscan_lnum', | ||||||
|  |  'empty_lebs', | ||||||
|  |  'idx_lebs', | ||||||
|  |  'leb_cnt', | ||||||
|  |  'padding'] | ||||||
|  | UBIFS_MST_NODE_SZ = struct.calcsize(UBIFS_MST_NODE_FORMAT) | ||||||
|  | UBIFS_REF_NODE_FORMAT = '<III28s' | ||||||
|  | UBIFS_REF_NODE_FIELDS = ['lnum', | ||||||
|  |  'offs', | ||||||
|  |  'jhead', | ||||||
|  |  'padding'] | ||||||
|  | UBIFS_REF_NODE_SZ = struct.calcsize(UBIFS_REF_NODE_FORMAT) | ||||||
|  | UBIFS_BRANCH_FORMAT = '<III%ss' % UBIFS_SK_LEN | ||||||
|  | UBIFS_BRANCH_FIELDS = ['lnum', | ||||||
|  |  'offs', | ||||||
|  |  'len', | ||||||
|  |  'key'] | ||||||
|  | UBIFS_BRANCH_SZ = struct.calcsize(UBIFS_BRANCH_FORMAT) | ||||||
|  | UBIFS_IDX_NODE_FORMAT = '<HH' | ||||||
|  | UBIFS_IDX_NODE_FIELDS = ['child_cnt', 'level'] | ||||||
|  | UBIFS_IDX_NODE_SZ = struct.calcsize(UBIFS_IDX_NODE_FORMAT) | ||||||
|  | FILE_CHUNK_SZ = 5242880 | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/defines.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/defines.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										33
									
								
								NeoBoot/ubi_reader/ubifs/log.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								NeoBoot/ubi_reader/ubifs/log.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import os | ||||||
|  | import sys | ||||||
|  | import ui | ||||||
|  |  | ||||||
|  | class log: | ||||||
|  |  | ||||||
|  |     def __init__(self): | ||||||
|  |         self.log_to_file = False | ||||||
|  |         self.log_file = 'ubifs_output.log' | ||||||
|  |         self.exit_on_except = False | ||||||
|  |         self.quiet = False | ||||||
|  |  | ||||||
|  |     def _out(self, s): | ||||||
|  |         if not self.quiet: | ||||||
|  |             if self.log_to_file: | ||||||
|  |                 with open(os.path.join(ui.common.output_dir, self.log_file), 'a') as f: | ||||||
|  |                     f.write('%s\n' % s) | ||||||
|  |                 f.close() | ||||||
|  |             else: | ||||||
|  |                 print '%s' % s | ||||||
|  |         if self.exit_on_except: | ||||||
|  |             sys.exit() | ||||||
|  |  | ||||||
|  |     def write(self, s): | ||||||
|  |         self._out(s) | ||||||
|  |  | ||||||
|  |     def write_node(self, n): | ||||||
|  |         buf = '%s\n' % n | ||||||
|  |         for key, value in n: | ||||||
|  |             buf += '\t%s: %s\n' % (key, value) | ||||||
|  |  | ||||||
|  |         self._out(buf) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/log.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/log.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/lzo.so
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/lzo.so
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										46
									
								
								NeoBoot/ubi_reader/ubifs/misc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								NeoBoot/ubi_reader/ubifs/misc.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | #import lzo | ||||||
|  | import struct | ||||||
|  | import zlib | ||||||
|  | from ubifs.defines import * | ||||||
|  | ino_types = ['file', | ||||||
|  |  'dir', | ||||||
|  |  'lnk', | ||||||
|  |  'blk', | ||||||
|  |  'chr', | ||||||
|  |  'fifo', | ||||||
|  |  'sock'] | ||||||
|  | node_types = ['ino', | ||||||
|  |  'data', | ||||||
|  |  'dent', | ||||||
|  |  'xent', | ||||||
|  |  'trun', | ||||||
|  |  'pad', | ||||||
|  |  'sb', | ||||||
|  |  'mst', | ||||||
|  |  'ref', | ||||||
|  |  'idx', | ||||||
|  |  'cs', | ||||||
|  |  'orph'] | ||||||
|  | key_types = ['ino', | ||||||
|  |  'data', | ||||||
|  |  'dent', | ||||||
|  |  'xent'] | ||||||
|  |  | ||||||
|  | def parse_key(key): | ||||||
|  |     hkey, lkey = struct.unpack('<II', key[0:UBIFS_SK_LEN]) | ||||||
|  |     ino_num = hkey & UBIFS_S_KEY_HASH_MASK | ||||||
|  |     key_type = lkey >> UBIFS_S_KEY_BLOCK_BITS | ||||||
|  |     khash = lkey | ||||||
|  |     return {'type': key_type, | ||||||
|  |      'ino_num': ino_num, | ||||||
|  |      'khash': khash} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def decompress(ctype, unc_len, data): | ||||||
|  |     #if ctype == UBIFS_COMPR_LZO: | ||||||
|  |         #return lzo.decompress(''.join(('\xf0', struct.pack('>I', unc_len), data))) | ||||||
|  |     if ctype == UBIFS_COMPR_ZLIB: | ||||||
|  |         return zlib.decompress(data, -11) | ||||||
|  |     else: | ||||||
|  |         return data | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/misc.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/misc.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										151
									
								
								NeoBoot/ubi_reader/ubifs/nodes/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								NeoBoot/ubi_reader/ubifs/nodes/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import struct | ||||||
|  | from ubifs.defines import * | ||||||
|  | from ubifs.misc import parse_key | ||||||
|  |  | ||||||
|  | class common_hdr(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_COMMON_HDR_FIELDS, struct.unpack(UBIFS_COMMON_HDR_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'errors', []) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Common Header' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class sb_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_SB_NODE_FIELDS, struct.unpack(UBIFS_SB_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Super Block Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class mst_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_MST_NODE_FIELDS, struct.unpack(UBIFS_MST_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Master Block Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class dent_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_DENT_NODE_FIELDS, struct.unpack(UBIFS_DENT_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             if key == 'key': | ||||||
|  |                 setattr(self, key, parse_key(fields[key])) | ||||||
|  |             else: | ||||||
|  |                 setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'name', '') | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Directory Entry Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class data_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_DATA_NODE_FIELDS, struct.unpack(UBIFS_DATA_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             if key == 'key': | ||||||
|  |                 setattr(self, key, parse_key(fields[key])) | ||||||
|  |             else: | ||||||
|  |                 setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'offset', 0) | ||||||
|  |         setattr(self, 'compr_len', 0) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Data Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class idx_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_IDX_NODE_FIELDS, struct.unpack(UBIFS_IDX_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'branches', []) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Index Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class ino_node(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_INO_NODE_FIELDS, struct.unpack(UBIFS_INO_NODE_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             if key == 'key': | ||||||
|  |                 setattr(self, key, parse_key(fields[key])) | ||||||
|  |             else: | ||||||
|  |                 setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |         setattr(self, 'data', '') | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Ino Node' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class branch(object): | ||||||
|  |  | ||||||
|  |     def __init__(self, buf): | ||||||
|  |         fields = dict(zip(UBIFS_BRANCH_FIELDS, struct.unpack(UBIFS_BRANCH_FORMAT, buf))) | ||||||
|  |         for key in fields: | ||||||
|  |             setattr(self, key, fields[key]) | ||||||
|  |  | ||||||
|  |     def __repr__(self): | ||||||
|  |         return 'UBIFS Branch' | ||||||
|  |  | ||||||
|  |     def __iter__(self): | ||||||
|  |         for key in dir(self): | ||||||
|  |             if not key.startswith('_'): | ||||||
|  |                 yield (key, getattr(self, key)) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/nodes/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/nodes/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										48
									
								
								NeoBoot/ubi_reader/ubifs/nodes/extract.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								NeoBoot/ubi_reader/ubifs/nodes/extract.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubifs import nodes | ||||||
|  | from ubifs.defines import * | ||||||
|  |  | ||||||
|  | def common_hdr(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     return nodes.common_hdr(ubifs.file.read(UBIFS_COMMON_HDR_SZ)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def ino_node(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     inon = nodes.ino_node(ubifs.file.read(UBIFS_INO_NODE_SZ)) | ||||||
|  |     inon.data = ubifs.file.read(inon.data_len) | ||||||
|  |     return inon | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def mst_node(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     return nodes.mst_node(ubifs.file.read(UBIFS_MST_NODE_SZ)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def sb_node(ubifs, offset = 0): | ||||||
|  |     ubifs.file.seek(offset) | ||||||
|  |     return nodes.sb_node(ubifs.file.read(UBIFS_SB_NODE_SZ)) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def dent_node(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     den = nodes.dent_node(ubifs.file.read(UBIFS_DENT_NODE_SZ)) | ||||||
|  |     den.name = '%s' % ubifs.file.read(den.nlen) | ||||||
|  |     return den | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def data_node(ubifs, lnum, offset = 0, node_len = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     datn = nodes.data_node(ubifs.file.read(UBIFS_DATA_NODE_SZ)) | ||||||
|  |     datn.offset = ubifs.leb_size * lnum + offset + UBIFS_DATA_NODE_SZ | ||||||
|  |     datn.compr_len = node_len - UBIFS_COMMON_HDR_SZ - UBIFS_DATA_NODE_SZ | ||||||
|  |     return datn | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def idx_node(ubifs, lnum, offset = 0): | ||||||
|  |     ubifs.file.seek(ubifs.leb_size * lnum + offset) | ||||||
|  |     idxn = nodes.idx_node(ubifs.file.read(UBIFS_IDX_NODE_SZ)) | ||||||
|  |     for i in range(0, idxn.child_cnt): | ||||||
|  |         idxn.branches.append(nodes.branch(ubifs.file.read(UBIFS_BRANCH_SZ))) | ||||||
|  |  | ||||||
|  |     return idxn | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/nodes/extract.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/nodes/extract.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										114
									
								
								NeoBoot/ubi_reader/ubifs/output.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								NeoBoot/ubi_reader/ubifs/output.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import os | ||||||
|  | import struct | ||||||
|  | from ubifs.defines import * | ||||||
|  | from ubifs.misc import decompress | ||||||
|  |  | ||||||
|  | def dents(ubifs, inodes, dent_node, path = '', perms = False): | ||||||
|  |     inode = inodes[dent_node.inum] | ||||||
|  |     dent_path = os.path.join(path, dent_node.name) | ||||||
|  |     if dent_node.type == UBIFS_ITYPE_DIR: | ||||||
|  |         try: | ||||||
|  |             if not os.path.exists(dent_path): | ||||||
|  |                 os.mkdir(dent_path) | ||||||
|  |                 if perms: | ||||||
|  |                     set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('DIR Fail: %s' % e) | ||||||
|  |  | ||||||
|  |         if 'dent' in inode: | ||||||
|  |             for dnode in inode['dent']: | ||||||
|  |                 dents(ubifs, inodes, dnode, dent_path, perms) | ||||||
|  |  | ||||||
|  |     elif dent_node.type == UBIFS_ITYPE_REG: | ||||||
|  |         try: | ||||||
|  |             if inode['ino'].nlink > 1: | ||||||
|  |                 if 'hlink' not in inode: | ||||||
|  |                     inode['hlink'] = dent_path | ||||||
|  |                     buf = process_reg_file(ubifs, inode, dent_path) | ||||||
|  |                     write_reg_file(dent_path, buf) | ||||||
|  |                 else: | ||||||
|  |                     os.link(inode['hlink'], dent_path) | ||||||
|  |             else: | ||||||
|  |                 buf = process_reg_file(ubifs, inode, dent_path) | ||||||
|  |                 write_reg_file(dent_path, buf) | ||||||
|  |             if perms: | ||||||
|  |                 set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('FILE Fail: %s' % e) | ||||||
|  |  | ||||||
|  |     elif dent_node.type == UBIFS_ITYPE_LNK: | ||||||
|  |         try: | ||||||
|  |             os.symlink('%s' % inode['ino'].data, dent_path) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('SYMLINK Fail: %s : %s' % (inode['ino'].data, dent_path)) | ||||||
|  |  | ||||||
|  |     elif dent_node.type in [UBIFS_ITYPE_BLK, UBIFS_ITYPE_CHR]: | ||||||
|  |         try: | ||||||
|  |             dev = struct.unpack('<II', inode['ino'].data)[0] | ||||||
|  |             if perms: | ||||||
|  |                 os.mknod(dent_path, inode['ino'].mode, dev) | ||||||
|  |                 if perms: | ||||||
|  |                     set_file_perms(path, inode) | ||||||
|  |             else: | ||||||
|  |                 write_reg_file(dent_path, str(dev)) | ||||||
|  |                 if perms: | ||||||
|  |                     set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('DEV Fail: %s : %s' % (dent_path, e)) | ||||||
|  |  | ||||||
|  |     elif dent_node.type == UBIFS_ITYPE_FIFO: | ||||||
|  |         try: | ||||||
|  |             os.mkfifo(dent_path, inode['ino'].mode) | ||||||
|  |             if perms: | ||||||
|  |                 set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('FIFO Fail: %s : %s' % (dent_path, e)) | ||||||
|  |  | ||||||
|  |     elif dent_node.type == UBIFS_ITYPE_SOCK: | ||||||
|  |         try: | ||||||
|  |             write_reg_file(dent_path, '') | ||||||
|  |             if perms: | ||||||
|  |                 set_file_perms(dent_path, inode) | ||||||
|  |         except Exception as e: | ||||||
|  |             ubifs.log.write('SOCK Fail: %s' % dent_path) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def set_file_perms(path, inode): | ||||||
|  |     try: | ||||||
|  |         os.chmod(path, inode['ino'].mode) | ||||||
|  |         os.chown(path, inode['ino'].uid, inode['ino'].gid) | ||||||
|  |     except: | ||||||
|  |         raise Exception('Failed File Permissions: %s' % path) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def write_reg_file(path, data): | ||||||
|  |     with open(path, 'wb') as f: | ||||||
|  |         f.write(data) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def process_reg_file(ubifs, inode, path): | ||||||
|  |     try: | ||||||
|  |         buf = '' | ||||||
|  |         if 'data' in inode: | ||||||
|  |             compr_type = 0 | ||||||
|  |             sorted_data = sorted(inode['data'], key=lambda x: x.key['khash']) | ||||||
|  |             last_khash = sorted_data[0].key['khash'] - 1 | ||||||
|  |             for data in sorted_data: | ||||||
|  |                 if data.key['khash'] - last_khash != 1: | ||||||
|  |                     while 1 != data.key['khash'] - last_khash: | ||||||
|  |                         buf += '\x00' * UBIFS_BLOCK_SIZE | ||||||
|  |                         last_khash += 1 | ||||||
|  |  | ||||||
|  |                 compr_type = data.compr_type | ||||||
|  |                 ubifs.file.seek(data.offset) | ||||||
|  |                 d = ubifs.file.read(data.compr_len) | ||||||
|  |                 buf += decompress(compr_type, data.size, d) | ||||||
|  |                 last_khash = data.key['khash'] | ||||||
|  |  | ||||||
|  |     except Exception as e: | ||||||
|  |         raise Exception('inode num:%s :%s' % (inode['ino'].key['ino_num'], e)) | ||||||
|  |  | ||||||
|  |     if inode['ino'].size > len(buf): | ||||||
|  |         buf += '\x00' * (inode['ino'].size - len(buf)) | ||||||
|  |     return buf | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/output.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/output.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										33
									
								
								NeoBoot/ubi_reader/ubifs/walk.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								NeoBoot/ubi_reader/ubifs/walk.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | from ubifs import extract | ||||||
|  | from ubifs.defines import * | ||||||
|  |  | ||||||
|  | def index(ubifs, lnum, offset, inodes = {}): | ||||||
|  |     chdr = extract.common_hdr(ubifs, lnum, offset) | ||||||
|  |     if chdr.node_type == UBIFS_IDX_NODE: | ||||||
|  |         idxn = extract.idx_node(ubifs, lnum, offset + UBIFS_COMMON_HDR_SZ) | ||||||
|  |         for branch in idxn.branches: | ||||||
|  |             index(ubifs, branch.lnum, branch.offs, inodes) | ||||||
|  |  | ||||||
|  |     elif chdr.node_type == UBIFS_INO_NODE: | ||||||
|  |         inon = extract.ino_node(ubifs, lnum, offset + UBIFS_COMMON_HDR_SZ) | ||||||
|  |         ino_num = inon.key['ino_num'] | ||||||
|  |         if ino_num not in inodes: | ||||||
|  |             inodes[ino_num] = {} | ||||||
|  |         inodes[ino_num]['ino'] = inon | ||||||
|  |     elif chdr.node_type == UBIFS_DATA_NODE: | ||||||
|  |         datn = extract.data_node(ubifs, lnum, offset + UBIFS_COMMON_HDR_SZ, chdr.len) | ||||||
|  |         ino_num = datn.key['ino_num'] | ||||||
|  |         if ino_num not in inodes: | ||||||
|  |             inodes[ino_num] = {} | ||||||
|  |         if 'data' not in inodes[ino_num]: | ||||||
|  |             inodes[ino_num]['data'] = [] | ||||||
|  |         inodes[ino_num]['data'].append(datn) | ||||||
|  |     elif chdr.node_type == UBIFS_DENT_NODE: | ||||||
|  |         dn = extract.dent_node(ubifs, lnum, offset + UBIFS_COMMON_HDR_SZ) | ||||||
|  |         ino_num = dn.key['ino_num'] | ||||||
|  |         if ino_num not in inodes: | ||||||
|  |             inodes[ino_num] = {} | ||||||
|  |         if 'dent' not in inodes[ino_num]: | ||||||
|  |             inodes[ino_num]['dent'] = [] | ||||||
|  |         inodes[ino_num]['dent'].append(dn) | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/walk.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ubifs/walk.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ui/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ui/__init__.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										88
									
								
								NeoBoot/ubi_reader/ui/common.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								NeoBoot/ubi_reader/ui/common.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | |||||||
|  | #!/usr/bin/python | ||||||
|  | import os | ||||||
|  | from ubi_io import leb_virtual_file | ||||||
|  | from ubifs import ubifs, walk, output | ||||||
|  | from ubifs.defines import PRINT_UBIFS_KEY_HASH, PRINT_UBIFS_COMPR | ||||||
|  | from ubi.defines import PRINT_VOL_TYPE_LIST, UBI_VTBL_AUTORESIZE_FLG | ||||||
|  | output_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'output') | ||||||
|  |  | ||||||
|  | def extract_files(ubifs, out_path, perms = False): | ||||||
|  |     try: | ||||||
|  |         inodes = {} | ||||||
|  |         walk.index(ubifs, ubifs.master_node.root_lnum, ubifs.master_node.root_offs, inodes) | ||||||
|  |         for dent in inodes[1]['dent']: | ||||||
|  |             output.dents(ubifs, inodes, dent, out_path, perms) | ||||||
|  |  | ||||||
|  |     except Exception as e: | ||||||
|  |         import traceback | ||||||
|  |         ubifs.log.write('%s' % e) | ||||||
|  |         traceback.print_exc() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def get_ubi_params(ubi): | ||||||
|  |     ubi_flags = {'min_io_size': '-m', | ||||||
|  |      'max_bud_bytes': '-j', | ||||||
|  |      'leb_size': '-e', | ||||||
|  |      'default_compr': '-x', | ||||||
|  |      'sub_page_size': '-s', | ||||||
|  |      'fanout': '-f', | ||||||
|  |      'key_hash': '-k', | ||||||
|  |      'orph_lebs': '-p', | ||||||
|  |      'log_lebs': '-l', | ||||||
|  |      'max_leb_cnt': '-c', | ||||||
|  |      'peb_size': '-p', | ||||||
|  |      'sub_page_size': '-s', | ||||||
|  |      'vid_hdr_offset': '-O', | ||||||
|  |      'version': '-x', | ||||||
|  |      'image_seq': '-Q', | ||||||
|  |      'alignment': '-a', | ||||||
|  |      'vol_id': '-n', | ||||||
|  |      'name': '-N'} | ||||||
|  |     ubi_params = {} | ||||||
|  |     ubi_args = {} | ||||||
|  |     ini_params = {} | ||||||
|  |     for image in ubi.images: | ||||||
|  |         img_seq = image.image_seq | ||||||
|  |         ubi_params[img_seq] = {} | ||||||
|  |         ubi_args[img_seq] = {} | ||||||
|  |         ini_params[img_seq] = {} | ||||||
|  |         for volume in image.volumes: | ||||||
|  |             ubi_args[img_seq][volume] = {} | ||||||
|  |             ini_params[img_seq][volume] = {} | ||||||
|  |             ini_params[img_seq][volume]['vol_type'] = PRINT_VOL_TYPE_LIST[image.volumes[volume].vol_rec.vol_type] | ||||||
|  |             if image.volumes[volume].vol_rec.flags == UBI_VTBL_AUTORESIZE_FLG: | ||||||
|  |                 ini_params[img_seq][volume]['vol_flags'] = 'autoresize' | ||||||
|  |             else: | ||||||
|  |                 ini_params[img_seq][volume]['vol_flags'] = image.volumes[volume].vol_rec.flags | ||||||
|  |             ini_params[img_seq][volume]['vol_id'] = image.volumes[volume].vol_id | ||||||
|  |             ini_params[img_seq][volume]['vol_name'] = image.volumes[volume].name.rstrip('\x00') | ||||||
|  |             ini_params[img_seq][volume]['vol_alignment'] = image.volumes[volume].vol_rec.alignment | ||||||
|  |             ini_params[img_seq][volume]['vol_size'] = image.volumes[volume].vol_rec.reserved_pebs * ubi.leb_size | ||||||
|  |             ufsfile = leb_virtual_file(ubi, image.volumes[volume]) | ||||||
|  |             uubifs = ubifs(ufsfile) | ||||||
|  |             for key, value in uubifs.superblock_node: | ||||||
|  |                 if key == 'key_hash': | ||||||
|  |                     value = PRINT_UBIFS_KEY_HASH[value] | ||||||
|  |                 elif key == 'default_compr': | ||||||
|  |                     value = PRINT_UBIFS_COMPR[value] | ||||||
|  |                 if key in ubi_flags: | ||||||
|  |                     ubi_args[img_seq][volume][key] = value | ||||||
|  |  | ||||||
|  |             for key, value in image.volumes[volume].vol_rec: | ||||||
|  |                 if key == 'name': | ||||||
|  |                     value = value.rstrip('\x00') | ||||||
|  |                 if key in ubi_flags: | ||||||
|  |                     ubi_args[img_seq][volume][key] = value | ||||||
|  |  | ||||||
|  |             ubi_args[img_seq][volume]['version'] = image.version | ||||||
|  |             ubi_args[img_seq][volume]['vid_hdr_offset'] = image.vid_hdr_offset | ||||||
|  |             ubi_args[img_seq][volume]['sub_page_size'] = ubi_args[img_seq][volume]['vid_hdr_offset'] | ||||||
|  |             ubi_args[img_seq][volume]['sub_page_size'] = ubi_args[img_seq][volume]['vid_hdr_offset'] | ||||||
|  |             ubi_args[img_seq][volume]['image_seq'] = image.image_seq | ||||||
|  |             ubi_args[img_seq][volume]['peb_size'] = ubi.peb_size | ||||||
|  |             ubi_args[img_seq][volume]['vol_id'] = image.volumes[volume].vol_id | ||||||
|  |             ubi_params[img_seq][volume] = {'flags': ubi_flags, | ||||||
|  |              'args': ubi_args[img_seq][volume], | ||||||
|  |              'ini': ini_params[img_seq][volume]} | ||||||
|  |  | ||||||
|  |     return ubi_params | ||||||
							
								
								
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ui/common.pyo
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								NeoBoot/ubi_reader/ui/common.pyo
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user