summaryrefslogtreecommitdiff
path: root/python/unpackbootimg.py
blob: addc4086d73b0f5fb807f3d504a3aa51275e2ed1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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)