Skip to content

Instantly share code, notes, and snippets.

@zielmicha
Last active August 29, 2015 13:57
Show Gist options
  • Save zielmicha/9582851 to your computer and use it in GitHub Desktop.
Save zielmicha/9582851 to your computer and use it in GitHub Desktop.
Unpack Android's bootimg into kernel image and ramdisk
import struct
import sys
import gzip
fn = sys.argv[1]
f = open(fn)
if f.read(8) != 'ANDROID!':
sys.exit('Not a mkbootimg file.')
_header = struct.unpack('<' + 'I' * 10, f.read(10 * 4))
ksize, kaddr, rsize, raddr, ssize, saddr, taddr, pagesize, _, _ = _header
bootname = f.read(16)
cmdline = f.read(512)
id = f.read(8 * 4)
extra = f.read(1024)
def trim(s): return s.rstrip('\0')
def npages(s): return (s + pagesize - 1) // pagesize
def nbytes(s): return (s + pagesize - 1) // pagesize * pagesize
print 'Pagesize:', pagesize
print 'Bootname:', repr(trim(bootname))
print 'Cmdline:', repr(trim(bootname))
print 'Id:', repr(trim(id))
print 'Extra:', repr(trim(extra))
# from mkbootimg.c:
base = 0x10000000;
kernel_offset = 0x00008000;
ramdisk_offset = 0x01000000;
second_offset = 0x00f00000;
tags_offset = 0x00000100;
print 'Kernel address:', hex(kaddr), 'default:', hex(base + kernel_offset)
print 'Ramdisk address:', hex(raddr), 'default:', hex(base + ramdisk_offset)
print '2stage address:', hex(saddr), 'default:', hex(base + second_offset)
print 'Tags address:', hex(taddr), 'default:', hex(base + tags_offset)
assert f.tell() <= pagesize
f.seek(pagesize)
def read_pages(name, size):
flashsize = nbytes(size)
data = f.read(flashsize)
print 'First 16 bytes of', name, repr(data[:16])
print 'Flash size:', flashsize, 'size:', size
target = fn + '.' + name
print 'Writing', name, 'to', target
with open(target, 'w') as ff:
ff.write(data[:size])
read_pages('kernel', ksize)
read_pages('ramdisk.gz', rsize)
read_pages('2stage', ssize)
print 'Decompressing ramdisk'
ramdisk = gzip.open(fn + '.ramdisk.gz').read()
with open(fn + '.ramdisk', 'w') as ff:
ff.write(ramdisk)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment