def iterFuncChunks(self, ea): start = self.funcStart(ea) end = self.funcEnd(ea) if not start or not end: return [] current = idc.FirstFuncFchunk(start) chunks = [current] while True: next = idc.NextFuncFchunk(start, current) if next != idc.BADADDR: current = next chunks.append(next) else: break res = [] for chunk in chunks: chunk_end = idc.GetFchunkAttr(chunk, idc.FUNCATTR_END) res.extend(list(self.iterInstructions(chunk, chunk_end))) return res
def __chunks(cls, ea): '''enumerates all chunks in a function ''' res = idc.FirstFuncFchunk(ea) while res != idc.BADADDR: (start, end) = idc.GetFchunkAttr(res, idc.FUNCATTR_START), idc.GetFchunkAttr(res, idc.FUNCATTR_END) yield start,end res = idc.NextFuncFchunk(ea, res) return
def FunctionChunks(addr): result = [] entry = idc.GetFunctionAttr(addr, idc.FUNCATTR_START) chunk = idc.FirstFuncFchunk(entry) if chunk == BADADDR: return result # list the function chunks result.append([chunk, idc.GetFchunkAttr(chunk, idc.FUNCATTR_END)]) while chunk != BADADDR: chunk = idc.NextFuncFchunk(entry, chunk) if chunk != BADADDR: result.append([chunk, idc.GetFchunkAttr(chunk, idc.FUNCATTR_END)]) return result
def enumerate_function_chunks(f_start): """ The function gets a list of chunks for the function. @f_start - first address of the function @return - list of chunks """ # Enumerate all chunks in the function chunks = list() first_chunk = idc.FirstFuncFchunk(f_start) chunks.append((first_chunk, idc.GetFchunkAttr(first_chunk, idc.FUNCATTR_END))) next_chunk = first_chunk while next_chunk != 0xffffffffL: next_chunk = idc.NextFuncFchunk(f_start, next_chunk) if next_chunk != 0xffffffffL: chunks.append( (next_chunk, idc.GetFchunkAttr(next_chunk, idc.FUNCATTR_END))) return chunks