From 0081d76ba15b08be04cd2a7c7c65a7c0e6e7a6fe Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sat, 22 Sep 2018 10:06:19 +0200 Subject: Created a Chrysalide based unpackbootimg Python tool. --- python/unpackbootimg.py | 79 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 python/unpackbootimg.py diff --git a/python/unpackbootimg.py b/python/unpackbootimg.py new file mode 100644 index 0000000..addc408 --- /dev/null +++ b/python/unpackbootimg.py @@ -0,0 +1,79 @@ +#!/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) -- cgit v0.11.2-87-g4458