def OnDeleteLine(self, n): ans = idaapi.askyn_c( 1, "HIDECANCEL\nAre you sure you want to delete function [%s] @ [%s]?" % (self.items[n][3], self.items[n][4])) if ans == 1: asms = Assembler.LoadSavedAssemblers() item = int(self.items[n][2], 16) if asms != None and len(asms.keys()) > 0: for asm in asms.itervalues(): if asm.functions.has_key(item): print "Removed [%08x]!" % item del asm.functions[item] asm.SaveState() opty_ea = int(self.items[n][4], 16) print "set_name[%08x]" % opty_ea idc.MakeComm(opty_ea, "") idaapi.set_name(opty_ea, "") idc.DelFunction(opty_ea) comment = idc.Comment(item) comment = re.sub(r"(?i)OPTY@\[[\d+abcdef]+\];\s*", "", comment) idc.MakeComm(item, comment) self.populate_items() return n
def optimice(): ea = idc.ScreenEA() print "Starting optimization @ [%08x]" % ea f = Function.Function(ea) cfg = CFGOptimization.ReduceJMP(f) peep = CodeOptimization.PeepHole(f) dead = CodeOptimization.DeadCodeElimination(f) modified = True while modified: modified = False f.AssertCFGStructure() modified |= cfg.Reduce() modified |= cfg.JccReduce() modified |= cfg.JccReduceComplementary() modified |= peep.OptimizeFunction() modified |= dead.OptimizeFunction() f.CleanUp() #f.PrintBlocks() f.CleanUp() f.AssertCFGStructure() #f.PrintBlocks() asms = Assembler.LoadSavedAssemblers() if asms != None and len(asms.keys()) > 1: print "Ask user to choose one!" elif asms != None and len(asms.keys()) == 1: asm = asms.values()[0] else: asm = Assembler.Assemble() asm.Assemble(f) asm.SaveState() print "Optimization ended!"
def populate_items(self): asms = Assembler.LoadSavedAssemblers() lst = [] if asms != None and len(asms.keys()) > 0: for asm in asms.itervalues(): for key in asm.functions.iterkeys(): lst.append([ "%08x" % asm.segment_start, idc.GetFunctionName(key), "%08x" % key, idc.GetFunctionName(asm.functions[key][0]), "%08x" % asm.functions[key][0] ]) del asms self.items = lst return self.items