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)
|