summaryrefslogtreecommitdiff
path: root/python/unpackbootimg.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/unpackbootimg.py')
-rw-r--r--python/unpackbootimg.py79
1 files changed, 79 insertions, 0 deletions
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)