diff options
| author | Xusheng <xusheng@vector35.com> | 2021-07-01 12:34:30 +0800 |
|---|---|---|
| committer | Xusheng Li <xushengli@protonmail.com> | 2021-07-05 10:11:47 +0800 |
| commit | 13ff200ba134b8704f37eca99c42b70dab0d17dc (patch) | |
| tree | 876b3db3c53f704b31152aeaede1f2edc9d27b24 /python/examples/kaitai/elf.py | |
| parent | 4039a800349dcd587833d3e27d9137e4649818f4 (diff) | |
Remove snippet and kaitai plugin. Note their individual links.
Diffstat (limited to 'python/examples/kaitai/elf.py')
| -rw-r--r-- | python/examples/kaitai/elf.py | 1685 |
1 files changed, 0 insertions, 1685 deletions
diff --git a/python/examples/kaitai/elf.py b/python/examples/kaitai/elf.py deleted file mode 100644 index 6f5eb252..00000000 --- a/python/examples/kaitai/elf.py +++ /dev/null @@ -1,1685 +0,0 @@ -# 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 - - - |
