Source code for cle.backends.pe.symbol

import logging

from cle.backends.symbol import Symbol, SymbolType

log = logging.getLogger(name=__name__)


[docs] class WinSymbol(Symbol): """ Represents a symbol for the PE format. """
[docs] def __init__(self, owner, name, addr, is_import, is_export, ordinal_number, forwarder): super().__init__(owner, name, addr, owner.arch.bytes, SymbolType.TYPE_FUNCTION) self.is_import = is_import self.is_export = is_export self.ordinal_number = ordinal_number self.forwarder = forwarder self.is_forward = forwarder is not None
[docs] def resolve_forwarder(self): if self.resolvedby is not None: return self.resolvedby sym = self seen = set() while sym is not None and sym.is_forward and sym.forwarder is not None: # FORWARDING if sym.forwarder in seen: log.warning("Infinite forwarding loop for %s", self) return None seen.add(sym.forwarder) owner_name, name = sym.forwarder.split(".", 1) owner = self.owner.loader.find_object(owner_name) if owner is None: return None sym = owner.get_symbol(name) self.resolvedby = sym return sym