From fcf6cd5f80396632f9213d036a2a020fb798c103 Mon Sep 17 00:00:00 2001 From: gutosie Date: Tue, 7 Jan 2020 11:11:45 +0200 Subject: [PATCH] Add files via upload --- NeoBoot/ubi_reader_mips/ubi/__init__.py | 139 +++++++++++ NeoBoot/ubi_reader_mips/ubi/__init__.pyo | Bin 0 -> 6092 bytes NeoBoot/ubi_reader_mips/ubi/block/__init__.py | 59 +++++ .../ubi_reader_mips/ubi/block/__init__.pyo | Bin 0 -> 3082 bytes NeoBoot/ubi_reader_mips/ubi/block/layout.py | 23 ++ NeoBoot/ubi_reader_mips/ubi/block/layout.pyo | Bin 0 -> 1098 bytes NeoBoot/ubi_reader_mips/ubi/block/sort.py | 84 +++++++ NeoBoot/ubi_reader_mips/ubi/block/sort.pyo | Bin 0 -> 3053 bytes NeoBoot/ubi_reader_mips/ubi/defines.py | 63 +++++ NeoBoot/ubi_reader_mips/ubi/defines.pyo | Bin 0 -> 1675 bytes NeoBoot/ubi_reader_mips/ubi/display.py | 108 +++++++++ NeoBoot/ubi_reader_mips/ubi/display.pyo | Bin 0 -> 4528 bytes .../ubi_reader_mips/ubi/headers/__init__.py | 89 +++++++ .../ubi_reader_mips/ubi/headers/__init__.pyo | Bin 0 -> 4756 bytes NeoBoot/ubi_reader_mips/ubi/headers/errors.py | 28 +++ .../ubi_reader_mips/ubi/headers/errors.pyo | Bin 0 -> 1395 bytes NeoBoot/ubi_reader_mips/ubi/image.py | 38 +++ NeoBoot/ubi_reader_mips/ubi/image.pyo | Bin 0 -> 2424 bytes .../ubi_reader_mips/ubi/volume/__init__.py | 67 ++++++ .../ubi_reader_mips/ubi/volume/__init__.pyo | Bin 0 -> 3655 bytes NeoBoot/ubi_reader_mips/ubi_extract_files.py | 64 +++++ NeoBoot/ubi_reader_mips/ubi_io/__init__.py | 116 +++++++++ NeoBoot/ubi_reader_mips/ubi_io/__init__.pyo | Bin 0 -> 5903 bytes NeoBoot/ubi_reader_mips/ubifs/__init__.py | 76 ++++++ NeoBoot/ubi_reader_mips/ubifs/__init__.pyo | Bin 0 -> 3424 bytes NeoBoot/ubi_reader_mips/ubifs/defines.py | 221 ++++++++++++++++++ NeoBoot/ubi_reader_mips/ubifs/defines.pyo | Bin 0 -> 6182 bytes NeoBoot/ubi_reader_mips/ubifs/log.py | 33 +++ NeoBoot/ubi_reader_mips/ubifs/log.pyo | Bin 0 -> 1719 bytes NeoBoot/ubi_reader_mips/ubifs/lzo.so | Bin 0 -> 11560 bytes NeoBoot/ubi_reader_mips/ubifs/misc.py | 46 ++++ NeoBoot/ubi_reader_mips/ubifs/misc.pyo | Bin 0 -> 1465 bytes .../ubi_reader_mips/ubifs/nodes/__init__.py | 151 ++++++++++++ .../ubi_reader_mips/ubifs/nodes/__init__.pyo | Bin 0 -> 9150 bytes .../ubi_reader_mips/ubifs/nodes/extract.py | 48 ++++ .../ubi_reader_mips/ubifs/nodes/extract.pyo | Bin 0 -> 2805 bytes NeoBoot/ubi_reader_mips/ubifs/output.py | 114 +++++++++ NeoBoot/ubi_reader_mips/ubifs/output.pyo | Bin 0 -> 3904 bytes NeoBoot/ubi_reader_mips/ubifs/walk.py | 33 +++ NeoBoot/ubi_reader_mips/ubifs/walk.pyo | Bin 0 -> 1342 bytes NeoBoot/ubi_reader_mips/ui/__init__.py | 1 + NeoBoot/ubi_reader_mips/ui/__init__.pyo | Bin 0 -> 163 bytes NeoBoot/ubi_reader_mips/ui/common.py | 88 +++++++ NeoBoot/ubi_reader_mips/ui/common.pyo | Bin 0 -> 3282 bytes 44 files changed, 1689 insertions(+) create mode 100644 NeoBoot/ubi_reader_mips/ubi/__init__.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/__init__.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi/block/__init__.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/block/__init__.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi/block/layout.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/block/layout.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi/block/sort.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/block/sort.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi/defines.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/defines.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi/display.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/display.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi/headers/__init__.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/headers/__init__.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi/headers/errors.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/headers/errors.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi/image.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/image.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi/volume/__init__.py create mode 100644 NeoBoot/ubi_reader_mips/ubi/volume/__init__.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubi_extract_files.py create mode 100644 NeoBoot/ubi_reader_mips/ubi_io/__init__.py create mode 100644 NeoBoot/ubi_reader_mips/ubi_io/__init__.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubifs/__init__.py create mode 100644 NeoBoot/ubi_reader_mips/ubifs/__init__.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubifs/defines.py create mode 100644 NeoBoot/ubi_reader_mips/ubifs/defines.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubifs/log.py create mode 100644 NeoBoot/ubi_reader_mips/ubifs/log.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubifs/lzo.so create mode 100644 NeoBoot/ubi_reader_mips/ubifs/misc.py create mode 100644 NeoBoot/ubi_reader_mips/ubifs/misc.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubifs/nodes/__init__.py create mode 100644 NeoBoot/ubi_reader_mips/ubifs/nodes/__init__.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubifs/nodes/extract.py create mode 100644 NeoBoot/ubi_reader_mips/ubifs/nodes/extract.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubifs/output.py create mode 100644 NeoBoot/ubi_reader_mips/ubifs/output.pyo create mode 100644 NeoBoot/ubi_reader_mips/ubifs/walk.py create mode 100644 NeoBoot/ubi_reader_mips/ubifs/walk.pyo create mode 100644 NeoBoot/ubi_reader_mips/ui/__init__.py create mode 100644 NeoBoot/ubi_reader_mips/ui/__init__.pyo create mode 100644 NeoBoot/ubi_reader_mips/ui/common.py create mode 100644 NeoBoot/ubi_reader_mips/ui/common.pyo diff --git a/NeoBoot/ubi_reader_mips/ubi/__init__.py b/NeoBoot/ubi_reader_mips/ubi/__init__.py new file mode 100644 index 0000000..8da31e4 --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubi/__init__.py @@ -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 \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubi/__init__.pyo b/NeoBoot/ubi_reader_mips/ubi/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..ca8b1f64fbb2a2831f0a4ae85dbdfed922a93639 GIT binary patch literal 6092 zcmc&&OLH5?5$**@kN^R`B$}i|$+8o>;G{~3orm&}okXN;t75b4l^r^;RT}`ipcY*0 zg1ZBSOo5lkha6Km+kH7up ztDfXPW&HmYzU;3keEc~QiL`CKB#|S-lC(?Wu&*ppS%y>6o|56Tw5MfQk#@!QO-VE( zpOI=>qFEVMrCqf>6^UvxoRfClwr6yfhO`@K&x$`MepS8}c`EX|Hrh2d+Vf=PVY3dl z!vElByXl~6=1}Yg#(R=P<6)3B$-kLGktL}y%Xx1%N_u;l7sg%`X2#3|4h~G(=^4*< z*~vKL_iS|rRX@x|QRnbvAwS4^X*e=r5?inWDo`Y2W4Q3R8}{%|f7rf z;JkwK3NDC0qu`=~iwZ6Y6wig0bKSSEXfMiTd5R6cT5Q9L;ww7p748*Bttz;x;F|b# z1=kf^SMZwn4F#_&cwNB_@v*53@-@W2A@0NGBGlC@p{U`bYB%v^pFn>TM8E0#%MyG4qZQ~1Y|Y9pw1BZ2a`3L08x)K(t4Uz&)}uG&$O^O}gPUSrEoPaO zNmbTC0@cVMpo#h=SN~<8p|H)pmP5%xg>)!2N?>phw8n1I#J9hn_hc1?CFr?Rm;) zwdZw-xZg3IGw4;KVXSBW`HpeC7bky+&vekPLKCDSJxl*@b|rS&4{i=$i$YTZ?uj7Q$6Lv_+Y zy+B~@NhiyaUf3}~E`n(QJhKN@{o$~)3t_lfX(xs+cjfg zS=r4c+c^*F9m%$ep)GZ|xss28Lb(bofWDJ=K1q7bKw-vwtG--2^fTSQjST6fl*>!@!yJ+fGQ zn;gq6Cp&Z!;%@DrhIdTUniRs;F1`og?VJy+A6j5 zvMlqUTqesa1y^ftw(evvoR$rJ4v@5q~{Npf{IZi`KP z7wh)vE<9Y`XCEzFKwsAJDEpV_E0uHW+)q8XJ~#*GH>l)GY+QKKg%5Q?K?e z9WbsVpWD_tYiH0 zgk^)OjREN~7-Oh|p$A77ECnV5PlIrV35YXh!w0a-=iZ64(U`<^x)<(mTrU25e7VIm zZ=#;RJ>$+W@H|6%_q<`^k0Uf)-ox(O1=T1`MnP&0UA6sp2=f(hpG)o!+2&q9`xbG3 z1kinz1@A?TpI&fhx<4s8UvMG0ci71tIpyu$pQ7#ljKym#cx$OR#nEm1Q_#c#G6k?s5Flei>tq{!pqP?XWEGD48HOMHSzwwVMp^+u83O#R zM@AD57&WaBR;tK>OFI}KFMuc>DIv!B?=ep>nPK_@vm-HplXn7$9rt{v9=Bf9T+EXVQQ(;9l9J2C_qlhPxsE zg}hptv_Xx3anRyC5DxaVVuC1gzr%hKz5n2&``+eHV}O?0-&1sY@^VF=%OIx*oG{9|}5_Y+U>XDfGI88jcv<;iZqSIoh zA7E>PO#O%YtK(tnh+Vp5_YD@@D7TB^L~$4C(bVkj+PmXD@~ug`I^^Gg2B^8k(v|jq E0dMS8)&Kwi literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubi/block/__init__.py b/NeoBoot/ubi_reader_mips/ubi/block/__init__.py new file mode 100644 index 0000000..7d8c1de --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubi/block/__init__.py @@ -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 \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubi/block/__init__.pyo b/NeoBoot/ubi_reader_mips/ubi/block/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..4865745f9ed746f4526cf547dc675b7063484c25 GIT binary patch literal 3082 zcmcgu&2Ah;5U!s6x7Ue@V>^h17(&7dq%49%L=;8DKY*oViDpdzD^Y89X4and?967m zH#jIcIRcJINSrzIC>#(Ez%y{+0pP2e8GFOs@w$7ftE;N3s;leU%0CNpzy9*mL!XMj z3cf$VFb^>W_*WDY?dG&Yv7)g7UCAZ(HLeytP9yN>&46}@bpz(}I9}_T^bHo^L!5E25jci?r z2JPjXCfOD}gNj3Tj@~-THRoAqG*6>8nZL*`utdQ*b3)j&v|4J^gk7W2BH7pIK$g1k ze`fYO*>f|-mgsVEVv`baXap1ISxr04vCCqjNf4X-U3$MFOmVNB&MWo|YHez>-YN&% z?{G2n*eOqsB=+8G@ z-QUHXKq%i7GRxA;i1AXjJetiFbQuG)*xZBd%~^YJMMr^MDR#GeJ6mq=&RzZBi@UnN zbI0AWi+pO~TIq0JvYz!y>zsg?)5F9dMSNWAh?zC4yaUi)90eUNOc66-Jd`vH;?zIT zgXyq?Et1K64XQgeSvQUb-7tyv#@>hB$y2+ZCf)n-bT3Lwck9rGiNT98-Cmfkr>X5u z2N4qL1!1Pg(Zuk&E9Scz>5r_|*I|VHDc5`t=50)*S}%Q8R9jtB%j%rEh;cz(Qa(Rd z9$Yl?uFiwVU(qNpOGQJ6R{9cT&#Yp5orAl%c7JRA%Gy>>x($j@V$_-JRdiZmjcDsNZvPI`BB~;`{H*m4~8|R=q2Gfk0Y{d#d?ER z6q(C@T*fFO>TrIGD^I*}s5Lqm-~Tubrg-Dpy@aLvCQleM7jXKO=yKBer5JwDb*Ht| zsvIYu_c(QitLz67&{6a~3Qf@_8eLIkQk5*r#k9oo91pq~y4<5Bdame4QF$F|KRfie z4n+tQak8T2>G}tjOFPPeiQSQFG^d{g!`E>uhL zWAhl;W!XF3hH(zZ?1fh6DM2R@7p|0^Qr;SxSo0-pFuw-Za0y618pLx)ps0L6Xci-f zu}bkCU>9?h4*%q*!YC!%1yL@RR=DS0g#}RtqUGQ5!O4p|-9nxH9g!F7yYR;Fn<7=mXGP}sfoErdZ!NWm z?*+BsEUG27=yW(tX$M*8egs-NqM$u8aXko!Q4*Tt^}Zmjksl`MU=;c`&o4*oevIiP fY@tp!_9hOzl{fX<+|dkIR2vb_sX1rmVypTeK;mV6 z08gGg_>Mk+R@G#q`v5xhRCiZ(Re$|`75(fU{P_0uQwp0;;`|DK{}@e%LqHBt2sjlW zG6`P*P91L+P##Db=Fb4*qY*`5ny)hoG|k{tRF$XsjhH zKC@fGgW;rxbp#6wD+$BNdsufkDT4m2O`J(~bT(DC&T|R1f>j4*(KZ9%5`iDj72x=Y z6|cqcZVJyIap+_aA;6JE1D2jLpr?dgG?hto*%VK31bSgyRi@0C z4BjWXOV53{gP}ZLx+dt>qjT#+xV?3IJ*{0+nJmzic_0iq7QzYG_z$>JjjvU16J<&} zE#jxDT81-Ms^h$w+S04Hi(pD`9WF=4y>>3BCb0-J&P=TfTY1_mhM-zJM_A$}mgehq z72Ddgbcb}axF>p|E1rnEVo%mTHcwzF>WE;LX#}DE#j%s-prX*lj^gqW*xSHF~M#V2_h$MDCbv& zE_!{4>!7c6JRpymZzN$F{>u12+!N2S_b#<@FdHO2!bRXf>>&LQMNf{}E~L&w1&>%k hCTL9O#?)Vb@c#3L*~9Bz6fSFW^O98KmN}IB-QUAY{yzW! literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubi/block/sort.py b/NeoBoot/ubi_reader_mips/ubi/block/sort.py new file mode 100644 index 0000000..6687f9e --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubi/block/sort.py @@ -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) \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubi/block/sort.pyo b/NeoBoot/ubi_reader_mips/ubi/block/sort.pyo new file mode 100644 index 0000000000000000000000000000000000000000..4177c9e8b1395fe3903171182676cba109b958f0 GIT binary patch literal 3053 zcmc&$U2hvj6uq+N2+@q6Sa}79cDkP^FMYg@!j2p$$@{im+OHx9%qEwY@tI ziIhl4t)P$a08c#dfOzDu@MHJ`oO5SwCwx36*q+%tA3JmB+;i@@@@M19FF$?%Wmn3N zhvy@d;xkl{$V-u@FpL^TB2NuZqKX<7iRL7#%1a|pYiifjuB%;F8x!Vaw>6IiyIj7C zQbBo)QanJ_6FK$d=xsR>+1`6YPAhVPpOJ&Q2S_PpzPn4!Q?LISFP9BcfID1+4bC$lGbsX~$X8>xb{R zhsXB$AZve~j(bT~v_CzvaaJS)m^<;{lfl5Y$DJg|<1mWzpq~s2w%fW(yBOs5JuJZ8 z=|<2w4)`Pz#T8Uy>ZV~9&8qiLbUwy#iOvTOop%)-g`){n_Ko7?O>px58z(}pIK|!I zd6e4)w3B|=i-RH_`DloPj!-&){5hDGK4L}*nooEy3ok%5_3$d)nBjHnEMD|U*|Y(} z0vr(4NRtmwnlC)k3ot6Z?o8WIGE1`-`6`!7RXO+_H zabSBdAU3c7NwZ{DP4et~*BxMb`?N|~0%R^ymDLAWg}{5|@|iAz=4`di(Q8h(pgwx{ zp=TtPihL*X4E|K*Tl!{pTl9Iy@&rd32Fn8+#K(Flc2hblC4ZUkeSq~G8AnjqX{Qgw2boV`crsEa}o9ENEUS#szwi8NdC*oT8ONFq&@I!48l zUsRn&OXH&nlT*tix`a^|9T*qLIWh&wz&ZIAw{o%J?Q%o!n7X-z-0L>VMBm`3&{fMb9?WjNvJl?gla=ZYeJ|?>~RaN5qBb8-qvfJ;!q}cU2=7RQM^7~ z^zX7laSAzuB=5{_8i(2cfn~XI7<~vY3PzDP^;(H#d0UerQxyL|!=cE!qIOm5njHN~ zn6~$RmeV?^oc7v# z;O`8}`DJS7+l&3q_#~-C~*LbhXFXK{oh0^Dj#+bP;N?$HVv$%;G*O#@BtFV(yw{!_qLz-gU2H z_}$U}u|AW9&wnF6&+ju8>e+S%S?sT~>vdMt{Y?96U0i0K$7Y-TK{QU|E&X>%`7H2L LTUc6LTDluD;cU`W=GN4s9R*&)vhzR zFJXp1z!T5>Lmv16;p|#U?8uh9=iBpr=i9R@m;T$R{PXu;zebQ>+w}V*-SP(u0O@N% z0uaz(2?7hS1i=#EG6W^S6$q9AS0PvdTm!rXSO%;Bt^?i%+yLAJ+=93a!76Zo*K5F6 z;7`-w!23q(L%@%WAaU0V!HN;2avwuL z6+Z!dU?`;a5bzP;r+|-*+Gh|~AlNL38-}`Ms9+gA{fH%k5*@EbFD253V}tsukSLO`A^80_v*BgG|M-K0dr%Ztm45{N$x z`tRk1T&B@+!+k6_X|VrXHfr+7b=_K3x@v`>VHk@@trFEmxc*@R_FjlK38jeF{hB`~2(rZl8$4OI_dNAwKM-$vzZOsYmQ&=Fm@&YuI){s^!GD%La>cnrfnMb~I z<{~zu7OTI?&AEkK>t(mzp%u=Tphoxv-JueFk6L89Zkj+<3{}7&S_{-uRTY{hZ7otKY}`~tsa9+6INfHwYwwIp zg4zp3J#a#*#1V0*xFL?*_#60N_yg$s-t0P?I-nc~ws-yJ&6}B>_kHiZ+5BJA<)452 zVY4HWPmcaSr%P$NdGxbHAVkj+8Lk8_kw;YvtbR&6cy=SZnDs zBklUiveWu%b;;<@lm7lf!&z@FEIT*vw^r<>wZ_Jhb9?y?HY7UOAFc_yZqcRwq#JGW zsU>Fa+@*~qLLS0XAs!3S&2iU6sMkvpol{Xi=CW?o%B=%bEPUuj<5^TTSRzH+TP zuha>nT3%YHuKC}{tZp@{n>BW=NV`FGA&5HL)mzap)I0!d(!7hVcE|eWk_Ft|XsE|} z-!r|9P|G-^nb)IW*pp*sZyB@u;dU5(9gcOsZMtv!vC>s|0*~Gt_S!PW^VQ%YeT;5B zKXm-aQM6M%MeRVg_Zt1Q0n0YF=yb3}4Tc6X)F9&fB}w(6itB;juFKHh>balR z`@8y46xLUR;g%n&`qGY;q4FaVn=)F6B3-A+oLIV^jGdm}S7_HgU-fAVSNgj)7=oZt zGjtPHiN2?k@2q9M99(cofi4cN0SP9!h@wdx{d0)zRGG<^SbTU+JmZ`Ka;MQXxGEla znV6&OG6&|9VNuL=^BkpMKk#cRJnXz8BL5rj6Am_d?v|{s$-z*D9SMRkdy#vHy$SW2 zZckpL`OX7Hh z1fHH8SsyvFASAe|ka>l5f{{IGoymx~2&;`n1{E<(8b%X&4qK=8o0$tRmK6efj{&yq zM6sumjCW8Xz09;L(U2PWm%`}y9@PLLLZXljBBX4fi0g1X+huP8Sm^>?3POrE zV!6Okeb!RgducqHCF%cj^b>~cFPOl7B25^~31|wbhB*PvWTJsw6pyD+&b=}i#dQ&k zs(^!F6mg8LylK{eQK3jmXMEN|X9-hOsA1+fo($cagBE79@j1#O-b{v_cyrj!JP#{V zUOSJxMg@nGT4s*H4eJ3ti&+%}2kj0?@Pxjo@YR)WS4mTN5zE9vB&kbG`$U0qZWKv! zGrS*Fcw~1P_eR;}8PYD5*5a1i4)&c38r0o_6NsWQaf2jZKpcQ5y=G~8P``1Rb@VFpfs}~>7M9z zzy|`z*c*qm>^P6S*obi)QE}$%?t838cE>mbx3W=w_EJ0_5KM|krKFXPJl-$SIv>)d zuF@?V?`i$6B$0pKni)x@L^^5BnmT~=HLB}hP-ABitX_P0U2NvS>SvU)iPe_a&WZRF zoa^cA{4|fVDs_S0=1fiXpMssM^`J-<9el^+O}k2W4cdIHP{L8XiAiw{DhBIu_G=^ zB5!O@ig+CYHRs5YgO_;Mf=92ib%Cv4vNfd^_V>0B@%NC&#t;hT9pxYtz+r=eJx?Oj zyA$>LuIBeK4g(^rqj&ooTbN@Yk2e)4Yk)yBpt*c`%;FHM4B;&T2b)sb_S literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubi/headers/__init__.py b/NeoBoot/ubi_reader_mips/ubi/headers/__init__.py new file mode 100644 index 0000000..474a369 --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubi/headers/__init__.py @@ -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 \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubi/headers/__init__.pyo b/NeoBoot/ubi_reader_mips/ubi/headers/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..f68e6bf679518cd75b1d58c518292eafcfbe6c91 GIT binary patch literal 4756 zcmdT{TW=dh6h5<#oj6TsdP_=qNy0@|Rn-C^Ayt5AE~phviY93S5!K4^u9Hn1+u0eH z6gd)7ka&d`o>3q9d;9?SzO%k0?E?>Bx7a)5GqdA4bIyF{miu#h^7r3<`K~J6PY%Cd zpt+yXMR<(VMRqbekh+mg&gP^Z$Wcyqa$=$}iN~a7B+AQAB4;As?&KvZ^k&EVvjvGJ zdb7p;?6^de9PCU;bV-S#L{myklK)0&8fQuV!e_l?Kzeq!GqM0OPSa-Uypq*$KT7-3 zaN!b~dzZ_=0*4gcIpEG@nv*C{VodBtiQ-oSbYp1Ta2d@(eDTWH2jX*bFeW}P9V2If zK1NOhIa!oWAS+LA$!Sh-n2ty%$0_u0pFvN@CE3pA!FmshqV5FZk>9%ISxe*OMBY(S z_24A(L(=k;e|0&0uwuh6AFe)H*-%-XPup0;Q??teO7-xE65Tn*P0(#P!JO)M5O*gmt2w3SMrzv|LYi%W)&wJF0wCZaw$=%|`j_dV4Qv zxbo_Wj~gy&f?SWAOU?`SOji&eKk zC2u`kIp<<5#kT5?F1%E~VvBgG4kd%rC9a)fH&S3JHg19KtBzw>7H4NDxhn1oz<5H_wzyZz~)jzsU`UqV2Yj&Ax)gSQa)SYC$z}^69XW6Oc)97{Kh%J8(d~c!+ zEI+Sq>Y3lIBe+%R%Jst#wS@LBbBqIQF`OKun{y!J$qjN2T78ytc-k@qLR^mG6HT); z4LRo>=zX^~mmY-{SxA_ajL@6KWF&-0 z>}IoUaNQ9JTg`g=D4yS}?AGIX8&{iYbZ`EBr|A^KR+ez6AK<>DO+C~+KBgF%9St?* zcrzW~CzSrBtm0))^15;e2B_P;^C5?rDCYEr7)00gPH`Qra*oNzrY$o zlRyJ%L!q{wg&U1I1Y8!87=|@{f;FQI3Yp&%`Q2d}`+*Z3a^~deyyFv}R;oVC_|3C{g(5!soW>&SpuA8K(8qSYLst2O3r-$x=RxtIdBA9A18CE#_0V0FL z9zdbRDyqtpUx^O5C*T4eYUSyVaylj*RHK1hKh=t~gFesk+`?&rwQ8rpf&vqVfuxHp z0J9kusd-kiEK;#15X03dZu9&DnD7rTxH~38)U$ycjFZM&bNoV%7x`=}B&qjx91UeU zyV3+Y?2fonX`uL^4xTJM4A<^|6K*|z^ki*yqd(V=D;qmn!qnr2rN!ul+IP4S?Yh!x z#f>NnOnSj&5mkIeZK&Iku` literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubi/headers/errors.py b/NeoBoot/ubi_reader_mips/ubi/headers/errors.py new file mode 100644 index 0000000..eee0ebd --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubi/headers/errors.py @@ -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 \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubi/headers/errors.pyo b/NeoBoot/ubi_reader_mips/ubi/headers/errors.pyo new file mode 100644 index 0000000000000000000000000000000000000000..2e17fb509f5ceb10d5a02d8209ae6045606bf489 GIT binary patch literal 1395 zcmcgrF^|(Q6n;+Hv?)S&0tO}oTf}gILku8vI)Ok;70TU!PDoK3`&#$hB(j}~qC+>p zj1U7e|B)4`y!X;l2^d(oD1QFzXZt;W?{oP5>fqbg&uzCV*oZ!bgCU5M+lz2V|E)7i0uSNe_4H6@H08qg7Rmy}CYF$N+%lV9PbDGc=Htsc|v~e~ydYr0KPv)cj zv|jpYRi>{@Gts3>pTG60bh<(~RMpd}@@X^Hxm6>nY(Ceuqj5Uru}j-D_UdIuNfB9& z0Ek=Sy7-f)19VOJ=6Oq)03ZB~u*YjU|B?WGQyWd zOdn%i!R82nh_}>GmcJzQ1qUABJ<@?fYI#8r!VDEENHh48mhO=#aannjS4JTFaMlC+ zax>pD+XLTcW;<&sc3UYfc~=ax0qK1s#Q@wVkUf~7d;#(pHu{V)t)U~?gC?tq>EHFr z^z&1BF)~gu-`mv*-QLqhk8PtcD}Zt|SGiFoi(* y_zL+poGd=7J*iH0sT@D0jA+W}ylw7`{_87dCZEhJ*%);|m1fcIia`)ZaqlNMnJq*B literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubi/image.py b/NeoBoot/ubi_reader_mips/ubi/image.py new file mode 100644 index 0000000..b613ce4 --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubi/image.py @@ -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) \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubi/image.pyo b/NeoBoot/ubi_reader_mips/ubi/image.pyo new file mode 100644 index 0000000000000000000000000000000000000000..9c30e208e08daaf332fe17ff5883340c039d6c78 GIT binary patch literal 2424 zcmcgtO>fgc5FOh|nxy5k(5m9n3zAP*;)oDJMI7J|kb5FRS~>A1Z1G3%ZYnDEg31rz z#F_ud4}f{IP9orj)Wq5K&hvh}nRy;ZKW_|weE;@-O6@P=`*UvgHFr7x11gBhfW`p@ zutO?BDkB<4-j1l~P}!w%m+cPe9?b&EyY!Xlis;>Vhw>hs#yh;7`Nh9D;E{uw8@nj7 z3lHovFxO6<*Tu5b)`NFja8lIMk5-vV6~;P;xw*E}#w?tvt2OtK@e^*g;!YDNGh-$) z4&es|5gfpvLwO{FE-33RU9pSIwIg6(z`lTk)|>HAz@dP<@G9S-ue@rH($l!lM@|vE zReJ#%W^=8q{^W*isf~G)&2y7uqN-;ztDPk8 zTsM|u@341iD!X@gHboLF8lBI2u!b}ofnR%H#P8JvLLtQ0ri{;!@HhKBk=?e60GSc-)UAtsCF{;s7 zt{YXFg@v7nlaF|iEQwn3dhx39%x%PwoU<&GJh@WIuG$^Uyq#m5ccrdbvx8g{n7mZT4`8W$&6ijhLL(+x*F%O(*(|IREFlYRF1a!#i;eYFs zf!i^1lwt=KB2kl7bDcscDIz7#i+kxUnB1;0SvVGz!YgH;t(BMmBnctl_kc5mKA<_g z!mN>}yzv0wHWCC4D6r@EK}i@782Q@)u#q&OOnL`ayoD&zxHV0!DX(k7ga4p>W1EyA zN{Mn?XO1_7S@c|}SMLMrj|BQ25BQO<&Rm08|M=RiqK^3~H!pt)#76W|>|8dvUfs*_ z51B$MmKYIjD_513S}9+HRaxiDg3a^}Pe}0zP2pX7e>H#6)C=9X3#t2S9i|YXRIBt5 zGa0I~iR^9Zr!BXxoBtFC6p-5w5*()kgB2m4I^r_Zh)U%*G>6)_-JBhk;3r g@O2CO){`?mb#lxW+>zuw_33y91zB*o9q<+Y22cYMYXATM literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubi/volume/__init__.py b/NeoBoot/ubi_reader_mips/ubi/volume/__init__.py new file mode 100644 index 0000000..70d3e76 --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubi/volume/__init__.py @@ -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 \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubi/volume/__init__.pyo b/NeoBoot/ubi_reader_mips/ubi/volume/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..07e081478ab385170eae42fbe978868b9c86a090 GIT binary patch literal 3655 zcmc&%TW=dh6h3>g6FW&0N{I*$fTAK931uZDgj7`smGZztEi{oD)uLM2-c49%?R7ol zlAz=%eMRDlXZVf$fbxB3*0B+NDN+;1b24*wX7*gZb8+;Wo{|+j$~`f+?EViwd56Ev?EztneT}?>`;wi48lR#zr(NxAQypLh@_Z=I??4Q zkda?Ta)B>4#MJLlt=R1}a8PZTzO2f$$lN*@I-li3wdtfk&K+TxOGQUOlQRm&^wR?(Jv!EFBk9%XNZx&Bu9?!r_HW(*xY1y3}imW66-9g}?1! zNEmTk8&MJBttPU2sIcl<%KlXEe(>pMR?TLprk}Mq!?;0xX8ClMrdxQYrRcKMgxV+^ zs4QGPTKbuf4B59JHf@wLA_<@!EZ$abV(b>=R;W{MkLVBHAo(?R=nm(N9x#*_@x=`; z0x9!}A^dJZ51L%jPEmHSY_%9$CZuThB83RjGt}k^rmWP-UmlgJNtZFDhc2uYTsC5rqJVGr( zQi5_&i;ci)j2NC=ln>-_O}<7Iq;*_>a8uf;Bwyg2i}0X2%s?DN@_zwAXK)$H*=VU3 z%Pfj*#OTNO@$)BgsWlh9!)Yk9C#=h88NSB3EY`iT+olo@8K@p zbfgwz40a0;aZKrF1*s)@tsRo#)MMg2E%Sld#o91+X*C2VwZ*TwR_x=V%pD=hQd-ya ztnd0-)0ehKarI~W*6~Vh1{85O8tBKt4x|| z&yl9%Dw~&B8YXDNgN7RG*6FO8<}-J$<=im#43Ta0E++q#d}-e26EY3aY?ze1Z7~tE z53;m|&faZrV;B_#gZ&t!8Md0Os1RD?;$jSTHxA8 zDzLk^2V_5fek7LwZA^fV&_OE9FB{4MjpTFDyD^@F`DY(cbO z%Zmd!!t_uf*DV-o3T{QTtRR}1U~s-@Qn`BR2HIR&b)SOLIyU!wh^7;LUzVS#ojO$9 z2LU~ZpA6O9;rVf;t*`GKts??hV|+H%R@JJ@6)k*1Xf56RZau6&SnBQr3DG`)be19# z`Mbe~!Cf@5JHh?1+gS(Guq^s4N&_Hh4^$6L2wFHaimJf~{kU4iFqW3u+yH3Rjt_lE QenVedI%X%>4R^o#2bbzH00000 literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubi_extract_files.py b/NeoBoot/ubi_reader_mips/ubi_extract_files.py new file mode 100644 index 0000000..154454d --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubi_extract_files.py @@ -0,0 +1,64 @@ +#!/usr/bin/python + +import os +import sys +import argparse +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__': + description = 'Extract contents of UBI image.' + usage = 'ubi_extract_files.py [options] filepath' + parser = argparse.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 'Writing to: %s' % vol_out_path + extract_files(uubifs, vol_out_path, perms) + + sys.exit(0) \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubi_io/__init__.py b/NeoBoot/ubi_reader_mips/ubi_io/__init__.py new file mode 100644 index 0000000..9f3bd62 --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubi_io/__init__.py @@ -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]) \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubi_io/__init__.pyo b/NeoBoot/ubi_reader_mips/ubi_io/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..439d3b99b0106ae4540240c892d66edfed9b148e GIT binary patch literal 5903 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 XlhV(x*wC70q*Ue_r?(NS`5fQ9NG~{$=s- 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 AMF0Q* literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubifs/log.py b/NeoBoot/ubi_reader_mips/ubifs/log.py new file mode 100644 index 0000000..1c2d15b --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubifs/log.py @@ -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) \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubifs/log.pyo b/NeoBoot/ubi_reader_mips/ubifs/log.pyo new file mode 100644 index 0000000000000000000000000000000000000000..de73eb59f6127b0ceed73861a51c091b180baeda GIT binary patch literal 1719 zcmcIkO>fgc5S_KtkE9JyK&1!{y;QOgswISk1PGxP3gQrfdniPpB~3Q1jpI$TYe=Q` zLJ?PfEI$C|jgyogKy1%=cD+0McHUcuznhJR3q)O-Tp_=ov$-eidi*HLiQ2PRQCm&> z18N7<oQcC~u)$+)h+oRbUirYJE?mj!i*(D>-M>>T>ND@de zP2FCgWIw9$gf6DT0=8W?7qRn1XGEGaDG7pUPdE)Y6EQB#YPoCd%fqzqv@QLx^xKS2 zAba56>*UV(6^^)Dd#n3tZv673EsZPOFyqu~TWB-xnxU7OCuM4U1aux)oyq$^N8;QY zj^fgd;ygW!O_3fAIuGLEsXw+w{5CI-(!#|r$KDh!wH&sL-Lclk3{;Oyr)Ne8`z~fw z+dK_`v`z~~p%FVcQgykz*eEK$#3p6>$pP0WJj&E@z_{fa4tTd*bd_HTNJ!8jRkTA>Fiaxrq&@8TV+k^wRv*fgp|dpXU|?$I;)*wP^ifXn*ddWJ6B6QhDauZFqxu`I~QM%101X2YT{J{k7 z9tSv;tP57rI70N|(rU z21aX{q4mJ_%AA`C4z18A+X4)9hL-@#u6>SQkf literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubifs/lzo.so b/NeoBoot/ubi_reader_mips/ubifs/lzo.so new file mode 100644 index 0000000000000000000000000000000000000000..b24031d1652e7cc29b85f24e50f24258f1802438 GIT binary patch literal 11560 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 literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubifs/misc.py b/NeoBoot/ubi_reader_mips/ubifs/misc.py new file mode 100644 index 0000000..a4127bb --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubifs/misc.py @@ -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('> 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))) + elif ctype == UBIFS_COMPR_ZLIB: + return zlib.decompress(data, -11) + else: + return data \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubifs/misc.pyo b/NeoBoot/ubi_reader_mips/ubifs/misc.pyo new file mode 100644 index 0000000000000000000000000000000000000000..85af7ad311d7dbef744a81967f2870fb3c1a5324 GIT binary patch literal 1465 zcmcIkOHbQC5FR@TA!&H@0rb>|+C$VzMCyU|fG7k}5di_&^w1Q^O1zt7gJVbDjRYt; z(I3!LFTM09R;qe#zu6FqP_Nk8*>86|vorI}Ci82q_~YBxlaQ{S66Q?|{T)K!=TJn{ zxW*1Ooaw$x4cB6qq6{6242dj>9Elkcc@ncE3e?F{1Diz>_ehjT%#oNUu|Q&x#C;ME zNIWF*h{O_gO4NYujW0V{YQWVpeL)0pxMBg^I^>rhBR=&9Prd8_8Wyii7P74(X)*vp zrFM?uQ#-e!$sBgms}I|W1v&{Q8Wm4AMAI~_M#$J$a5e=d9mdw%pec-tQ*_HN``Xw! zm2EpKac0$_w)ROn=!P8Q3`P!Pn@v3kL)1e_9U38Gmtge#(xnrZ#tw~L8aV`io8t_P zpv=-wh77{5`XLOHK~f(XE4pJo;Ui-6eZWvJ6iq*@gjt4_c9rZPA; z-6XCYMZ=DYb!F$w$XKfcur8Bol9AhZ}VsC{FxeF|*i?=*9_G?wEy+D1-oUUz-@VaG&aTr80 z_PAtsOpEvO>I}`fkW+GAV=TI5KHGc2f|Kz$3^NB|NnI7PtzxMysodZky0+zr6Ctmb w>|)wt+Ixo8^=WsVmTm9#ejKN4zF1XNqduVuA>uft0pg%>pb$~59Pc{W#@qpE_Wl`#<(qV(`;BW!rr)K3iM!v%qZp(ifwUZp*ks`szZ zlLDDB+9TR4fW-aV`@8}VOLWiDne`?w0ak@rOYp1lUs%K>i4$EK2R}&QhfTx$h<*rn z%v=2X>&o(-y0^Hxva(w9?pBp|XL;$%YF$38P15D*_?~XG(`arV@`+Wovan{rLkFf| zOi}_X;irRkOZaVcTk=J%FlhT)NNna3&m-x?B;~G7%I$EY97N$}r*W&i^Vn>~QTeNO zcQcH1d1==Kkq%=X)`GYa$EMuf2)!g|_(9@z!X1t0mM%xJALz2@g;8ic?Ez9SJiA0Gujl}3jq1h4_*zCCg#1N~fGdz0TrU?x@gm<1fYq&2t z7o4+B31;beLe%I4o+k=;UMKduZGKd+rJ6%`iMzhgGCE-wRj?R@6^X~($??g84XOp(eO92TTz> zQ9xh;66-}X_{1!_*XmE=5?7dQ&yN5YN5aKC&$n<<@9qRivC@v4+r=6$qID_Q>h&Uq zIQ9Eb173E*NTJR#3jqp+2vk5%g>@D*9ReswG+$)_o&^Jil~ULTha38rSpu{)^hY`L z5gi?E-q_d&g4)<$sjnRp{0Gg+UG!g17ltHVI5PUPw5qt$(7X@jCH%|K|F{Ef$0Pk^f)~3X&eyV5#C(i%%;;9+B9C4|}+p zZU@l|uxDXy;gCdT0DJnA@`*jGtg%K7HHbZPM;A4yjeF?Bt}}ed!5P}=g`E4)KBtg# zjb&R&3^?o+d7(j^H>d`2Y&FP~^o=TiYSn2;=;vg?c;UpeDnEVJOPHkE9 z6x!z$Om47j-Bi9_Sp!k+77dt@7i#_rw>RLfB)enuDr%v&c=!3MlILgiLq8`8#Luv` zb(xpCDFHy(c&|uqg*}3XaHA^sBfmoUQycBSL;IXY`-d#sPpNzy?R-B{lDj}`_68%l z_rK`}tuP9-TZ7UjPW;*AG)EBv%ai*L(cmDkR9RFOJpXbq~e*uAbmDm6P literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubifs/nodes/extract.py b/NeoBoot/ubi_reader_mips/ubifs/nodes/extract.py new file mode 100644 index 0000000..9f8f7b0 --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubifs/nodes/extract.py @@ -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 \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubifs/nodes/extract.pyo b/NeoBoot/ubi_reader_mips/ubifs/nodes/extract.pyo new file mode 100644 index 0000000000000000000000000000000000000000..59cfa8c3c35e5a49a628818dd1fe0324c76e0671 GIT binary patch literal 2805 zcmcguZEG7x5S}|p){7nDq#4!q$l0XC{A46N)a*01!E+_W|Lpdbf%05@RQ?)B_ zit;J>$Nd5A^UV3AOHrVhR^oOvyL&e?`^?)`{=C(SY+bK zg(n{8zKnf2k1G;a zXiomZFYv%QSSM)~8=FtL_B;WRA#E+j5qSFwWFc~m$5Y0ag(r^|zC3vk^Ib)*tHld7 zaa)2_JUx}%4eI#ZRY69{*eGL-`OP)3GB$(ACV!X^yto#~Fq=%WG`fms`sU2^WA_=> ze>^<-z84*xot~a`qc@!}>RkjhQqM6TBqOWukJI@C28d*%ku@#=Cra!&xc1!6+T&!< zHfeG>>3`jxzI9hw+WuiYzf4lwKE81#wMhoHYqG;Eb8U!@XoQ)O9oe>G);2e8)*rf; z)3+gkA6L$O-LJ0C~JS0Qjy_d{vVLK&}&2Fj0fFfVTKTx!vEUFUKS=vyN_OP(Wg{FWO zwT`h>iqBQ8Q=nPHR>iIa^uhT-5vZYx(3Zq+&~BzP7QTR|`bQ#bWu(AzW!wn(PhrfL z7?#!+#qU8L;YGhW;y$3i6Z{pq`If28I7eq`$a`NpzrK)n@C)Wmxo!#j`gS25eSPP) zSfFHhzn{p@c(E5~9wf9fxCgS(SZ(h8>C~jLviZ8Z4;6V<9fk+pqc^-Btn(-%2BxHr_nl-DdGrMoJ;x}y@~QXC z?*FbjE<0USN1FSzuj@v1Ft7pJRh5H U=y6MncD 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(' len(buf): + buf += '\x00' * (inode['ino'].size - len(buf)) + return buf \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubifs/output.pyo b/NeoBoot/ubi_reader_mips/ubifs/output.pyo new file mode 100644 index 0000000000000000000000000000000000000000..48e29c0567936a1ded2361c9967b54917486243a GIT binary patch literal 3904 zcmcIn-ESL35TCvCN9-hR^BwooMGAEbss*YjDp5gc6R?`5;nI>eQe_<9Il0)rbG>U4 zgCil*7oK=VJi!AGNJTo{->g;17V`%-K$pR^^36+0EYW?0o!Yc4lJ#J)FK0 zCn{6-$Hw3HF!aZmT>L7k5v}#tiq@3uTU4{?E>qZ4v#B1VwHPTkMqZrUI6by#EkSOA z9^-bB+@vf9$Q_VHiW#ruQV`<*gP*0G!qV_`DO#pkzE=+Gji#ry!55XGC=FsHF>YY! zU!iVCQOBY!qReibIc(v>rVf6wh|!)!y9rt2G(lC1n!i(fwnv$yPJ;Fn=}>kCx}T~O zqb9ae{N0H&7xgHlfM_+iKrxf1YMPo~liE#^>JV)W($)~$)Jf7L*r`C#eb?fv)dV%4 z+B>iD8atVr4^PwX0GVOJJyu?1Lf&2+GJc}fM^EkGPm8sO#>YhCA65Gsxo=Zu>o@`B zD)hUh05nTTQuB(66vfW0IU%fZ2GeZXO_3Q9J5rGyTZ&;C6^3!jFcr)T&e4BdWK2F+ z2QXnkpl=V5AJid00A3dmP~8twJ+sEdtVyd4q0nWV1BCHm`zC0ztJ1TqN3BDw0bBn9 z=qpwPyvX@hb>W*NGesMgIN>j=y+>x6wld_xul>s~-c2KV(!>TnwpgK)UB8P$r>K)= zASEcCSPTH7s~Z$gtl(l7UvpXrmB7ioBHDfc9Rll*!xjyS(Bwf=e(S~V8G-Ds-F`zL zJ9|(=_8^PQ+As6ZvV91|p%;lP_e7o(kx%XRg|3C}aNo8sUn=P5!-9^nAbA<$Aju~y zx#M`mOL_?N&4QC%DEYN(*%@tO*l@kT7|uq15c-lF`1Nnr{Gh6bv05lB&i8L<3p+Df zPvFnWgWHRRrCa^8EVIXU?m}VV&cSVmS&PJ#J2&>Z=Carp zMg5>vH%t^piZ@DTQx3L5KafRGs(Z39?S^OA=6iF6g_UCA?t|s|A}mKs8lp;^{-MXNncS<`o-Wv##M0WJ=G;om;&1+}@23B8#{?%>w2H$a7;4k+gRmWx|y%}>v=Em zH|nJ~^NqII41@e~t+n9?IzPW-yg_A$1U_6fu zc6k$#P=0AQx92J@y8v^=MY6i2Q%9e5p z5L7Q>0qg(>umX@@jngjhK|27Dv4iGf)g}7yKBg71U`f)?_PTt?%LyA^;BY<@5F-m2 zLzFh6%8}YR1qt^sG&_zEgJrgkjqY3c8MJ7}70lbU#rI0;b4;Py?#9G;1PWRu^f}y0 z5{y=8?s_E~hY1`eX&Rl~&M&-w^WhUhD~4tRDDf$(%`_;gHZ{MeowuaFIB>`(-*F*F zM+*GLuR<4G!kw$&`lx|M4^F@p(Fxu_FNubXccfvIt`A$0&;j-fx;pUV`ioEp9U2Pk z+h7RRec{Y~S-7tTSI|lhN-OyeEKK3i3`%bT8_}Z^)+ga<#36%5Tel+BlT%=99TlR$N| zq&KBocdp`dzlGm9$_O(9kTqK?)z{t9^&-|9gPgZ9MSTKmPnzGiiITq&&0qvOXvApGA*QK~pcHy37kZrbyz!X>O! zP_bo?)3}t6=u!<2k`;^S{ZBnfK!Q4sa?IU%m8VNQv5C%Qp5DcTpnyT5VA16w%ha`! zHbwD(I8k1<>%5MWqXgfXgaFR_n)T!~mO!aVsEnFGA(}!tIi^Oe6bjG;_NGxzW~_{Q zMMVZmnm&tr_~(a6D%@q)tM~y5GTRjGAhVYvtT@OPN;U0C^>a9dI-Flbi+wX?_5YXL cD9}(!S~c%FKL^bn*^rdh6V~yC)Ici!FMJITEC2ui literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ubifs/walk.py b/NeoBoot/ubi_reader_mips/ubifs/walk.py new file mode 100644 index 0000000..d8b8020 --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ubifs/walk.py @@ -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) \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ubifs/walk.pyo b/NeoBoot/ubi_reader_mips/ubifs/walk.pyo new file mode 100644 index 0000000000000000000000000000000000000000..7079fba7f655edf317ed3c8125c1ad510cbb3b6a GIT binary patch literal 1342 zcmcIj&2G~`5T3Q2v~?Sr@*|p4dyIOhC4@Lth_)$Ep(ZFT0xBWPjW?}RXC3T~NTlRc zBwm9X55Ws?;2}8h20Q?Kvrg0mdd2e2&dkn!^UZi{|0=l;3q&oNJQnsRSlJdth*wZd z)D?6pNU&{DY|%*s&8ClV+Y~xJ2RaQ}I(M*ltK~p0V->OXv9h1= zYod;z5zz?JqAQ!m4vie@Sfp*bv?%SG7&xafxfs{V*ud=lLbn@5-Nud&yIqIKx0(U zmmPI?3STntZv~fjYaX5ntTLl9s4d-?WK+x~L8B*0n8B_%pE9W6#ITr9u&L51Gw2n* zmHIU8;hG`y!;rZ>PlkKw(#XA$#+Scnp#OOyrtxi-hBHUQ$!WMb4KqdgeALZYL@M!B zzl%?ciBXB>nFs?Nz_sKtXX1{0hpWAMn(TZ6v2#J+#ps^f1W6>G54uNHTl;z7I-PmR;a3wWJLA?n%B=# zFOJSUsiO04@WAU0^+lq*mvR3*Qki!!&{Abl0<|uay(G~d$oZ)ZLYcDK&b$vne7W5l zHdlbh-OV0BkhmvSMMadwrp0?ntYEFdw=vPnu+~jXe#Uma$^|voSulv^9+)iKp=?J= dW+uyZ5&xwUGcY^dB<#oXF}E#aR%PK@e*mBl6Y>B6 literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ui/__init__.py b/NeoBoot/ubi_reader_mips/ui/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ui/__init__.py @@ -0,0 +1 @@ + diff --git a/NeoBoot/ubi_reader_mips/ui/__init__.pyo b/NeoBoot/ubi_reader_mips/ui/__init__.pyo new file mode 100644 index 0000000000000000000000000000000000000000..63a124d5e862e61eb7aec8ab9131f28468a29541 GIT binary patch literal 163 zcmZSn%*$oM%D|A!00oRd+5w1*S%5?e14FO|NW@PANHCxg#XdkW{nFwh{hZ7s{nWh7 z^xQ-v{esGpjQl+PfSl6w%)DZK*NT$VyyDD!Ak!~3-zh)8M87mCGrlM_F(tJ~zcf=n gK0Y%qvm`!V52%p?XrN7QeoARhsvXGMVjyM!0FSCAiU0rr literal 0 HcmV?d00001 diff --git a/NeoBoot/ubi_reader_mips/ui/common.py b/NeoBoot/ubi_reader_mips/ui/common.py new file mode 100644 index 0000000..c8669fd --- /dev/null +++ b/NeoBoot/ubi_reader_mips/ui/common.py @@ -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 \ No newline at end of file diff --git a/NeoBoot/ubi_reader_mips/ui/common.pyo b/NeoBoot/ubi_reader_mips/ui/common.pyo new file mode 100644 index 0000000000000000000000000000000000000000..b0ff888c27b1139044b7e69394e455a0579a67f8 GIT binary patch literal 3282 zcmcIm?`|8%5uZI$6h-~DEXk$qSg{>DOq+y3Q3zTXY=3h|Tj-A_=U$U_9^BlHRS2K^r70ovcpQ4;9{$d^Ra?Vp+1+1Z)j&TQ$2`Pv_* zh}tyz!~ z(-c*yRV}Df6wXjoqgIWgS!&IaGDN*O>dn(=u<)b7BAF#RQ=@;sLT9kx3Ylf{r|BC- zt*hi$=^I$N!shNYW?*{oKm2Vs6oz&QO=$M@agf^F3w0+5O{2sdK5f1qbTV7U=xZ-L zv=t1J-1c+Za9Cso%`^A$_OAZo!Q)3e`qQoF`r{9FKDJk0VSM=XvuAFx=IRCO%coED z?(=6``pM&+U3(35XwhHpK6s)(_+s~|yS4MUwWS|D`N(B^+T2W!z7Nr7-=aDB8wEte z5?Q!P(JAqN&!JxFd{Cy-5}lPv4VpZH6Y9Q0^@lIkX;|h{_A0Ur3m^&=4xJ%PM}MNd zz4*^mw$pT2qx2u7h8#U;fWxXZlvTYM>ea}{!YNuq7}RNndb4y!q+&&1L3F3Ve%ubk z+3ZN)#8v{3u?z2IjX89#xRWJ=*f#?^i&5ld)}%U4d}BFkX_8nS#(8u(OFErQoFld2$9x(&mM?) z-=t9{00`Kk%w-A7vc_FR+rU>e*(Vq^^DJ$K!G6=kK{xV#-|U~*gCuS~3-fLeXU(mF zHE{+Dv*xx*9^hzAU`?mS^G({!gJwI4q9lG7%jTgDF2NzJpfh7`+FkfaKpebAa2R2vOhQ@RiX`5w6Mxt_Uv2hCf4o4c#pHbLi&DUqH7= z{t~(??(~ z%nECyd!A@tX4r*K%MpYQk9lLzNKyYfDF%Bz~-f$pZ z#7bNX&gRh#2mgD67n5##_~O&aJzp2q|6&cCOvEp|@won%Kc)YrbM(^LW2avo-y3L@ zNUTf{uYq`hlRAJ~AD_b9@##-+1)bwE*RcfnU7grvwb&Z)WyAplV_O0Q0j9W#4cZuI zyoKo)kbaA);9oF&^dH(g`X}vywA1(&eHfL$}Tq9ZA=@3ocD(bsY#Bsit~n~~@Pz1vK{t-LIEZ8{M>tMG9ry)hTPl3)MTL);Wl#FX)}YwS zZIT*xndo9(C-l0Rq<#`}nI?-lQ}g6v!wa^o=kivpLEpX4b2bVGFzK=JH9VWS*I5?d zsMK-w%5v1V{V-`CO1*X2K$q=x-{9shH+RrTu@HCA7q zh+~xD#-r@k)b!8%YADS7TT(NS=HHT9!0)cAt5s)R-BkC~y1K8{P`3G-AANP_HH?<= z)tyxo_FMRIe-j!O)g7m?iv2C)I4NEuY+sOEhErZr#hZvDFMfL$H#~@eqKmM~wFB>h z!}t;;$yJb74-5AaJdGG&evn?=4?I#rk>C((d6Q@@m!)_cYY0n-9(iGATz=TPTWBtW jC8J;Zoy68`Mv0$?<}d7^j6*mFzu$z1*VG@Kx%vMC^=P3$ literal 0 HcmV?d00001