Пример #1
0
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
Пример #2
0
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
Пример #3
0
    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
Пример #4
0
def assemble32(line, ea):
    return idaapi.assemble(ea, idc.GetReg(ea, "cs"), ea, True, line)
Пример #5
0
    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