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