def declare_double_linked_list_type(structType, forward, backward): ''' declare a double linked list type. ''' # test existence flinkType = getattr(structType, forward) blinkType = getattr(structType, backward) d = dict(structType.getFields()) flinkType = d[forward] blinkType = d[backward] if not utils.isPointerType(flinkType): raise TypeError('The %s field is not a pointer.' % (forward)) if not utils.isPointerType(blinkType): raise TypeError('The %s field is not a pointer.' % (backward)) #XXX from haystack import model def iterateList(self, mappings): ''' iterate forward, then backward, until null or duplicate ''' done = [0] obj = self #print 'going forward ' for fieldname in [forward, backward]: link = getattr(obj, fieldname) addr = utils.getaddress(link) log.debug('iterateList got a <%s>/0x%x' % (link.__class__.__name__, addr)) nb = 0 while addr not in done: #print '%x %s'%(addr, addr in done) done.append(addr) memoryMap = utils.is_valid_address_value( addr, mappings, structType) if memoryMap == False: raise ValueError( 'the link of this linked list has a bad value') st = memoryMap.readStruct(addr, structType) model.keepRef(st, structType, addr) log.debug("keepRefx2 %s.%s @%x" % (structType, fieldname, addr)) yield addr # next link = getattr(st, fieldname) addr = utils.getaddress(link) #print 'going backward after %x'%(addr) raise StopIteration def loadMembers(self, mappings, depth): # should not be called, field typed as non loadable. log.debug('- <%s> loadMembers return TRUE' % (structType.__name__)) return True # set iterator on the list structure structType._iterateList = iterateList structType.loadMembers = loadMembers log.debug( '%s has beed fitted with a list iterator self._iterateList(mappings)' % (structType)) return
def declare_double_linked_list_type( structType, forward, backward): ''' declare a double linked list type. ''' # test existence flinkType = getattr(structType, forward) blinkType = getattr(structType, backward) d = dict(structType.getFields()) flinkType = d[forward] blinkType = d[backward] if not utils.isPointerType(flinkType): raise TypeError('The %s field is not a pointer.'%(forward)) if not utils.isPointerType(blinkType): raise TypeError('The %s field is not a pointer.'%(backward)) #XXX from haystack import model def iterateList(self, mappings): ''' iterate forward, then backward, until null or duplicate ''' done = [0] obj = self #print 'going forward ' for fieldname in [forward, backward]: link = getattr(obj, fieldname) addr = utils.getaddress(link) log.debug('iterateList got a <%s>/0x%x'%(link.__class__.__name__,addr)) nb=0 while addr not in done: #print '%x %s'%(addr, addr in done) done.append(addr) memoryMap = utils.is_valid_address_value( addr, mappings, structType) if memoryMap == False: raise ValueError('the link of this linked list has a bad value') st = memoryMap.readStruct( addr, structType) model.keepRef(st, structType, addr) log.debug("keepRefx2 %s.%s @%x"%(structType, fieldname, addr )) yield addr # next link = getattr(st, fieldname) addr = utils.getaddress(link) #print 'going backward after %x'%(addr) raise StopIteration def loadMembers(self, mappings, depth): # should not be called, field typed as non loadable. log.debug('- <%s> loadMembers return TRUE'%(structType.__name__)) return True # set iterator on the list structure structType._iterateList = iterateList structType.loadMembers = loadMembers log.debug('%s has beed fitted with a list iterator self._iterateList(mappings)'%(structType)) return
def test_keepRef(self): self.assertNotEqual( self.mappings, None ) for fname, ftype in self.heap_obj.getFields(): attr = getattr(self.heap_obj, fname) if isCStringPointer(ftype): # ignore that - attr_addr = getaddress(attr.ptr) continue elif isPointerType(ftype): attr_addr = getaddress(attr) else: continue if attr_addr == 0: continue self.assertTrue( utils.is_valid_address_value(attr_addr, self.mappings), '%s: 0x%x is not valid'%(fname, attr_addr)) # the book should register struct type, not pointer to strut type attr_type = model.get_subtype(ftype) # look in the books saved = model.getRefByAddr( attr_addr ) _class, _addr, _obj = saved[0] self.assertEquals( attr_addr, _addr) self.assertEquals( attr_type, _class, '%s != %s' %(type(ftype), type(_class))) self.assertTrue( model.hasRef( model.get_subtype(ftype), attr_addr)) return
def test_keepRef(self): self.assertNotEqual(self.mappings, None) for fname, ftype in self.heap_obj.getFields(): attr = getattr(self.heap_obj, fname) if isCStringPointer(ftype): # ignore that - attr_addr = getaddress(attr.ptr) continue elif isPointerType(ftype): attr_addr = getaddress(attr) else: continue if attr_addr == 0: continue self.assertTrue( utils.is_valid_address_value(attr_addr, self.mappings), '%s: 0x%x is not valid' % (fname, attr_addr)) # the book should register struct type, not pointer to strut type attr_type = model.get_subtype(ftype) # look in the books saved = model.getRefByAddr(attr_addr) _class, _addr, _obj = saved[0] self.assertEquals(attr_addr, _addr) self.assertEquals(attr_type, _class, '%s != %s' % (type(ftype), type(_class))) self.assertTrue(model.hasRef(model.get_subtype(ftype), attr_addr)) return
def check_varname_for_type(varname, structType): done = [] st = structType from haystack import model for v in varname: if not hasattr(st, v): fields = ["%s: %s"%(n,t) for n,t in st.getFields()] log.error('(%s.)%s does not exists in type %s\n\t%s'%('.'.join(done), v, st, '\n\t'.join(fields)) ) return False st = st.getFieldType(v) if utils.isPointerType(st): # accept pointers st = model.get_subtype(st) done.append(v) return True
def check_varname_for_type(varname, structType): done = [] st = structType from haystack import model for v in varname: if not hasattr(st, v): fields = ["%s: %s" % (n, t) for n, t in st.getFields()] log.error('(%s.)%s does not exists in type %s\n\t%s' % ('.'.join(done), v, st, '\n\t'.join(fields))) return False st = st.getFieldType(v) if utils.isPointerType(st): # accept pointers st = model.get_subtype(st) done.append(v) return True