#!/usr/bin/python3 # -*- coding: utf-8 -*- import argparse import sys import pychrysalide from pychrysalide.analysis.contents import FileContent from pychrysalide.format.bootimg import BootimgFormat if __name__ == '__main__': """Script entry point.""" parser = argparse.ArgumentParser() parser.add_argument('bootimg', help='path to the Android boot imgage to process') args = parser.parse_args() cnt = FileContent(args.bootimg) if cnt is None: sys.exit('No content to load!') fmt = BootimgFormat(cnt) if fmt is None: sys.exit('Failed to load the boot image!') oattribs = [ 'magic', 'kernel_size', 'kernel_addr', 'ramdisk_size', 'ramdisk_addr', 'second_size', 'second_addr', 'tags_addr', 'page_size', 'header_version', 'os_version', 'name', 'cmdline', 'extra_cmdline' ] maxlen = 0 for a in oattribs: if len(a) > maxlen: maxlen = len(a) name = ' {0:<%u}' % (maxlen + 1) header = fmt.get_header() for a in oattribs: v = getattr(header, a) value = '0x%x' % v if type(v) == int else v print(name.format(a + ':'), value) with open(args.bootimg + '-' + a, 'w') as out: out.write(value) out.write('\n') contents = { 'kernel': fmt.get_kernel(), 'ramdisk': fmt.get_ramdisk(), 'second_stage': fmt.get_second_stage(), 'recovery_dtbo': fmt.get_recovery_dtbo() } for k, v in contents.items(): if v: with open(args.bootimg + '-' + k, 'wb') as out: out.write(v.data)