summaryrefslogtreecommitdiff
path: root/python/examples/kaitai/elf.py
diff options
context:
space:
mode:
authorAndrew Lamoureux <andrew@vector35.com>2019-03-16 01:16:06 -0400
committerRusty Wagner <rusty@vector35.com>2019-03-20 13:00:17 -0400
commit36650362e2723036605ae336a40b4064ffd1b0fb (patch)
tree7a050902e1f8abcd1987081ed303891934f156db /python/examples/kaitai/elf.py
parent8ab595cfbf92b80d4ef81913d0c82621db114702 (diff)
kaitai UI plugin + elf,macho,pe
Diffstat (limited to 'python/examples/kaitai/elf.py')
-rw-r--r--python/examples/kaitai/elf.py1685
1 files changed, 1685 insertions, 0 deletions
diff --git a/python/examples/kaitai/elf.py b/python/examples/kaitai/elf.py
new file mode 100644
index 00000000..b06956c4
--- /dev/null
+++ b/python/examples/kaitai/elf.py
@@ -0,0 +1,1685 @@
+# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
+
+from pkg_resources import parse_version
+from kaitaistruct import __version__ as ks_version, KaitaiStruct, KaitaiStream, BytesIO
+from enum import Enum
+import collections
+
+
+if parse_version(ks_version) < parse_version('0.7'):
+ raise Exception("Incompatible Kaitai Struct Python API: 0.7 or later is required, but you have %s" % (ks_version))
+
+class Elf(KaitaiStruct):
+ """
+ .. seealso::
+ Source - https://sourceware.org/git/?p=glibc.git;a=blob;f=elf/elf.h;hb=HEAD
+ """
+
+ class Endian(Enum):
+ le = 1
+ be = 2
+
+ class ShType(Enum):
+ null_type = 0
+ progbits = 1
+ symtab = 2
+ strtab = 3
+ rela = 4
+ hash = 5
+ dynamic = 6
+ note = 7
+ nobits = 8
+ rel = 9
+ shlib = 10
+ dynsym = 11
+ init_array = 14
+ fini_array = 15
+ preinit_array = 16
+ group = 17
+ symtab_shndx = 18
+ sunw_capchain = 1879048175
+ sunw_capinfo = 1879048176
+ sunw_symsort = 1879048177
+ sunw_tlssort = 1879048178
+ sunw_ldynsym = 1879048179
+ sunw_dof = 1879048180
+ sunw_cap = 1879048181
+ sunw_signature = 1879048182
+ sunw_annotate = 1879048183
+ sunw_debugstr = 1879048184
+ sunw_debug = 1879048185
+ sunw_move = 1879048186
+ sunw_comdat = 1879048187
+ sunw_syminfo = 1879048188
+ sunw_verdef = 1879048189
+ sunw_verneed = 1879048190
+ sunw_versym = 1879048191
+ sparc_gotdata = 1879048192
+ arm_exidx = 1879048193
+ arm_preemptmap = 1879048194
+ arm_attributes = 1879048195
+
+ class OsAbi(Enum):
+ system_v = 0
+ hp_ux = 1
+ netbsd = 2
+ gnu = 3
+ solaris = 6
+ aix = 7
+ irix = 8
+ freebsd = 9
+ tru64 = 10
+ modesto = 11
+ openbsd = 12
+ openvms = 13
+ nsk = 14
+ aros = 15
+ fenixos = 16
+ cloudabi = 17
+ openvos = 18
+
+ class Machine(Enum):
+ not_set = 0
+ sparc = 2
+ x86 = 3
+ mips = 8
+ powerpc = 20
+ arm = 40
+ superh = 42
+ ia_64 = 50
+ x86_64 = 62
+ aarch64 = 183
+ riscv = 243
+ bpf = 247
+
+ class DynamicArrayTags(Enum):
+ null = 0
+ needed = 1
+ pltrelsz = 2
+ pltgot = 3
+ hash = 4
+ strtab = 5
+ symtab = 6
+ rela = 7
+ relasz = 8
+ relaent = 9
+ strsz = 10
+ syment = 11
+ init = 12
+ fini = 13
+ soname = 14
+ rpath = 15
+ symbolic = 16
+ rel = 17
+ relsz = 18
+ relent = 19
+ pltrel = 20
+ debug = 21
+ textrel = 22
+ jmprel = 23
+ bind_now = 24
+ init_array = 25
+ fini_array = 26
+ init_arraysz = 27
+ fini_arraysz = 28
+ runpath = 29
+ flags = 30
+ preinit_array = 32
+ preinit_arraysz = 33
+ maxpostags = 34
+ sunw_auxiliary = 1610612749
+ sunw_filter = 1610612750
+ sunw_cap = 1610612752
+ sunw_symtab = 1610612753
+ sunw_symsz = 1610612754
+ sunw_sortent = 1610612755
+ sunw_symsort = 1610612756
+ sunw_symsortsz = 1610612757
+ sunw_tlssort = 1610612758
+ sunw_tlssortsz = 1610612759
+ sunw_capinfo = 1610612760
+ sunw_strpad = 1610612761
+ sunw_capchain = 1610612762
+ sunw_ldmach = 1610612763
+ sunw_capchainent = 1610612765
+ sunw_capchainsz = 1610612767
+ hios = 1879044096
+ valrnglo = 1879047424
+ gnu_prelinked = 1879047669
+ gnu_conflictsz = 1879047670
+ gnu_liblistsz = 1879047671
+ checksum = 1879047672
+ pltpadsz = 1879047673
+ moveent = 1879047674
+ movesz = 1879047675
+ feature_1 = 1879047676
+ posflag_1 = 1879047677
+ syminsz = 1879047678
+ valrnghi = 1879047679
+ addrrnglo = 1879047680
+ gnu_hash = 1879047925
+ tlsdesc_plt = 1879047926
+ tlsdesc_got = 1879047927
+ gnu_conflict = 1879047928
+ gnu_liblist = 1879047929
+ config = 1879047930
+ depaudit = 1879047931
+ audit = 1879047932
+ pltpad = 1879047933
+ movetab = 1879047934
+ addrrnghi = 1879047935
+ versym = 1879048176
+ relacount = 1879048185
+ relcount = 1879048186
+ flags_1 = 1879048187
+ verdef = 1879048188
+ verdefnum = 1879048189
+ verneed = 1879048190
+ verneednum = 1879048191
+ loproc = 1879048192
+ sparc_register = 1879048193
+ auxiliary = 2147483645
+ used = 2147483646
+ hiproc = 2147483647
+
+ class Bits(Enum):
+ b32 = 1
+ b64 = 2
+
+ class PhType(Enum):
+ null_type = 0
+ load = 1
+ dynamic = 2
+ interp = 3
+ note = 4
+ shlib = 5
+ phdr = 6
+ tls = 7
+ gnu_eh_frame = 1685382480
+ gnu_stack = 1685382481
+ gnu_relro = 1685382482
+ pax_flags = 1694766464
+ hios = 1879048191
+ arm_exidx = 1879048193
+
+ class ObjType(Enum):
+ relocatable = 1
+ executable = 2
+ shared = 3
+ core = 4
+ SEQ_FIELDS = ["magic", "bits", "endian", "ei_version", "abi", "abi_version", "pad", "header"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ self._debug['magic']['start'] = self._io.pos()
+ self.magic = self._io.ensure_fixed_contents(b"\x7F\x45\x4C\x46")
+ self._debug['magic']['end'] = self._io.pos()
+ self._debug['bits']['start'] = self._io.pos()
+ self.bits = KaitaiStream.resolve_enum(self._root.Bits, self._io.read_u1())
+ self._debug['bits']['end'] = self._io.pos()
+ self._debug['endian']['start'] = self._io.pos()
+ self.endian = KaitaiStream.resolve_enum(self._root.Endian, self._io.read_u1())
+ self._debug['endian']['end'] = self._io.pos()
+ self._debug['ei_version']['start'] = self._io.pos()
+ self.ei_version = self._io.read_u1()
+ self._debug['ei_version']['end'] = self._io.pos()
+ self._debug['abi']['start'] = self._io.pos()
+ self.abi = KaitaiStream.resolve_enum(self._root.OsAbi, self._io.read_u1())
+ self._debug['abi']['end'] = self._io.pos()
+ self._debug['abi_version']['start'] = self._io.pos()
+ self.abi_version = self._io.read_u1()
+ self._debug['abi_version']['end'] = self._io.pos()
+ self._debug['pad']['start'] = self._io.pos()
+ self.pad = self._io.read_bytes(7)
+ self._debug['pad']['end'] = self._io.pos()
+ self._debug['header']['start'] = self._io.pos()
+ self.header = self._root.EndianElf(self._io, self, self._root)
+ self.header._read()
+ self._debug['header']['end'] = self._io.pos()
+
+ class PhdrTypeFlags(KaitaiStruct):
+ SEQ_FIELDS = []
+ def __init__(self, value, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self.value = value
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ pass
+
+ @property
+ def read(self):
+ if hasattr(self, '_m_read'):
+ return self._m_read if hasattr(self, '_m_read') else None
+
+ self._m_read = (self.value & 4) != 0
+ return self._m_read if hasattr(self, '_m_read') else None
+
+ @property
+ def write(self):
+ if hasattr(self, '_m_write'):
+ return self._m_write if hasattr(self, '_m_write') else None
+
+ self._m_write = (self.value & 2) != 0
+ return self._m_write if hasattr(self, '_m_write') else None
+
+ @property
+ def execute(self):
+ if hasattr(self, '_m_execute'):
+ return self._m_execute if hasattr(self, '_m_execute') else None
+
+ self._m_execute = (self.value & 1) != 0
+ return self._m_execute if hasattr(self, '_m_execute') else None
+
+ @property
+ def mask_proc(self):
+ if hasattr(self, '_m_mask_proc'):
+ return self._m_mask_proc if hasattr(self, '_m_mask_proc') else None
+
+ self._m_mask_proc = (self.value & 4026531840) != 0
+ return self._m_mask_proc if hasattr(self, '_m_mask_proc') else None
+
+
+ class SectionHeaderFlags(KaitaiStruct):
+ SEQ_FIELDS = []
+ def __init__(self, value, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self.value = value
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ pass
+
+ @property
+ def merge(self):
+ """might be merged."""
+ if hasattr(self, '_m_merge'):
+ return self._m_merge if hasattr(self, '_m_merge') else None
+
+ self._m_merge = (self.value & 16) != 0
+ return self._m_merge if hasattr(self, '_m_merge') else None
+
+ @property
+ def mask_os(self):
+ """OS-specific."""
+ if hasattr(self, '_m_mask_os'):
+ return self._m_mask_os if hasattr(self, '_m_mask_os') else None
+
+ self._m_mask_os = (self.value & 267386880) != 0
+ return self._m_mask_os if hasattr(self, '_m_mask_os') else None
+
+ @property
+ def exclude(self):
+ """section is excluded unless referenced or allocated (Solaris)."""
+ if hasattr(self, '_m_exclude'):
+ return self._m_exclude if hasattr(self, '_m_exclude') else None
+
+ self._m_exclude = (self.value & 134217728) != 0
+ return self._m_exclude if hasattr(self, '_m_exclude') else None
+
+ @property
+ def mask_proc(self):
+ """Processor-specific."""
+ if hasattr(self, '_m_mask_proc'):
+ return self._m_mask_proc if hasattr(self, '_m_mask_proc') else None
+
+ self._m_mask_proc = (self.value & 4026531840) != 0
+ return self._m_mask_proc if hasattr(self, '_m_mask_proc') else None
+
+ @property
+ def strings(self):
+ """contains nul-terminated strings."""
+ if hasattr(self, '_m_strings'):
+ return self._m_strings if hasattr(self, '_m_strings') else None
+
+ self._m_strings = (self.value & 32) != 0
+ return self._m_strings if hasattr(self, '_m_strings') else None
+
+ @property
+ def os_non_conforming(self):
+ """non-standard OS specific handling required."""
+ if hasattr(self, '_m_os_non_conforming'):
+ return self._m_os_non_conforming if hasattr(self, '_m_os_non_conforming') else None
+
+ self._m_os_non_conforming = (self.value & 256) != 0
+ return self._m_os_non_conforming if hasattr(self, '_m_os_non_conforming') else None
+
+ @property
+ def alloc(self):
+ """occupies memory during execution."""
+ if hasattr(self, '_m_alloc'):
+ return self._m_alloc if hasattr(self, '_m_alloc') else None
+
+ self._m_alloc = (self.value & 2) != 0
+ return self._m_alloc if hasattr(self, '_m_alloc') else None
+
+ @property
+ def exec_instr(self):
+ """executable."""
+ if hasattr(self, '_m_exec_instr'):
+ return self._m_exec_instr if hasattr(self, '_m_exec_instr') else None
+
+ self._m_exec_instr = (self.value & 4) != 0
+ return self._m_exec_instr if hasattr(self, '_m_exec_instr') else None
+
+ @property
+ def info_link(self):
+ """'sh_info' contains SHT index."""
+ if hasattr(self, '_m_info_link'):
+ return self._m_info_link if hasattr(self, '_m_info_link') else None
+
+ self._m_info_link = (self.value & 64) != 0
+ return self._m_info_link if hasattr(self, '_m_info_link') else None
+
+ @property
+ def write(self):
+ """writable."""
+ if hasattr(self, '_m_write'):
+ return self._m_write if hasattr(self, '_m_write') else None
+
+ self._m_write = (self.value & 1) != 0
+ return self._m_write if hasattr(self, '_m_write') else None
+
+ @property
+ def link_order(self):
+ """preserve order after combining."""
+ if hasattr(self, '_m_link_order'):
+ return self._m_link_order if hasattr(self, '_m_link_order') else None
+
+ self._m_link_order = (self.value & 128) != 0
+ return self._m_link_order if hasattr(self, '_m_link_order') else None
+
+ @property
+ def ordered(self):
+ """special ordering requirement (Solaris)."""
+ if hasattr(self, '_m_ordered'):
+ return self._m_ordered if hasattr(self, '_m_ordered') else None
+
+ self._m_ordered = (self.value & 67108864) != 0
+ return self._m_ordered if hasattr(self, '_m_ordered') else None
+
+ @property
+ def tls(self):
+ """section hold thread-local data."""
+ if hasattr(self, '_m_tls'):
+ return self._m_tls if hasattr(self, '_m_tls') else None
+
+ self._m_tls = (self.value & 1024) != 0
+ return self._m_tls if hasattr(self, '_m_tls') else None
+
+ @property
+ def group(self):
+ """section is member of a group."""
+ if hasattr(self, '_m_group'):
+ return self._m_group if hasattr(self, '_m_group') else None
+
+ self._m_group = (self.value & 512) != 0
+ return self._m_group if hasattr(self, '_m_group') else None
+
+
+ class DtFlag1Values(KaitaiStruct):
+ SEQ_FIELDS = []
+ def __init__(self, value, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self.value = value
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ pass
+
+ @property
+ def singleton(self):
+ """Singleton symbols are used."""
+ if hasattr(self, '_m_singleton'):
+ return self._m_singleton if hasattr(self, '_m_singleton') else None
+
+ self._m_singleton = (self.value & 33554432) != 0
+ return self._m_singleton if hasattr(self, '_m_singleton') else None
+
+ @property
+ def ignmuldef(self):
+ if hasattr(self, '_m_ignmuldef'):
+ return self._m_ignmuldef if hasattr(self, '_m_ignmuldef') else None
+
+ self._m_ignmuldef = (self.value & 262144) != 0
+ return self._m_ignmuldef if hasattr(self, '_m_ignmuldef') else None
+
+ @property
+ def loadfltr(self):
+ """Trigger filtee loading at runtime."""
+ if hasattr(self, '_m_loadfltr'):
+ return self._m_loadfltr if hasattr(self, '_m_loadfltr') else None
+
+ self._m_loadfltr = (self.value & 16) != 0
+ return self._m_loadfltr if hasattr(self, '_m_loadfltr') else None
+
+ @property
+ def initfirst(self):
+ """Set RTLD_INITFIRST for this object."""
+ if hasattr(self, '_m_initfirst'):
+ return self._m_initfirst if hasattr(self, '_m_initfirst') else None
+
+ self._m_initfirst = (self.value & 32) != 0
+ return self._m_initfirst if hasattr(self, '_m_initfirst') else None
+
+ @property
+ def symintpose(self):
+ """Object has individual interposers."""
+ if hasattr(self, '_m_symintpose'):
+ return self._m_symintpose if hasattr(self, '_m_symintpose') else None
+
+ self._m_symintpose = (self.value & 8388608) != 0
+ return self._m_symintpose if hasattr(self, '_m_symintpose') else None
+
+ @property
+ def noreloc(self):
+ if hasattr(self, '_m_noreloc'):
+ return self._m_noreloc if hasattr(self, '_m_noreloc') else None
+
+ self._m_noreloc = (self.value & 4194304) != 0
+ return self._m_noreloc if hasattr(self, '_m_noreloc') else None
+
+ @property
+ def confalt(self):
+ """Configuration alternative created."""
+ if hasattr(self, '_m_confalt'):
+ return self._m_confalt if hasattr(self, '_m_confalt') else None
+
+ self._m_confalt = (self.value & 8192) != 0
+ return self._m_confalt if hasattr(self, '_m_confalt') else None
+
+ @property
+ def dispreldne(self):
+ """Disp reloc applied at build time."""
+ if hasattr(self, '_m_dispreldne'):
+ return self._m_dispreldne if hasattr(self, '_m_dispreldne') else None
+
+ self._m_dispreldne = (self.value & 32768) != 0
+ return self._m_dispreldne if hasattr(self, '_m_dispreldne') else None
+
+ @property
+ def rtld_global(self):
+ """Set RTLD_GLOBAL for this object."""
+ if hasattr(self, '_m_rtld_global'):
+ return self._m_rtld_global if hasattr(self, '_m_rtld_global') else None
+
+ self._m_rtld_global = (self.value & 2) != 0
+ return self._m_rtld_global if hasattr(self, '_m_rtld_global') else None
+
+ @property
+ def nodelete(self):
+ """Set RTLD_NODELETE for this object."""
+ if hasattr(self, '_m_nodelete'):
+ return self._m_nodelete if hasattr(self, '_m_nodelete') else None
+
+ self._m_nodelete = (self.value & 8) != 0
+ return self._m_nodelete if hasattr(self, '_m_nodelete') else None
+
+ @property
+ def trans(self):
+ if hasattr(self, '_m_trans'):
+ return self._m_trans if hasattr(self, '_m_trans') else None
+
+ self._m_trans = (self.value & 512) != 0
+ return self._m_trans if hasattr(self, '_m_trans') else None
+
+ @property
+ def origin(self):
+ """$ORIGIN must be handled."""
+ if hasattr(self, '_m_origin'):
+ return self._m_origin if hasattr(self, '_m_origin') else None
+
+ self._m_origin = (self.value & 128) != 0
+ return self._m_origin if hasattr(self, '_m_origin') else None
+
+ @property
+ def now(self):
+ """Set RTLD_NOW for this object."""
+ if hasattr(self, '_m_now'):
+ return self._m_now if hasattr(self, '_m_now') else None
+
+ self._m_now = (self.value & 1) != 0
+ return self._m_now if hasattr(self, '_m_now') else None
+
+ @property
+ def nohdr(self):
+ if hasattr(self, '_m_nohdr'):
+ return self._m_nohdr if hasattr(self, '_m_nohdr') else None
+
+ self._m_nohdr = (self.value & 1048576) != 0
+ return self._m_nohdr if hasattr(self, '_m_nohdr') else None
+
+ @property
+ def endfiltee(self):
+ """Filtee terminates filters search."""
+ if hasattr(self, '_m_endfiltee'):
+ return self._m_endfiltee if hasattr(self, '_m_endfiltee') else None
+
+ self._m_endfiltee = (self.value & 16384) != 0
+ return self._m_endfiltee if hasattr(self, '_m_endfiltee') else None
+
+ @property
+ def nodirect(self):
+ """Object has no-direct binding."""
+ if hasattr(self, '_m_nodirect'):
+ return self._m_nodirect if hasattr(self, '_m_nodirect') else None
+
+ self._m_nodirect = (self.value & 131072) != 0
+ return self._m_nodirect if hasattr(self, '_m_nodirect') else None
+
+ @property
+ def globaudit(self):
+ """Global auditing required."""
+ if hasattr(self, '_m_globaudit'):
+ return self._m_globaudit if hasattr(self, '_m_globaudit') else None
+
+ self._m_globaudit = (self.value & 16777216) != 0
+ return self._m_globaudit if hasattr(self, '_m_globaudit') else None
+
+ @property
+ def noksyms(self):
+ if hasattr(self, '_m_noksyms'):
+ return self._m_noksyms if hasattr(self, '_m_noksyms') else None
+
+ self._m_noksyms = (self.value & 524288) != 0
+ return self._m_noksyms if hasattr(self, '_m_noksyms') else None
+
+ @property
+ def interpose(self):
+ """Object is used to interpose."""
+ if hasattr(self, '_m_interpose'):
+ return self._m_interpose if hasattr(self, '_m_interpose') else None
+
+ self._m_interpose = (self.value & 1024) != 0
+ return self._m_interpose if hasattr(self, '_m_interpose') else None
+
+ @property
+ def nodump(self):
+ """Object can't be dldump'ed."""
+ if hasattr(self, '_m_nodump'):
+ return self._m_nodump if hasattr(self, '_m_nodump') else None
+
+ self._m_nodump = (self.value & 4096) != 0
+ return self._m_nodump if hasattr(self, '_m_nodump') else None
+
+ @property
+ def disprelpnd(self):
+ """Disp reloc applied at run-time."""
+ if hasattr(self, '_m_disprelpnd'):
+ return self._m_disprelpnd if hasattr(self, '_m_disprelpnd') else None
+
+ self._m_disprelpnd = (self.value & 65536) != 0
+ return self._m_disprelpnd if hasattr(self, '_m_disprelpnd') else None
+
+ @property
+ def noopen(self):
+ """Set RTLD_NOOPEN for this object."""
+ if hasattr(self, '_m_noopen'):
+ return self._m_noopen if hasattr(self, '_m_noopen') else None
+
+ self._m_noopen = (self.value & 64) != 0
+ return self._m_noopen if hasattr(self, '_m_noopen') else None
+
+ @property
+ def stub(self):
+ if hasattr(self, '_m_stub'):
+ return self._m_stub if hasattr(self, '_m_stub') else None
+
+ self._m_stub = (self.value & 67108864) != 0
+ return self._m_stub if hasattr(self, '_m_stub') else None
+
+ @property
+ def direct(self):
+ """Direct binding enabled."""
+ if hasattr(self, '_m_direct'):
+ return self._m_direct if hasattr(self, '_m_direct') else None
+
+ self._m_direct = (self.value & 256) != 0
+ return self._m_direct if hasattr(self, '_m_direct') else None
+
+ @property
+ def edited(self):
+ """Object is modified after built."""
+ if hasattr(self, '_m_edited'):
+ return self._m_edited if hasattr(self, '_m_edited') else None
+
+ self._m_edited = (self.value & 2097152) != 0
+ return self._m_edited if hasattr(self, '_m_edited') else None
+
+ @property
+ def group(self):
+ """Set RTLD_GROUP for this object."""
+ if hasattr(self, '_m_group'):
+ return self._m_group if hasattr(self, '_m_group') else None
+
+ self._m_group = (self.value & 4) != 0
+ return self._m_group if hasattr(self, '_m_group') else None
+
+ @property
+ def pie(self):
+ if hasattr(self, '_m_pie'):
+ return self._m_pie if hasattr(self, '_m_pie') else None
+
+ self._m_pie = (self.value & 134217728) != 0
+ return self._m_pie if hasattr(self, '_m_pie') else None
+
+ @property
+ def nodeflib(self):
+ """Ignore default lib search path."""
+ if hasattr(self, '_m_nodeflib'):
+ return self._m_nodeflib if hasattr(self, '_m_nodeflib') else None
+
+ self._m_nodeflib = (self.value & 2048) != 0
+ return self._m_nodeflib if hasattr(self, '_m_nodeflib') else None
+
+
+ class EndianElf(KaitaiStruct):
+ SEQ_FIELDS = ["e_type", "machine", "e_version", "entry_point", "program_header_offset", "section_header_offset", "flags", "e_ehsize", "program_header_entry_size", "qty_program_header", "section_header_entry_size", "qty_section_header", "section_names_idx"]
+ def __init__(self, _io, _parent=None, _root=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+ _on = self._root.endian
+ if _on == self._root.Endian.le:
+ self._is_le = True
+ elif _on == self._root.Endian.be:
+ self._is_le = False
+
+ if self._is_le == True:
+ self._read_le()
+ elif self._is_le == False:
+ self._read_be()
+ else:
+ raise Exception("Unable to decide endianness")
+
+ def _read_le(self):
+ self._debug['e_type']['start'] = self._io.pos()
+ self.e_type = KaitaiStream.resolve_enum(self._root.ObjType, self._io.read_u2le())
+ self._debug['e_type']['end'] = self._io.pos()
+ self._debug['machine']['start'] = self._io.pos()
+ self.machine = KaitaiStream.resolve_enum(self._root.Machine, self._io.read_u2le())
+ self._debug['machine']['end'] = self._io.pos()
+ self._debug['e_version']['start'] = self._io.pos()
+ self.e_version = self._io.read_u4le()
+ self._debug['e_version']['end'] = self._io.pos()
+ self._debug['entry_point']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.entry_point = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.entry_point = self._io.read_u8le()
+ self._debug['entry_point']['end'] = self._io.pos()
+ self._debug['program_header_offset']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.program_header_offset = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.program_header_offset = self._io.read_u8le()
+ self._debug['program_header_offset']['end'] = self._io.pos()
+ self._debug['section_header_offset']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.section_header_offset = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.section_header_offset = self._io.read_u8le()
+ self._debug['section_header_offset']['end'] = self._io.pos()
+ self._debug['flags']['start'] = self._io.pos()
+ self.flags = self._io.read_bytes(4)
+ self._debug['flags']['end'] = self._io.pos()
+ self._debug['e_ehsize']['start'] = self._io.pos()
+ self.e_ehsize = self._io.read_u2le()
+ self._debug['e_ehsize']['end'] = self._io.pos()
+ self._debug['program_header_entry_size']['start'] = self._io.pos()
+ self.program_header_entry_size = self._io.read_u2le()
+ self._debug['program_header_entry_size']['end'] = self._io.pos()
+ self._debug['qty_program_header']['start'] = self._io.pos()
+ self.qty_program_header = self._io.read_u2le()
+ self._debug['qty_program_header']['end'] = self._io.pos()
+ self._debug['section_header_entry_size']['start'] = self._io.pos()
+ self.section_header_entry_size = self._io.read_u2le()
+ self._debug['section_header_entry_size']['end'] = self._io.pos()
+ self._debug['qty_section_header']['start'] = self._io.pos()
+ self.qty_section_header = self._io.read_u2le()
+ self._debug['qty_section_header']['end'] = self._io.pos()
+ self._debug['section_names_idx']['start'] = self._io.pos()
+ self.section_names_idx = self._io.read_u2le()
+ self._debug['section_names_idx']['end'] = self._io.pos()
+
+ def _read_be(self):
+ self._debug['e_type']['start'] = self._io.pos()
+ self.e_type = KaitaiStream.resolve_enum(self._root.ObjType, self._io.read_u2be())
+ self._debug['e_type']['end'] = self._io.pos()
+ self._debug['machine']['start'] = self._io.pos()
+ self.machine = KaitaiStream.resolve_enum(self._root.Machine, self._io.read_u2be())
+ self._debug['machine']['end'] = self._io.pos()
+ self._debug['e_version']['start'] = self._io.pos()
+ self.e_version = self._io.read_u4be()
+ self._debug['e_version']['end'] = self._io.pos()
+ self._debug['entry_point']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.entry_point = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.entry_point = self._io.read_u8be()
+ self._debug['entry_point']['end'] = self._io.pos()
+ self._debug['program_header_offset']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.program_header_offset = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.program_header_offset = self._io.read_u8be()
+ self._debug['program_header_offset']['end'] = self._io.pos()
+ self._debug['section_header_offset']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.section_header_offset = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.section_header_offset = self._io.read_u8be()
+ self._debug['section_header_offset']['end'] = self._io.pos()
+ self._debug['flags']['start'] = self._io.pos()
+ self.flags = self._io.read_bytes(4)
+ self._debug['flags']['end'] = self._io.pos()
+ self._debug['e_ehsize']['start'] = self._io.pos()
+ self.e_ehsize = self._io.read_u2be()
+ self._debug['e_ehsize']['end'] = self._io.pos()
+ self._debug['program_header_entry_size']['start'] = self._io.pos()
+ self.program_header_entry_size = self._io.read_u2be()
+ self._debug['program_header_entry_size']['end'] = self._io.pos()
+ self._debug['qty_program_header']['start'] = self._io.pos()
+ self.qty_program_header = self._io.read_u2be()
+ self._debug['qty_program_header']['end'] = self._io.pos()
+ self._debug['section_header_entry_size']['start'] = self._io.pos()
+ self.section_header_entry_size = self._io.read_u2be()
+ self._debug['section_header_entry_size']['end'] = self._io.pos()
+ self._debug['qty_section_header']['start'] = self._io.pos()
+ self.qty_section_header = self._io.read_u2be()
+ self._debug['qty_section_header']['end'] = self._io.pos()
+ self._debug['section_names_idx']['start'] = self._io.pos()
+ self.section_names_idx = self._io.read_u2be()
+ self._debug['section_names_idx']['end'] = self._io.pos()
+
+ class DynsymSectionEntry64(KaitaiStruct):
+ SEQ_FIELDS = ["name_offset", "info", "other", "shndx", "value", "size"]
+ def __init__(self, _io, _parent=None, _root=None, _is_le=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._is_le = _is_le
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+
+ if self._is_le == True:
+ self._read_le()
+ elif self._is_le == False:
+ self._read_be()
+ else:
+ raise Exception("Unable to decide endianness")
+
+ def _read_le(self):
+ self._debug['name_offset']['start'] = self._io.pos()
+ self.name_offset = self._io.read_u4le()
+ self._debug['name_offset']['end'] = self._io.pos()
+ self._debug['info']['start'] = self._io.pos()
+ self.info = self._io.read_u1()
+ self._debug['info']['end'] = self._io.pos()
+ self._debug['other']['start'] = self._io.pos()
+ self.other = self._io.read_u1()
+ self._debug['other']['end'] = self._io.pos()
+ self._debug['shndx']['start'] = self._io.pos()
+ self.shndx = self._io.read_u2le()
+ self._debug['shndx']['end'] = self._io.pos()
+ self._debug['value']['start'] = self._io.pos()
+ self.value = self._io.read_u8le()
+ self._debug['value']['end'] = self._io.pos()
+ self._debug['size']['start'] = self._io.pos()
+ self.size = self._io.read_u8le()
+ self._debug['size']['end'] = self._io.pos()
+
+ def _read_be(self):
+ self._debug['name_offset']['start'] = self._io.pos()
+ self.name_offset = self._io.read_u4be()
+ self._debug['name_offset']['end'] = self._io.pos()
+ self._debug['info']['start'] = self._io.pos()
+ self.info = self._io.read_u1()
+ self._debug['info']['end'] = self._io.pos()
+ self._debug['other']['start'] = self._io.pos()
+ self.other = self._io.read_u1()
+ self._debug['other']['end'] = self._io.pos()
+ self._debug['shndx']['start'] = self._io.pos()
+ self.shndx = self._io.read_u2be()
+ self._debug['shndx']['end'] = self._io.pos()
+ self._debug['value']['start'] = self._io.pos()
+ self.value = self._io.read_u8be()
+ self._debug['value']['end'] = self._io.pos()
+ self._debug['size']['start'] = self._io.pos()
+ self.size = self._io.read_u8be()
+ self._debug['size']['end'] = self._io.pos()
+
+
+ class ProgramHeader(KaitaiStruct):
+ SEQ_FIELDS = ["type", "flags64", "offset", "vaddr", "paddr", "filesz", "memsz", "flags32", "align"]
+ def __init__(self, _io, _parent=None, _root=None, _is_le=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._is_le = _is_le
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+
+ if self._is_le == True:
+ self._read_le()
+ elif self._is_le == False:
+ self._read_be()
+ else:
+ raise Exception("Unable to decide endianness")
+
+ def _read_le(self):
+ self._debug['type']['start'] = self._io.pos()
+ self.type = KaitaiStream.resolve_enum(self._root.PhType, self._io.read_u4le())
+ self._debug['type']['end'] = self._io.pos()
+ if self._root.bits == self._root.Bits.b64:
+ self._debug['flags64']['start'] = self._io.pos()
+ self.flags64 = self._io.read_u4le()
+ self._debug['flags64']['end'] = self._io.pos()
+
+ self._debug['offset']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.offset = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.offset = self._io.read_u8le()
+ self._debug['offset']['end'] = self._io.pos()
+ self._debug['vaddr']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.vaddr = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.vaddr = self._io.read_u8le()
+ self._debug['vaddr']['end'] = self._io.pos()
+ self._debug['paddr']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.paddr = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.paddr = self._io.read_u8le()
+ self._debug['paddr']['end'] = self._io.pos()
+ self._debug['filesz']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.filesz = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.filesz = self._io.read_u8le()
+ self._debug['filesz']['end'] = self._io.pos()
+ self._debug['memsz']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.memsz = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.memsz = self._io.read_u8le()
+ self._debug['memsz']['end'] = self._io.pos()
+ if self._root.bits == self._root.Bits.b32:
+ self._debug['flags32']['start'] = self._io.pos()
+ self.flags32 = self._io.read_u4le()
+ self._debug['flags32']['end'] = self._io.pos()
+
+ self._debug['align']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.align = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.align = self._io.read_u8le()
+ self._debug['align']['end'] = self._io.pos()
+
+ def _read_be(self):
+ self._debug['type']['start'] = self._io.pos()
+ self.type = KaitaiStream.resolve_enum(self._root.PhType, self._io.read_u4be())
+ self._debug['type']['end'] = self._io.pos()
+ if self._root.bits == self._root.Bits.b64:
+ self._debug['flags64']['start'] = self._io.pos()
+ self.flags64 = self._io.read_u4be()
+ self._debug['flags64']['end'] = self._io.pos()
+
+ self._debug['offset']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.offset = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.offset = self._io.read_u8be()
+ self._debug['offset']['end'] = self._io.pos()
+ self._debug['vaddr']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.vaddr = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.vaddr = self._io.read_u8be()
+ self._debug['vaddr']['end'] = self._io.pos()
+ self._debug['paddr']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.paddr = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.paddr = self._io.read_u8be()
+ self._debug['paddr']['end'] = self._io.pos()
+ self._debug['filesz']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.filesz = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.filesz = self._io.read_u8be()
+ self._debug['filesz']['end'] = self._io.pos()
+ self._debug['memsz']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.memsz = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.memsz = self._io.read_u8be()
+ self._debug['memsz']['end'] = self._io.pos()
+ if self._root.bits == self._root.Bits.b32:
+ self._debug['flags32']['start'] = self._io.pos()
+ self.flags32 = self._io.read_u4be()
+ self._debug['flags32']['end'] = self._io.pos()
+
+ self._debug['align']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.align = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.align = self._io.read_u8be()
+ self._debug['align']['end'] = self._io.pos()
+
+ @property
+ def dynamic(self):
+ if hasattr(self, '_m_dynamic'):
+ return self._m_dynamic if hasattr(self, '_m_dynamic') else None
+
+ if self.type == self._root.PhType.dynamic:
+ io = self._root._io
+ _pos = io.pos()
+ io.seek(self.offset)
+ self._debug['_m_dynamic']['start'] = io.pos()
+ if self._is_le:
+ self._raw__m_dynamic = io.read_bytes(self.filesz)
+ io = KaitaiStream(BytesIO(self._raw__m_dynamic))
+ self._m_dynamic = self._root.EndianElf.DynamicSection(io, self, self._root, self._is_le)
+ self._m_dynamic._read()
+ else:
+ self._raw__m_dynamic = io.read_bytes(self.filesz)
+ io = KaitaiStream(BytesIO(self._raw__m_dynamic))
+ self._m_dynamic = self._root.EndianElf.DynamicSection(io, self, self._root, self._is_le)
+ self._m_dynamic._read()
+ self._debug['_m_dynamic']['end'] = io.pos()
+ io.seek(_pos)
+
+ return self._m_dynamic if hasattr(self, '_m_dynamic') else None
+
+ @property
+ def flags_obj(self):
+ if hasattr(self, '_m_flags_obj'):
+ return self._m_flags_obj if hasattr(self, '_m_flags_obj') else None
+
+ self._debug['_m_flags_obj']['start'] = self._io.pos()
+ if self._is_le:
+ self._m_flags_obj = self._root.PhdrTypeFlags((self.flags64 | self.flags32), self._io, self, self._root)
+ self._m_flags_obj._read()
+ else:
+ self._m_flags_obj = self._root.PhdrTypeFlags((self.flags64 | self.flags32), self._io, self, self._root)
+ self._m_flags_obj._read()
+ self._debug['_m_flags_obj']['end'] = self._io.pos()
+ return self._m_flags_obj if hasattr(self, '_m_flags_obj') else None
+
+
+ class DynamicSectionEntry(KaitaiStruct):
+ SEQ_FIELDS = ["tag", "value_or_ptr"]
+ def __init__(self, _io, _parent=None, _root=None, _is_le=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._is_le = _is_le
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+
+ if self._is_le == True:
+ self._read_le()
+ elif self._is_le == False:
+ self._read_be()
+ else:
+ raise Exception("Unable to decide endianness")
+
+ def _read_le(self):
+ self._debug['tag']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.tag = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.tag = self._io.read_u8le()
+ self._debug['tag']['end'] = self._io.pos()
+ self._debug['value_or_ptr']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.value_or_ptr = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.value_or_ptr = self._io.read_u8le()
+ self._debug['value_or_ptr']['end'] = self._io.pos()
+
+ def _read_be(self):
+ self._debug['tag']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.tag = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.tag = self._io.read_u8be()
+ self._debug['tag']['end'] = self._io.pos()
+ self._debug['value_or_ptr']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.value_or_ptr = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.value_or_ptr = self._io.read_u8be()
+ self._debug['value_or_ptr']['end'] = self._io.pos()
+
+ @property
+ def tag_enum(self):
+ if hasattr(self, '_m_tag_enum'):
+ return self._m_tag_enum if hasattr(self, '_m_tag_enum') else None
+
+ self._m_tag_enum = KaitaiStream.resolve_enum(self._root.DynamicArrayTags, self.tag)
+ return self._m_tag_enum if hasattr(self, '_m_tag_enum') else None
+
+ @property
+ def flag_1_values(self):
+ if hasattr(self, '_m_flag_1_values'):
+ return self._m_flag_1_values if hasattr(self, '_m_flag_1_values') else None
+
+ if self.tag_enum == self._root.DynamicArrayTags.flags_1:
+ self._debug['_m_flag_1_values']['start'] = self._io.pos()
+ if self._is_le:
+ self._m_flag_1_values = self._root.DtFlag1Values(self.value_or_ptr, self._io, self, self._root)
+ self._m_flag_1_values._read()
+ else:
+ self._m_flag_1_values = self._root.DtFlag1Values(self.value_or_ptr, self._io, self, self._root)
+ self._m_flag_1_values._read()
+ self._debug['_m_flag_1_values']['end'] = self._io.pos()
+
+ return self._m_flag_1_values if hasattr(self, '_m_flag_1_values') else None
+
+
+ class SectionHeader(KaitaiStruct):
+ SEQ_FIELDS = ["ofs_name", "type", "flags", "addr", "ofs_body", "len_body", "linked_section_idx", "info", "align", "entry_size"]
+ def __init__(self, _io, _parent=None, _root=None, _is_le=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._is_le = _is_le
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+
+ if self._is_le == True:
+ self._read_le()
+ elif self._is_le == False:
+ self._read_be()
+ else:
+ raise Exception("Unable to decide endianness")
+
+ def _read_le(self):
+ self._debug['ofs_name']['start'] = self._io.pos()
+ self.ofs_name = self._io.read_u4le()
+ self._debug['ofs_name']['end'] = self._io.pos()
+ self._debug['type']['start'] = self._io.pos()
+ self.type = KaitaiStream.resolve_enum(self._root.ShType, self._io.read_u4le())
+ self._debug['type']['end'] = self._io.pos()
+ self._debug['flags']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.flags = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.flags = self._io.read_u8le()
+ self._debug['flags']['end'] = self._io.pos()
+ self._debug['addr']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.addr = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.addr = self._io.read_u8le()
+ self._debug['addr']['end'] = self._io.pos()
+ self._debug['ofs_body']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.ofs_body = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.ofs_body = self._io.read_u8le()
+ self._debug['ofs_body']['end'] = self._io.pos()
+ self._debug['len_body']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.len_body = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.len_body = self._io.read_u8le()
+ self._debug['len_body']['end'] = self._io.pos()
+ self._debug['linked_section_idx']['start'] = self._io.pos()
+ self.linked_section_idx = self._io.read_u4le()
+ self._debug['linked_section_idx']['end'] = self._io.pos()
+ self._debug['info']['start'] = self._io.pos()
+ self.info = self._io.read_bytes(4)
+ self._debug['info']['end'] = self._io.pos()
+ self._debug['align']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.align = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.align = self._io.read_u8le()
+ self._debug['align']['end'] = self._io.pos()
+ self._debug['entry_size']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.entry_size = self._io.read_u4le()
+ elif _on == self._root.Bits.b64:
+ self.entry_size = self._io.read_u8le()
+ self._debug['entry_size']['end'] = self._io.pos()
+
+ def _read_be(self):
+ self._debug['ofs_name']['start'] = self._io.pos()
+ self.ofs_name = self._io.read_u4be()
+ self._debug['ofs_name']['end'] = self._io.pos()
+ self._debug['type']['start'] = self._io.pos()
+ self.type = KaitaiStream.resolve_enum(self._root.ShType, self._io.read_u4be())
+ self._debug['type']['end'] = self._io.pos()
+ self._debug['flags']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.flags = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.flags = self._io.read_u8be()
+ self._debug['flags']['end'] = self._io.pos()
+ self._debug['addr']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.addr = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.addr = self._io.read_u8be()
+ self._debug['addr']['end'] = self._io.pos()
+ self._debug['ofs_body']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.ofs_body = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.ofs_body = self._io.read_u8be()
+ self._debug['ofs_body']['end'] = self._io.pos()
+ self._debug['len_body']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.len_body = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.len_body = self._io.read_u8be()
+ self._debug['len_body']['end'] = self._io.pos()
+ self._debug['linked_section_idx']['start'] = self._io.pos()
+ self.linked_section_idx = self._io.read_u4be()
+ self._debug['linked_section_idx']['end'] = self._io.pos()
+ self._debug['info']['start'] = self._io.pos()
+ self.info = self._io.read_bytes(4)
+ self._debug['info']['end'] = self._io.pos()
+ self._debug['align']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.align = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.align = self._io.read_u8be()
+ self._debug['align']['end'] = self._io.pos()
+ self._debug['entry_size']['start'] = self._io.pos()
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ self.entry_size = self._io.read_u4be()
+ elif _on == self._root.Bits.b64:
+ self.entry_size = self._io.read_u8be()
+ self._debug['entry_size']['end'] = self._io.pos()
+
+ @property
+ def body(self):
+ if hasattr(self, '_m_body'):
+ return self._m_body if hasattr(self, '_m_body') else None
+
+ io = self._root._io
+ _pos = io.pos()
+ io.seek(self.ofs_body)
+ self._debug['_m_body']['start'] = io.pos()
+ if self._is_le:
+ _on = self.type
+ if _on == self._root.ShType.strtab:
+ self._raw__m_body = io.read_bytes(self.len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_body))
+ self._m_body = self._root.EndianElf.StringsStruct(io, self, self._root, self._is_le)
+ self._m_body._read()
+ elif _on == self._root.ShType.dynamic:
+ self._raw__m_body = io.read_bytes(self.len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_body))
+ self._m_body = self._root.EndianElf.DynamicSection(io, self, self._root, self._is_le)
+ self._m_body._read()
+ elif _on == self._root.ShType.dynsym:
+ self._raw__m_body = io.read_bytes(self.len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_body))
+ self._m_body = self._root.EndianElf.DynsymSection(io, self, self._root, self._is_le)
+ self._m_body._read()
+ elif _on == self._root.ShType.dynstr:
+ self._raw__m_body = io.read_bytes(self.len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_body))
+ self._m_body = self._root.EndianElf.StringsStruct(io, self, self._root, self._is_le)
+ self._m_body._read()
+ else:
+ self._m_body = io.read_bytes(self.len_body)
+ else:
+ _on = self.type
+ if _on == self._root.ShType.strtab:
+ self._raw__m_body = io.read_bytes(self.len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_body))
+ self._m_body = self._root.EndianElf.StringsStruct(io, self, self._root, self._is_le)
+ self._m_body._read()
+ elif _on == self._root.ShType.dynamic:
+ self._raw__m_body = io.read_bytes(self.len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_body))
+ self._m_body = self._root.EndianElf.DynamicSection(io, self, self._root, self._is_le)
+ self._m_body._read()
+ elif _on == self._root.ShType.dynsym:
+ self._raw__m_body = io.read_bytes(self.len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_body))
+ self._m_body = self._root.EndianElf.DynsymSection(io, self, self._root, self._is_le)
+ self._m_body._read()
+ elif _on == self._root.ShType.dynstr:
+ self._raw__m_body = io.read_bytes(self.len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_body))
+ self._m_body = self._root.EndianElf.StringsStruct(io, self, self._root, self._is_le)
+ self._m_body._read()
+ else:
+ self._m_body = io.read_bytes(self.len_body)
+ self._debug['_m_body']['end'] = io.pos()
+ io.seek(_pos)
+ return self._m_body if hasattr(self, '_m_body') else None
+
+ @property
+ def name(self):
+ if hasattr(self, '_m_name'):
+ return self._m_name if hasattr(self, '_m_name') else None
+
+ io = self._root.header.strings._io
+ _pos = io.pos()
+ io.seek(self.ofs_name)
+ self._debug['_m_name']['start'] = io.pos()
+ if self._is_le:
+ self._m_name = (io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
+ else:
+ self._m_name = (io.read_bytes_term(0, False, True, True)).decode(u"ASCII")
+ self._debug['_m_name']['end'] = io.pos()
+ io.seek(_pos)
+ return self._m_name if hasattr(self, '_m_name') else None
+
+ @property
+ def flags_obj(self):
+ if hasattr(self, '_m_flags_obj'):
+ return self._m_flags_obj if hasattr(self, '_m_flags_obj') else None
+
+ self._debug['_m_flags_obj']['start'] = self._io.pos()
+ if self._is_le:
+ self._m_flags_obj = self._root.SectionHeaderFlags(self.flags, self._io, self, self._root)
+ self._m_flags_obj._read()
+ else:
+ self._m_flags_obj = self._root.SectionHeaderFlags(self.flags, self._io, self, self._root)
+ self._m_flags_obj._read()
+ self._debug['_m_flags_obj']['end'] = self._io.pos()
+ return self._m_flags_obj if hasattr(self, '_m_flags_obj') else None
+
+
+ class DynamicSection(KaitaiStruct):
+ SEQ_FIELDS = ["entries"]
+ def __init__(self, _io, _parent=None, _root=None, _is_le=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._is_le = _is_le
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+
+ if self._is_le == True:
+ self._read_le()
+ elif self._is_le == False:
+ self._read_be()
+ else:
+ raise Exception("Unable to decide endianness")
+
+ def _read_le(self):
+ self._debug['entries']['start'] = self._io.pos()
+ self.entries = []
+ i = 0
+ while not self._io.is_eof():
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _t_entries = self._root.EndianElf.DynamicSectionEntry(self._io, self, self._root, self._is_le)
+ _t_entries._read()
+ self.entries.append(_t_entries)
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ i += 1
+
+ self._debug['entries']['end'] = self._io.pos()
+
+ def _read_be(self):
+ self._debug['entries']['start'] = self._io.pos()
+ self.entries = []
+ i = 0
+ while not self._io.is_eof():
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _t_entries = self._root.EndianElf.DynamicSectionEntry(self._io, self, self._root, self._is_le)
+ _t_entries._read()
+ self.entries.append(_t_entries)
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ i += 1
+
+ self._debug['entries']['end'] = self._io.pos()
+
+
+ class DynsymSection(KaitaiStruct):
+ SEQ_FIELDS = ["entries"]
+ def __init__(self, _io, _parent=None, _root=None, _is_le=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._is_le = _is_le
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+
+ if self._is_le == True:
+ self._read_le()
+ elif self._is_le == False:
+ self._read_be()
+ else:
+ raise Exception("Unable to decide endianness")
+
+ def _read_le(self):
+ self._debug['entries']['start'] = self._io.pos()
+ self.entries = []
+ i = 0
+ while not self._io.is_eof():
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _t_entries = self._root.EndianElf.DynsymSectionEntry32(self._io, self, self._root, self._is_le)
+ _t_entries._read()
+ self.entries.append(_t_entries)
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ elif _on == self._root.Bits.b64:
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _t_entries = self._root.EndianElf.DynsymSectionEntry64(self._io, self, self._root, self._is_le)
+ _t_entries._read()
+ self.entries.append(_t_entries)
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ i += 1
+
+ self._debug['entries']['end'] = self._io.pos()
+
+ def _read_be(self):
+ self._debug['entries']['start'] = self._io.pos()
+ self.entries = []
+ i = 0
+ while not self._io.is_eof():
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _on = self._root.bits
+ if _on == self._root.Bits.b32:
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _t_entries = self._root.EndianElf.DynsymSectionEntry32(self._io, self, self._root, self._is_le)
+ _t_entries._read()
+ self.entries.append(_t_entries)
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ elif _on == self._root.Bits.b64:
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ _t_entries = self._root.EndianElf.DynsymSectionEntry64(self._io, self, self._root, self._is_le)
+ _t_entries._read()
+ self.entries.append(_t_entries)
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ i += 1
+
+ self._debug['entries']['end'] = self._io.pos()
+
+
+ class DynsymSectionEntry32(KaitaiStruct):
+ SEQ_FIELDS = ["name_offset", "value", "size", "info", "other", "shndx"]
+ def __init__(self, _io, _parent=None, _root=None, _is_le=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._is_le = _is_le
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+
+ if self._is_le == True:
+ self._read_le()
+ elif self._is_le == False:
+ self._read_be()
+ else:
+ raise Exception("Unable to decide endianness")
+
+ def _read_le(self):
+ self._debug['name_offset']['start'] = self._io.pos()
+ self.name_offset = self._io.read_u4le()
+ self._debug['name_offset']['end'] = self._io.pos()
+ self._debug['value']['start'] = self._io.pos()
+ self.value = self._io.read_u4le()
+ self._debug['value']['end'] = self._io.pos()
+ self._debug['size']['start'] = self._io.pos()
+ self.size = self._io.read_u4le()
+ self._debug['size']['end'] = self._io.pos()
+ self._debug['info']['start'] = self._io.pos()
+ self.info = self._io.read_u1()
+ self._debug['info']['end'] = self._io.pos()
+ self._debug['other']['start'] = self._io.pos()
+ self.other = self._io.read_u1()
+ self._debug['other']['end'] = self._io.pos()
+ self._debug['shndx']['start'] = self._io.pos()
+ self.shndx = self._io.read_u2le()
+ self._debug['shndx']['end'] = self._io.pos()
+
+ def _read_be(self):
+ self._debug['name_offset']['start'] = self._io.pos()
+ self.name_offset = self._io.read_u4be()
+ self._debug['name_offset']['end'] = self._io.pos()
+ self._debug['value']['start'] = self._io.pos()
+ self.value = self._io.read_u4be()
+ self._debug['value']['end'] = self._io.pos()
+ self._debug['size']['start'] = self._io.pos()
+ self.size = self._io.read_u4be()
+ self._debug['size']['end'] = self._io.pos()
+ self._debug['info']['start'] = self._io.pos()
+ self.info = self._io.read_u1()
+ self._debug['info']['end'] = self._io.pos()
+ self._debug['other']['start'] = self._io.pos()
+ self.other = self._io.read_u1()
+ self._debug['other']['end'] = self._io.pos()
+ self._debug['shndx']['start'] = self._io.pos()
+ self.shndx = self._io.read_u2be()
+ self._debug['shndx']['end'] = self._io.pos()
+
+
+ class StringsStruct(KaitaiStruct):
+ SEQ_FIELDS = ["entries"]
+ def __init__(self, _io, _parent=None, _root=None, _is_le=None):
+ self._io = _io
+ self._parent = _parent
+ self._root = _root if _root else self
+ self._is_le = _is_le
+ self._debug = collections.defaultdict(dict)
+
+ def _read(self):
+
+ if self._is_le == True:
+ self._read_le()
+ elif self._is_le == False:
+ self._read_be()
+ else:
+ raise Exception("Unable to decide endianness")
+
+ def _read_le(self):
+ self._debug['entries']['start'] = self._io.pos()
+ self.entries = []
+ i = 0
+ while not self._io.is_eof():
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ self.entries.append((self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII"))
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ i += 1
+
+ self._debug['entries']['end'] = self._io.pos()
+
+ def _read_be(self):
+ self._debug['entries']['start'] = self._io.pos()
+ self.entries = []
+ i = 0
+ while not self._io.is_eof():
+ if not 'arr' in self._debug['entries']:
+ self._debug['entries']['arr'] = []
+ self._debug['entries']['arr'].append({'start': self._io.pos()})
+ self.entries.append((self._io.read_bytes_term(0, False, True, True)).decode(u"ASCII"))
+ self._debug['entries']['arr'][len(self.entries) - 1]['end'] = self._io.pos()
+ i += 1
+
+ self._debug['entries']['end'] = self._io.pos()
+
+
+ @property
+ def program_headers(self):
+ if hasattr(self, '_m_program_headers'):
+ return self._m_program_headers if hasattr(self, '_m_program_headers') else None
+
+ _pos = self._io.pos()
+ self._io.seek(self.program_header_offset)
+ self._debug['_m_program_headers']['start'] = self._io.pos()
+ if self._is_le:
+ self._raw__m_program_headers = [None] * (self.qty_program_header)
+ self._m_program_headers = [None] * (self.qty_program_header)
+ for i in range(self.qty_program_header):
+ if not 'arr' in self._debug['_m_program_headers']:
+ self._debug['_m_program_headers']['arr'] = []
+ self._debug['_m_program_headers']['arr'].append({'start': self._io.pos()})
+ self._raw__m_program_headers[i] = self._io.read_bytes(self.program_header_entry_size)
+ io = KaitaiStream(BytesIO(self._raw__m_program_headers[i]))
+ _t__m_program_headers = self._root.EndianElf.ProgramHeader(io, self, self._root, self._is_le)
+ _t__m_program_headers._read()
+ self._m_program_headers[i] = _t__m_program_headers
+ self._debug['_m_program_headers']['arr'][i]['end'] = self._io.pos()
+
+ else:
+ self._raw__m_program_headers = [None] * (self.qty_program_header)
+ self._m_program_headers = [None] * (self.qty_program_header)
+ for i in range(self.qty_program_header):
+ if not 'arr' in self._debug['_m_program_headers']:
+ self._debug['_m_program_headers']['arr'] = []
+ self._debug['_m_program_headers']['arr'].append({'start': self._io.pos()})
+ self._raw__m_program_headers[i] = self._io.read_bytes(self.program_header_entry_size)
+ io = KaitaiStream(BytesIO(self._raw__m_program_headers[i]))
+ _t__m_program_headers = self._root.EndianElf.ProgramHeader(io, self, self._root, self._is_le)
+ _t__m_program_headers._read()
+ self._m_program_headers[i] = _t__m_program_headers
+ self._debug['_m_program_headers']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['_m_program_headers']['end'] = self._io.pos()
+ self._io.seek(_pos)
+ return self._m_program_headers if hasattr(self, '_m_program_headers') else None
+
+ @property
+ def section_headers(self):
+ if hasattr(self, '_m_section_headers'):
+ return self._m_section_headers if hasattr(self, '_m_section_headers') else None
+
+ _pos = self._io.pos()
+ self._io.seek(self.section_header_offset)
+ self._debug['_m_section_headers']['start'] = self._io.pos()
+ if self._is_le:
+ self._raw__m_section_headers = [None] * (self.qty_section_header)
+ self._m_section_headers = [None] * (self.qty_section_header)
+ for i in range(self.qty_section_header):
+ if not 'arr' in self._debug['_m_section_headers']:
+ self._debug['_m_section_headers']['arr'] = []
+ self._debug['_m_section_headers']['arr'].append({'start': self._io.pos()})
+ self._raw__m_section_headers[i] = self._io.read_bytes(self.section_header_entry_size)
+ io = KaitaiStream(BytesIO(self._raw__m_section_headers[i]))
+ _t__m_section_headers = self._root.EndianElf.SectionHeader(io, self, self._root, self._is_le)
+ _t__m_section_headers._read()
+ self._m_section_headers[i] = _t__m_section_headers
+ self._debug['_m_section_headers']['arr'][i]['end'] = self._io.pos()
+
+ else:
+ self._raw__m_section_headers = [None] * (self.qty_section_header)
+ self._m_section_headers = [None] * (self.qty_section_header)
+ for i in range(self.qty_section_header):
+ if not 'arr' in self._debug['_m_section_headers']:
+ self._debug['_m_section_headers']['arr'] = []
+ self._debug['_m_section_headers']['arr'].append({'start': self._io.pos()})
+ self._raw__m_section_headers[i] = self._io.read_bytes(self.section_header_entry_size)
+ io = KaitaiStream(BytesIO(self._raw__m_section_headers[i]))
+ _t__m_section_headers = self._root.EndianElf.SectionHeader(io, self, self._root, self._is_le)
+ _t__m_section_headers._read()
+ self._m_section_headers[i] = _t__m_section_headers
+ self._debug['_m_section_headers']['arr'][i]['end'] = self._io.pos()
+
+ self._debug['_m_section_headers']['end'] = self._io.pos()
+ self._io.seek(_pos)
+ return self._m_section_headers if hasattr(self, '_m_section_headers') else None
+
+ @property
+ def strings(self):
+ if hasattr(self, '_m_strings'):
+ return self._m_strings if hasattr(self, '_m_strings') else None
+
+ _pos = self._io.pos()
+ self._io.seek(self.section_headers[self.section_names_idx].ofs_body)
+ self._debug['_m_strings']['start'] = self._io.pos()
+ if self._is_le:
+ self._raw__m_strings = self._io.read_bytes(self.section_headers[self.section_names_idx].len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_strings))
+ self._m_strings = self._root.EndianElf.StringsStruct(io, self, self._root, self._is_le)
+ self._m_strings._read()
+ else:
+ self._raw__m_strings = self._io.read_bytes(self.section_headers[self.section_names_idx].len_body)
+ io = KaitaiStream(BytesIO(self._raw__m_strings))
+ self._m_strings = self._root.EndianElf.StringsStruct(io, self, self._root, self._is_le)
+ self._m_strings._read()
+ self._debug['_m_strings']['end'] = self._io.pos()
+ self._io.seek(_pos)
+ return self._m_strings if hasattr(self, '_m_strings') else None
+
+
+