ebenders | ec1e088 | 2011-09-07 15:36:11 +0300 | [diff] [blame] | 1 | import sys
|
ebenders | 198538a | 2011-09-07 11:12:47 +0300 | [diff] [blame] | 2 | from elftools.elf.structs import ELFStructs
|
ebenders | aa9f671 | 2011-09-08 11:27:53 +0300 | [diff] [blame] | 3 | from elftools.elf.elffile import ELFFile
|
eliben | ad4d589 | 2011-09-08 16:57:21 +0300 | [diff] [blame^] | 4 | from elftools.elf.sections import *
|
ebenders | 198538a | 2011-09-07 11:12:47 +0300 | [diff] [blame] | 5 |
|
ebenders | ec1e088 | 2011-09-07 15:36:11 +0300 | [diff] [blame] | 6 | # read a little-endian, 64-bit file
|
ebenders | e790d0d | 2011-09-07 15:21:07 +0300 | [diff] [blame] | 7 | es = ELFStructs(True, 64)
|
| 8 |
|
ebenders | e790d0d | 2011-09-07 15:21:07 +0300 | [diff] [blame] | 9 | stream = open('binfiles/z.elf', 'rb')
|
ebenders | ec1e088 | 2011-09-07 15:36:11 +0300 | [diff] [blame] | 10 |
|
ebenders | aa9f671 | 2011-09-08 11:27:53 +0300 | [diff] [blame] | 11 | efile = ELFFile(stream)
|
ebenders | ec1e088 | 2011-09-07 15:36:11 +0300 | [diff] [blame] | 12 |
|
eliben | 75b5fde | 2011-09-08 16:24:49 +0300 | [diff] [blame] | 13 | print '===> %s sections!' % efile.num_sections()
|
| 14 | print '===> %s segments!' % efile.num_segments()
|
| 15 |
|
eliben | a6416fd | 2011-09-08 14:49:30 +0300 | [diff] [blame] | 16 | for sec in efile.iter_sections():
|
eliben | ad4d589 | 2011-09-08 16:57:21 +0300 | [diff] [blame^] | 17 | print type(sec), sec.name
|
| 18 | if isinstance(sec, SymbolTableSection):
|
| 19 | print ' linked string table:', sec.stringtable.name
|
eliben | a6416fd | 2011-09-08 14:49:30 +0300 | [diff] [blame] | 20 |
|
| 21 | for seg in efile.iter_segments():
|
| 22 | print seg['p_type'], seg['p_offset']
|
| 23 |
|
eliben | ad4d589 | 2011-09-08 16:57:21 +0300 | [diff] [blame^] | 24 |
|
eliben | a6416fd | 2011-09-08 14:49:30 +0300 | [diff] [blame] | 25 | #~ print 'num', efile.num_sections()
|
| 26 | #~ sec = efile.get_section(39)
|
ebenders | a06062f | 2011-09-08 12:37:48 +0300 | [diff] [blame] | 27 | #~ print sec.header
|
eliben | a6416fd | 2011-09-08 14:49:30 +0300 | [diff] [blame] | 28 | #~ print sec.name
|
| 29 | #~ print sec['sh_type']
|
| 30 | #~ print map(ord, sec.data())
|
ebenders | a06062f | 2011-09-08 12:37:48 +0300 | [diff] [blame] | 31 |
|
| 32 | #~ print sec.stream
|
| 33 | #~ print map(ord, efile._stringtable)
|
| 34 |
|
ebenders | aa9f671 | 2011-09-08 11:27:53 +0300 | [diff] [blame] | 35 | #~ print efile.header
|
| 36 | #~ print dir(efile)
|
| 37 | #~ print efile['e_type']
|
| 38 |
|
ebenders | a06062f | 2011-09-08 12:37:48 +0300 | [diff] [blame] | 39 | #~ shtable_offset = efile['e_shoff']
|
| 40 | #~ strtable_section_offset = shtable_offset + efile['e_shstrndx'] * efile['e_shentsize']
|
ebenders | ec1e088 | 2011-09-07 15:36:11 +0300 | [diff] [blame] | 41 |
|
ebenders | a06062f | 2011-09-08 12:37:48 +0300 | [diff] [blame] | 42 | #~ # get to the section header for the sh string table
|
| 43 | #~ print strtable_section_offset
|
| 44 | #~ stream.seek(strtable_section_offset)
|
| 45 | #~ sheader = es.Elf_Shdr.parse_stream(stream)
|
| 46 | #~ print sheader
|
ebenders | ec1e088 | 2011-09-07 15:36:11 +0300 | [diff] [blame] | 47 |
|
ebenders | a06062f | 2011-09-08 12:37:48 +0300 | [diff] [blame] | 48 | #~ # yay, looks correct!!
|
| 49 | #~ stream.seek(sheader.sh_offset)
|
| 50 | #~ buf = stream.read(sheader.sh_size)
|
| 51 | #~ for c in buf:
|
| 52 | #~ sys.stdout.write('%02X' % ord(c))
|
ebenders | ec1e088 | 2011-09-07 15:36:11 +0300 | [diff] [blame] | 53 |
|
| 54 |
|
ebenders | e790d0d | 2011-09-07 15:21:07 +0300 | [diff] [blame] | 55 |
|
| 56 |
|
| 57 | #~ print es.Elf_Ehdr
|