def frame(cls, ea): '''Iterate through each field within the frame belonging to the function `ea`.''' F = func.by(ea) # iterate through all of the frame's members try: res = func.frame(F) except internal.exceptions.MissingTypeOrAttribute: logging.info( u"{:s}.frame({:#x}) : Skipping function at {:#x} due to a missing frame." .format('.'.join([__name__, cls.__name__]), ea, ea)) return for member in res.members: # if ida has named it and there's no comment, then skip if lvarNameQ(member.name) and not member.comment: continue # if it's a structure, then the type is the structure name if isinstance(member.type, struc.structure_t): logging.debug( u"{:s}.frame({:#x}) : Storing structure-based type as name for field {:+#x} with tne type {!s}." .format('.'.join([__name__, cls.__name__]), ea, member.offset, internal.utils.string.repr(member.type))) type = member.type.name # otherwise, the type is a tuple that we can serializer else: type = member.type # otherwise, it's just a regular field. so we can just save what's important. yield member.offset, (member.name, type, member.comment) return
def frame(cls, ea): '''Iterate through each field within the frame belonging to the function `ea`.''' F = func.by(ea) # iterate through all of the frame's members try: res = func.frame(F) except internal.exceptions.MissingTypeOrAttribute: logging.info(u"{:s}.frame({:#x}) : Skipping function at {:#x} due to a missing frame.".format('.'.join((__name__, cls.__name__)), ea, ea)) return for member in res.members: # if ida has named it and there's no comment, then skip if lvarNameQ(member.name) and not member.comment: continue # if it's a structure, then the type is the structure name if isinstance(member.type, struc.structure_t): logging.debug(u"{:s}.frame({:#x}) : Storing structure-based type as name for field {:+#x} with tne type {!s}.".format('.'.join((__name__, cls.__name__)), ea, member.offset, internal.utils.string.repr(member.type))) type = member.type.name # otherwise, the type is a tuple that we can serializer else: type = member.type # otherwise, it's just a regular field. so we can just save what's important. yield member.offset, (member.name, type, member.comment) return
def addressToLocation(ea, chunks=None): """Convert the address `ea` to a `(function, id, offset)`. The fields `id` and `offset` represent the chunk index and the offset into the chunk for the function at `ea`. If the list `chunks` is specified as a parameter, then use it as a tuple of ranges in order to calculate the correct address. """ F, chunks = func.by(ea), chunks or [ch for ch in func.chunks(ea)] cid, base = next((i, l) for i, (l, r) in enumerate(chunks) if l <= ea < r) return func.top(F), cid, ea - base
def content(cls, ea): '''Iterate through every tag belonging to the contents of the function at `ea`.''' F = func.by(ea) # iterate through every address in the function for ea in func.iterate(F): ui.navigation.set(ea) # yield the tags res = db.tag(ea) if res: yield ea, res return
def contents(location=False): """Iterate through the contents tags for all the functions within the database. Each iteration yields a tuple of the format `(location, tags)` where `location` can be either an address or a chunk identifier and offset depending on whether `location` was specified as true or not. """ global read # Iterate through each function in the database for ea in db.functions(): # it's faster to precalculate the chunks here F, chunks = func.by(ea), [ch for ch in func.chunks(ea)] # Iterate through the function's contents yielding each tag for ea, res in read.content(ea): loc = addressToLocation(ea, chunks=chunks) if location else ea yield loc, res continue return