def SimpleAsm(string): if sys.modules.has_key('miasm'): try: i_opcode = x86_mn.asm(string.lower()) except: print ">Assembler:SimpleAsm - Error miasm.asm() for [%s]" % string i_opcode = '' if len(i_opcode) > 0: return i_opcode idc.Batch(1) while True: seg_start = random.randint(0x1000, 0xffffffff) seg_size = 0x20 if idc.SegCreate(seg_start, seg_start + seg_size, 0, 1, 0, 0) != 0: break tmp = idaapi.assemble(seg_start, 0, seg_start, 1, string) if tmp == 0: while idc.SegDelete(seg_start, 0) != 0: pass idc.Batch(0) print "Failed to assemble [%s]" % string raise MiscError idc.MakeCode(seg_start) opcode = ''.join([ chr(idc.Byte(seg_start + i)) for i in xrange(0, idc.ItemSize(seg_start) - 1) ]) while idc.SegDelete(seg_start, 0) != 0: pass idc.Batch(0) return opcode
def SimpleAsm(string): if sys.modules.has_key('miasm'): try: i_opcode = x86_mn.asm(string.lower()) except: print ">Assembler:SimpleAsm - Error miasm.asm() for [%s]" % string i_opcode = '' if len(i_opcode) > 0: return i_opcode idc.Batch(1) while True: seg_start = random.randint(0x1000, 0xffffffff) seg_size = 0x20 if idc.SegCreate(seg_start, seg_start+seg_size, 0, 1, 0, 0) != 0: break tmp = idaapi.assemble(seg_start, 0, seg_start, 1, string) if tmp == 0: while idc.SegDelete(seg_start, 0) != 0: pass idc.Batch(0) print "Failed to assemble [%s]" % string raise MiscError idc.MakeCode(seg_start) opcode = ''.join([ chr(idc.Byte(seg_start+i)) for i in xrange(0, idc.ItemSize(seg_start)-1) ]) while idc.SegDelete(seg_start, 0) != 0: pass idc.Batch(0) return opcode
def AsmAndWrite(self, mnem, instr=None, write_ea=None, function=None): if mnem == '': return if write_ea != None: ea_write = write_ea else: ea_write = self.free_ea idc.MakeUnkn(ea_write, 0) #tmp = idaapi.assemble(self.free_ea, self.segment_start, self.free_ea, 1, mnem) if debug: print ">Assemble:AsmAndWrite - !Writing @ ea[%08x] ip[%08x] instr[%s]" % ( ea_write, ea_write, mnem) tmp = idaapi.assemble(ea_write, 0, ea_write, 1, mnem) if instr != None: idaapi.set_cmt(ea_write, "%08x" % instr.GetOriginEA(), 0) if tmp == 0: if instr == None and function != None: raise MiscError if debug: print '>Assemble:AsmAndWrite - !Messy instruction', mnem print '>Assemble:AsmAndWrite - Trying original opcodes!' refs_from = [ x for x in function.GetRefsFrom(instr.GetOriginEA()) if x != None ] if len(refs_from) == 0: if instr.GetIsModified() == True: raise MiscError instr_op = instr.GetOpcode() for pos in xrange(0, len(instr_op)): idc.PatchByte(ea_write + pos, ord(instr_op[pos])) if idc.MakeCode(ea_write) == 0: raise MiscError ea_write += idc.ItemSize(ea_write) elif len(refs_from) == 1: instr_op = instr.GetOpcode() for pos in xrange(0, len(instr_op)): idc.PatchByte(ea_write + pos, ord(instr_op[pos])) if idc.MakeCode(ea_write) == 0: raise MiscError ea_write += idc.ItemSize(ea_write) else: #print '>Assemble:AsmAndWrite - GetRefsFrom(%08x)' % instr.GetOriginEA(), [hex(x) for x in function.GetRefsFrom(instr.GetOriginEA()) if x != None] print '>Assemble:AsmAndWrite - refs_from', refs_from print '>Assemble:AsmAndWrite - ea_write [%08x]' % ea_write print '>Assemble:AsmAndWrite - mnem', mnem print '>Assemble:AsmAndWrite - instr.GetMnem', instr.GetMnem() print '>Assemble:AsmAndWrite - instr.GetDisasm', instr.GetDisasm( ) raise MiscError else: if idc.MakeCode(ea_write) == 0: raise MiscError ea_write += idc.ItemSize(ea_write) if write_ea == None: self.free_ea = ea_write
def assemble32(line, ea): return idaapi.assemble(ea, idc.GetReg(ea, "cs"), ea, True, line)
def AsmAndWrite(self, mnem, instr=None, write_ea=None, function=None): if mnem == '': return if write_ea != None: ea_write = write_ea else: ea_write = self.free_ea idc.MakeUnkn(ea_write, 0) #tmp = idaapi.assemble(self.free_ea, self.segment_start, self.free_ea, 1, mnem) if debug: print ">Assemble:AsmAndWrite - !Writing @ ea[%08x] ip[%08x] instr[%s]" % (ea_write, ea_write, mnem) tmp = idaapi.assemble(ea_write, 0, ea_write, 1, mnem) if instr != None: idaapi.set_cmt(ea_write, "%08x" % instr.GetOriginEA(), 0) if tmp == 0: if instr == None and function != None: raise MiscError if debug: print '>Assemble:AsmAndWrite - !Messy instruction', mnem print '>Assemble:AsmAndWrite - Trying original opcodes!' refs_from = [x for x in function.GetRefsFrom(instr.GetOriginEA()) if x != None] if len(refs_from) == 0: if instr.GetIsModified() == True: raise MiscError instr_op = instr.GetOpcode() for pos in xrange(0, len(instr_op)): idc.PatchByte(ea_write+pos, ord(instr_op[pos])) if idc.MakeCode(ea_write) == 0: raise MiscError ea_write += idc.ItemSize(ea_write) elif len(refs_from) == 1: instr_op = instr.GetOpcode() for pos in xrange(0, len(instr_op)): idc.PatchByte(ea_write+pos, ord(instr_op[pos])) if idc.MakeCode(ea_write) == 0: raise MiscError ea_write += idc.ItemSize(ea_write) else: #print '>Assemble:AsmAndWrite - GetRefsFrom(%08x)' % instr.GetOriginEA(), [hex(x) for x in function.GetRefsFrom(instr.GetOriginEA()) if x != None] print '>Assemble:AsmAndWrite - refs_from', refs_from print '>Assemble:AsmAndWrite - ea_write [%08x]' % ea_write print '>Assemble:AsmAndWrite - mnem', mnem print '>Assemble:AsmAndWrite - instr.GetMnem', instr.GetMnem() print '>Assemble:AsmAndWrite - instr.GetDisasm', instr.GetDisasm() raise MiscError else: if idc.MakeCode(ea_write) == 0: raise MiscError ea_write += idc.ItemSize(ea_write) if write_ea == None: self.free_ea = ea_write