################################################# # # Dr. Gadget # ---------------------------------------- # author: Dennis Elser # bugs: de dot backtrace at dennis # version: 0.2 # # history: # 07/24/2010 v0.1 - first public release # 07/26/2010 v0.1.1 - added copy/cut/paste # 07/31/2010 v0.2 - with kind permission, # added Elias Bachaalany's # script to find opcodes/instructions # # known bugs: # - disassembly view is not always refreshed # correctly # ################################################## # have a look at http://hexblog.com/2009/09/assembling_and_finding_instruc.html # in order to learn how to use the instruction finder """ TODOs: - show DEP/ASLR status? - implement Auto analysis II? - fix popup menu logic/handler - clean up ;-) """ import idaapi, idc from idaapi import simplecustviewer_t import struct, os pluginname = "Dr. Gadget" # ----------------------------------------------------------------------- class Gadget: def __init__ (self): self.controlFlowChangers = ["ret", "retn"] self.maxInsCnt = 15 def make_func (self, ea): """ creates a function starting at address ea any existing functions/code will be undefined at this address """ funcEA = idaapi.get_func (ea) if funcEA: DelFunction (funcEA.startEA) # FIXME MakeUnknown (ea, 100, idc.DOUNK_EXPAND) AnalyzeArea (ea, ea+100) MakeCode (ea) return MakeFunction (ea, BADADDR) def get_disasm (self, ea): next = ea gadget = [] endEA = BADADDR inscnt = 0 # FIXME: stop disassembling at f.endEA ? while (next != endEA) or (inscnt < self.maxInsCnt): line = GetDisasm (next) gadget.append (line) for mnem in self.controlFlowChangers: if mnem in line: return gadget inscnt += 1 next = NextHead (next, endEA) return gadget # ----------------------------------------------------------------------- class PayloadHelper: def __init__ (self): self.items = [] def load_from_file (self, fileName): self.__init__() result = False f = None try: f = open (fileName, "rb") buf = f.read () self.items = self.get_items_from_buf (buf) result = True except: pass finally: if f: f.close () return result def save_to_file (self, fileName): result = False f = None try: f = open (fileName, "wb") buf = self.get_buf_from_items () f.write (buf) result = True except: pass finally: if f: f.close () return result def get_buf_from_items (self): buf = "" for val in self.items: buf += struct.pack ("