From 9a44fc48dcc4c32bcc0b34bff06402cb84359b1b Mon Sep 17 00:00:00 2001 From: dsanke Date: Wed, 5 May 2021 18:56:02 +0800 Subject: [PATCH 1/2] Reduce the size of FTPR for ME 11.x Add ability of reducing the size of FTPR and relocate partitions when using "-t" switch for ME 11. --- me_cleaner.py | 111 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 92 insertions(+), 19 deletions(-) diff --git a/me_cleaner.py b/me_cleaner.py index c2adf0e..3d35f38 100755 --- a/me_cleaner.py +++ b/me_cleaner.py @@ -116,6 +116,19 @@ def move_range(self, offset_from, size, offset_to, fill): else: raise OutOfRegionException() + def cut_range(self, start, end): + if self.region_start + end <= self.region_end: + if start < end: + self.f.seek(0) + temp = self.f.read(self.region_start + start) + self.f.seek(self.region_start + end) + temp += self.f.read(-1) + self.f.truncate(0) + self.f.seek(0) + self.f.write(temp) + else: + raise OutOfRegionException() + def save(self, filename, size): if self.region_start + size <= self.region_end: self.f.seek(self.region_start) @@ -127,6 +140,13 @@ def save(self, filename, size): raise OutOfRegionException() +def align_8kbytes(size): + if size%8192 == 0: + return size + else: + return (size//8192+1)*8192 + + def get_chunks_offsets(llut): chunk_count = unpack(" me11_fptr_offset: + part_start -= (me11_fptr_end - me11_fptr_offset) + part_end -= (me11_fptr_end - me11_fptr_offset) + partition_new = partition[0x00:0x08] + part_start.to_bytes(4,'little') + part_length.to_bytes(4,'little') + partition[0x10:0x20] + + if pubkey_md5 == '986a78e481f185f7d54e4af06eb413f6' and args.truncate: + FTUP_list = ['PSVN','NFTP','WCOD','LOCL'] + if part_name in FTUP_list: + print(" {:<4} (0x{:08x} - 0x{:09x}, 0x{:08x} total bytes): " + .format(part_name, part_start, part_end, part_length), + end="") + print("removed") + continue + else: + if part_start >= ftup_end: + part_start -= ftup_length + part_end -= ftup_length + partition_new = partition[0x00:0x08] + part_start.to_bytes(4,'little') + part_length.to_bytes(4,'little') + partition[0x10:0x20] + if flags & 0x7f == 2: print(" {:<4} ({:^24}, 0x{:08x} total bytes): nothing to " "remove" @@ -803,12 +878,22 @@ def start_end_to_flreg(start, end): end="") if part_name in whitelist or (blacklist and part_name not in blacklist): - unremovable_part_fpt += partition + if pubkey_md5 == '986a78e481f185f7d54e4af06eb413f6' and args.truncate: + unremovable_part_fpt += partition_new + else: + unremovable_part_fpt += partition if part_name != "FTPR": extra_part_end = max(extra_part_end, part_end) print("NOT removed") else: - mef.fill_range(part_start, part_end, b"\xff") + if pubkey_md5 == '986a78e481f185f7d54e4af06eb413f6' and args.truncate: + if part_name == 'FTUP' and part_name not in whitelist: + mef.cut_range(part_start, part_end) + ftup_end = part_end + ftup_length = part_length + + else: + mef.fill_range(part_start, part_end, b"\xff") print("removed") print("Removing partition entries in FPT...") @@ -844,24 +929,13 @@ def start_end_to_flreg(start, end): # bytes must be always 0x00. mef.write_to(0x1b, pack("B", checksum)) - print("Reading FTPR modules list...") - if gen == 3: - end_addr, ftpr_offset = \ - check_and_remove_modules_gen3(mef, me_end, - ftpr_offset, ftpr_length, - min_ftpr_offset, - args.relocate, - args.keep_modules) - else: - end_addr, ftpr_offset = \ - check_and_remove_modules(mef, me_end, ftpr_offset, - min_ftpr_offset, args.relocate, - args.keep_modules) - if end_addr > 0: end_addr = max(end_addr, extra_part_end) - end_addr = (end_addr // 0x1000 + 1) * 0x1000 - end_addr += spared_blocks * 0x1000 + if pubkey_md5 == '986a78e481f185f7d54e4af06eb413f6' and args.truncate: + pass + else: + end_addr = (end_addr // 0x1000 + 1) * 0x1000 + end_addr += spared_blocks * 0x1000 print("The ME minimum size should be {0} bytes " "({0:#x} bytes)".format(end_addr)) @@ -958,4 +1032,3 @@ def start_end_to_flreg(start, end): if not args.check: print("Done! Good luck!") - From 511814de9a768198845a8167cad86483cfae4e1a Mon Sep 17 00:00:00 2001 From: dsanke Date: Wed, 5 May 2021 21:40:39 +0800 Subject: [PATCH 2/2] Fix logic mistake --- me_cleaner.py | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/me_cleaner.py b/me_cleaner.py index 3d35f38..73df44d 100755 --- a/me_cleaner.py +++ b/me_cleaner.py @@ -850,18 +850,21 @@ def start_end_to_flreg(start, end): partition_new = partition[0x00:0x08] + part_start.to_bytes(4,'little') + part_length.to_bytes(4,'little') + partition[0x10:0x20] if pubkey_md5 == '986a78e481f185f7d54e4af06eb413f6' and args.truncate: - FTUP_list = ['PSVN','NFTP','WCOD','LOCL'] - if part_name in FTUP_list: - print(" {:<4} (0x{:08x} - 0x{:09x}, 0x{:08x} total bytes): " - .format(part_name, part_start, part_end, part_length), - end="") - print("removed") - continue + if 'FTUP' in whitelist or (blacklist and 'FTUP' not in blacklist): + pass else: - if part_start >= ftup_end: - part_start -= ftup_length - part_end -= ftup_length - partition_new = partition[0x00:0x08] + part_start.to_bytes(4,'little') + part_length.to_bytes(4,'little') + partition[0x10:0x20] + FTUP_list = ['PSVN','NFTP','WCOD','LOCL'] + if part_name in FTUP_list: + print(" {:<4} (0x{:08x} - 0x{:09x}, 0x{:08x} total bytes): " + .format(part_name, part_start, part_end, part_length), + end="") + print("removed") + continue + else: + if part_start >= ftup_end: + part_start -= ftup_length + part_end -= ftup_length + partition_new = partition[0x00:0x08] + part_start.to_bytes(4,'little') + part_length.to_bytes(4,'little') + partition[0x10:0x20] if flags & 0x7f == 2: print(" {:<4} ({:^24}, 0x{:08x} total bytes): nothing to " @@ -886,12 +889,10 @@ def start_end_to_flreg(start, end): extra_part_end = max(extra_part_end, part_end) print("NOT removed") else: - if pubkey_md5 == '986a78e481f185f7d54e4af06eb413f6' and args.truncate: - if part_name == 'FTUP' and part_name not in whitelist: - mef.cut_range(part_start, part_end) - ftup_end = part_end - ftup_length = part_length - + if pubkey_md5 == '986a78e481f185f7d54e4af06eb413f6' and args.truncate and part_name == 'FTUP': + mef.cut_range(part_start, part_end) + ftup_end = part_end + ftup_length = part_length else: mef.fill_range(part_start, part_end, b"\xff") print("removed")