Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from binascii import hexlify, unhexlify
- from itertools import izip, cycle
- import struct
- from sys import argv
- filename = argv[1]
- with open(filename,'rb') as fware:
- header_structure = '<iiiiii'
- header = fware.read(struct.calcsize(header_structure))
- short_key = unhexlify('BACDBCFED6CADDD3BAB9A3ABBFCBB5BE')
- # The longer key just rotates the short_key left by 1 byte each time
- key = ''
- for i in range(0,16):
- key += short_key
- short_key = short_key[1:16] + short_key[0]
- # XOR decode the header
- header = ''.join(chr(ord(c1) ^ ord(c2)) for c1, c2 in izip(header, cycle(key)))
- magic_number, header_checksum, total_length, file_number, language, device_class = struct.unpack_from(header_structure, header, 0)
- print ('Magic number: %08x' % magic_number)
- print ('Header checksum: %08x' % header_checksum)
- print ('Header length: %08x' % total_length)
- print ('File number: %08x' % file_number)
- print ('Language: %08x' % language)
- print ('Device class: %08x' % device_class)
- fware.seek(0)
- header = fware.read(total_length)
- header = ''.join(chr(ord(c1) ^ ord(c2)) for c1, c2 in izip(header, cycle(key)))
- # Header checksum is just a byte sum from the checksum to length
- print ('Calced checksum: %08x' % sum(ord(b) for b in header[12:]))
- # Extract the filenames and locations in the file.
- index = 64
- for _ in range(0, file_number):
- file_structure = '32siii'
- file_structure_size = struct.calcsize(file_structure)
- print hexlify(header[index:index+file_structure_size])
- file_name, file_start, file_length,checksum = struct.unpack_from('32siii', header, index)
- file_name = file_name.strip('\0')
- print ('File name: %s' % file_name)
- print ('Start: %08x' % file_start)
- print ('Length: %08x' % file_length)
- print ('Checksum: %08x' % checksum)
- index += file_structure_size
- fware.seek(file_start)
- file = fware.read(file_length)
- print ('Calced checksum: %08x' % sum(ord(b) for b in file))
- with open(file_name,'wb') as outfile:
- outfile.write(file)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement