def find_object_containing(self, addr): """ Return the object that contains the given address, or None if the address is unmapped. """ for obj in self.all_objects: if not obj.min_addr <= addr < obj.max_addr: continue if isinstance(obj.memory, str): return obj elif isinstance(obj.memory, Clemory): if AT.from_va(addr, obj).to_rva() in obj.memory: return obj else: raise CLEError('Unsupported memory type %s' % type(obj.memory)) return None
def describe_addr(self, addr): """ Returns a textual description of what's in memory at the provided address """ o = self.find_object_containing(addr) if o is None: return None off = AT.from_va(addr, o).to_rva() nameof = 'main binary' if o is self.main_object else o.provides if isinstance(o, ELF): if addr in o._plt.values(): for k,v in o._plt.iteritems(): if v == addr: return "PLT stub of %s in %s (offset %#x)" % (k, nameof, off) if off in o._symbols_by_addr: name = o._symbols_by_addr[off].name return "%s (offset %#x) in %s" % (name, off, nameof) return "Offset %#x in %s" % (off, nameof)
def test_invalid_va_raw(): nose.tools.assert_equal(AT.from_va(0xa1b6ed4, owner).to_raw(), None)
def test_valid_va_raw_translations(): nose.tools.assert_equal(AT.from_raw(0x1b3260, owner).to_va(), 0xa1b4260) nose.tools.assert_equal(AT.from_va(0xa1b6ed3, owner).to_raw(), 0x1b5ed3)
def test_va_rva_translation(): nose.tools.assert_equal(AT.from_rva(0, owner).to_va(), 0xa000000) nose.tools.assert_equal(AT.from_va(0xa1b9a1b, owner).to_rva(), 0x1b9a1b)