Apple EFI IM4P Splitter v1.2

Fixed IM4P payload start offset
This commit is contained in:
Plato Mavropoulos 2018-11-01 15:24:13 +02:00
parent d702d7f8a8
commit 2bcd917314

View file

@ -6,7 +6,7 @@ Apple EFI IM4P Splitter
Copyright (C) 2018 Plato Mavropoulos Copyright (C) 2018 Plato Mavropoulos
""" """
print('Apple EFI IM4P Splitter v1.1\n') print('Apple EFI IM4P Splitter v1.2')
import os import os
import re import re
@ -33,9 +33,11 @@ for input_file in apple_im4p :
file_dir = os.path.dirname(file_path) file_dir = os.path.dirname(file_path)
file_ext = os.path.splitext(file_path)[1] file_ext = os.path.splitext(file_path)[1]
print('\nFile: %s%s' % (file_name, file_ext))
# Must be IM4P file because its size is 0x0 dependent # Must be IM4P file because its size is 0x0 dependent
if file_ext not in ('.im4p','.IM4P') : if file_ext not in ('.im4p','.IM4P') :
print('Error: Could not find IM4P file extension at %s!\n' % file_name) print('\n Error: Could not find IM4P file extension at %s!' % file_name)
continue continue
with open(input_file, 'rb') as in_file : buffer = in_file.read() with open(input_file, 'rb') as in_file : buffer = in_file.read()
@ -43,17 +45,17 @@ for input_file in apple_im4p :
is_im4p = im4p.search(buffer) # Detect IM4P pattern is_im4p = im4p.search(buffer) # Detect IM4P pattern
if not is_im4p : if not is_im4p :
print('Error: Could not find IM4P pattern at %s!\n' % file_name) print('\n Error: Could not find IM4P pattern at %s!' % file_name)
continue continue
im4p_size = int.from_bytes(buffer[2:is_im4p.start()], 'big') # Variable, from 0x2 - IM4P im4p_size = int.from_bytes(buffer[2:is_im4p.start()], 'big') # Variable, from 0x2 - IM4P
im4p_type = buffer[is_im4p.end():is_im4p.end() + 0x4].decode('utf-8') # mefi im4p_type = buffer[is_im4p.end():is_im4p.end() + 0x4].decode('utf-8') # mefi
if im4p_type != 'mefi' : if im4p_type != 'mefi' :
print('Error: Could not find "mefi" IM4P Type at %s!\n' % file_name) print('\n Error: Could not find "mefi" IM4P Type at %s!' % file_name)
continue continue
payload_start = is_im4p.start() + 0x15 payload_start = is_im4p.start() + buffer[is_im4p.start() - 0x1]
payload_size = int.from_bytes(buffer[is_im4p.end() + 0x9:is_im4p.end() + 0xD], 'big') payload_size = int.from_bytes(buffer[is_im4p.end() + 0x9:is_im4p.end() + 0xD], 'big')
ifd_count = list(ifd.finditer(buffer)) # Count the Intel FD(s) to determine each SPI size and offset ifd_count = list(ifd.finditer(buffer)) # Count the Intel FD(s) to determine each SPI size and offset
@ -71,4 +73,4 @@ for input_file in apple_im4p :
spi_start += spi_size spi_start += spi_size
input('Done!') input('\nDone!')