2 from elftools
.elf
.structs
import ELFStructs
3 from elftools
.elf
.elffile
import ELFFile
4 from elftools
.elf
.sections
import *
6 # read a little-endian, 64-bit file
7 es
= ELFStructs(True, 64)
9 stream
= open('binfiles/z.elf', 'rb')
10 #stream = open('binfiles/z32.elf', 'rb')
12 efile
= ELFFile(stream
)
14 print '===> %s sections!' % efile
.num_sections()
15 print '===> %s segments!' % efile
.num_segments()
17 for sec
in efile
.iter_sections():
18 print type(sec
), sec
.name
19 if isinstance(sec
, SymbolTableSection
):
20 print ' linked string table:', sec
.stringtable
.name
22 for seg
in efile
.iter_segments():
23 print type(seg
), seg
['p_type'], seg
['p_offset']
25 for sec
in efile
.iter_sections():
26 if isinstance(sec
, SymbolTableSection
):
27 print 'symbol table "%s ~~~"' % sec
.name
28 for sym
in sec
.iter_symbols():
29 print '%-26s %s %s' % (sym
.name
, sym
['st_info']['type'], sym
['st_info']['bind'])
32 #~ print 'num', efile.num_sections()
33 #~ sec = efile.get_section(39)
36 #~ print sec['sh_type']
37 #~ print map(ord, sec.data())
40 #~ print map(ord, efile._stringtable)
44 #~ print efile['e_type']
46 #~ shtable_offset = efile['e_shoff']
47 #~ strtable_section_offset = shtable_offset + efile['e_shstrndx'] * efile['e_shentsize']
49 #~ # get to the section header for the sh string table
50 #~ print strtable_section_offset
51 #~ stream.seek(strtable_section_offset)
52 #~ sheader = es.Elf_Shdr.parse_stream(stream)
55 #~ # yay, looks correct!!
56 #~ stream.seek(sheader.sh_offset)
57 #~ buf = stream.read(sheader.sh_size)
59 #~ sys.stdout.write('%02X' % ord(c))