Skip to content

Instantly share code, notes, and snippets.

@marysaka
Created October 3, 2017 19:01
Show Gist options
  • Save marysaka/c8feeed01c0e7d7720db013c20c979a0 to your computer and use it in GitHub Desktop.
Save marysaka/c8feeed01c0e7d7720db013c20c979a0 to your computer and use it in GitHub Desktop.
Switch Simple BCT parser
#!/usr/bin/python3
from struct import *
import sys
def main():
args = sys.argv[1::]
if len(args) < 1:
print(sys.argv[0] + " boot.bct")
return
f = open(sys.argv[1], 'rb')
(num_entries, virtual_block_size, block_size, bct_key, bct_signature_hash, bct_signature) = unpack("IBB522x256s16s256s", f.read(0x0420))
f.seek(0x0444)
bct_signature_hash = bct_signature_hash.hex().upper()
bct_signature_hash = bct_signature_hash if bct_signature_hash == ("0" * 0x10) else "none"
customer_data = f.read(0xC4).hex().upper()
customer_data = customer_data if customer_data == ("0" * 0xC4) else "none"
info = "BCT File\nEntry count: 0x{0:X}\nVirtual block size: 0x{1:X}\nBlock size: 0x{2:X}\nKey: {3}\nSignature Hash: {4}\nSignature: {5}\nCustomer Data: {6}"
print(info.format(num_entries, virtual_block_size, block_size, bct_key.hex().upper(), bct_signature_hash, bct_signature.hex().upper(), customer_data))
#Ignore a lot of data that I don't need
f.seek(0x232C)
num_bootloaders = int.from_bytes(f.read(0x4), byteorder='little')
print("Bootloader count: {}".format(num_bootloaders))
for i in range(num_bootloaders):
(version, start_block, start_page, length, load_addr, entry_point, attribute, bootloader_hash, bootloader_signature) = unpack("IIIIIII16s256s", f.read(0x12C))
bootloader_hash = bootloader_hash.hex().upper()
bootloader_hash = bootloader_hash if bootloader_hash == ("0" * 0x10) else "none"
print("\nBootloader {0}\nVersion: 0x{1:X}\nBlock Start: 0x{2:X}\nStart Page: 0x{3:X}\nLength: 0x{4:X}\nLoad address: 0x{5:X}\nEntry point: 0x{6:X}\nAttribute: {7:X}\nHash: {8}\nSignature: {9}\n".format(i, version, start_block, start_page, length, load_addr, entry_point, attribute, bootloader_hash, bootloader_signature.hex().upper()))
f.close()
return
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment