コード例 #1
0
def restore_regvars(func_addr, regvars):
    func = idaapi.get_func(func_addr)
    for regvar in regvars:
        idaapi.add_regvar(
            func,
            regvar[3],  # startEA
            regvar[4],  # endEA
            regvar[0],  # register string
            regvar[1],  # user register string
            regvar[2])  # comment
コード例 #2
0
def main():
    ea = ScreenEA()
    rv = None

    func = idaapi.get_func(ea)
    if func is None:
        Message("Error: not in a function\n")
        return

    reg = get_highlighted_identifier()
    if reg is None:
        Message("Error: no highlighted name\n")
        return

    # it's not a reg ? we get the renaming for it then
    if reg not in REGS:
        rv = org_reg(reg, ea, func)
        if rv is None:
            Message(
                "Error: the highlighted name is neither a register nor a renamed register\n"
            )
            return

    new = AskStr(reg, "new name[;comment]")
    if new is None:
        Message("Cancelled\n")
        return
    if ";" in new:
        new, cmt = new.split(";")
    else:
        cmt = ""

    # was there a previous rename ? let's truncate it
    if rv is not None:
        s, e, c, u, cmt = rv.startEA, rv.endEA, rv.canon, rv.user, rv.cmt
        idaapi.del_regvar(func, s, e, c)
        idaapi.add_regvar(func, s, ea - 1, c, u, cmt)

    idaapi.add_regvar(func, ea, func.endEA, reg if rv is None else rv.canon,
                      new, cmt)

    # optional / to be perfected- added end ranges
    #idc.ExtLinA(ea, 0, "{")
    #idc.ExtLinB(func.endEA, 0, "} %s => %s ;%s" % (reg, new, cmt))

    return
コード例 #3
0
ファイル: YaToolIDAExporter.py プロジェクト: tmcmil/YaCo
    def make_view(self, object_version, address):
        # apply view
        ri = idaapi.refinfo_t()
        ri.target = idc.BADADDR
        ri.base = 0
        ri.tdelta = 0
        for ((view_offset, operand),
             view_value) in object_version.get_offset_valueviews().iteritems():
            if view_value == 'signeddecimal':
                if not (idaapi.is_invsign(
                        address + view_offset,
                        idaapi.getFlags(address + view_offset), operand)):
                    idaapi.op_dec(address + view_offset, operand)
                    # we assume defaut operand is unsigned !
                    idaapi.toggle_sign(address + view_offset, operand)
            elif view_value == 'unsigneddecimal':
                idaapi.op_dec(address + view_offset, operand)
            elif view_value == 'signedhexadecimal':
                idaapi.op_hex(address + view_offset, operand)
                if not (idaapi.is_invsign(
                        address + view_offset,
                        idaapi.getFlags(address + view_offset), operand)):
                    idaapi.toggle_sign(address + view_offset, operand)
            elif view_value == 'unsignedhexadecimal':
                idaapi.op_hex(address + view_offset, operand)
                if idaapi.is_invsign(address + view_offset,
                                     idaapi.getFlags(address + view_offset),
                                     operand):
                    idaapi.toggle_sign(address + view_offset, operand)
            elif view_value.startswith('offset'):
                dash = view_value.find("-")
                if dash != -1:
                    op_type_str = view_value[dash + 1:]
                    op_type = YaToolIDATools.OFFSET_TYPE_MAP[op_type_str]
                else:
                    op_type = idc.REF_OFF32
                ri.flags = op_type
                idaapi.op_offset_ex(address + view_offset, 1, ri)
            #                 idaapi.set_op_type(address + view_offset, idaapi.offflag(), operand)
            elif view_value == 'char':
                idaapi.op_chr(address + view_offset, operand)
            elif view_value == 'binary':
                idaapi.op_bin(address + view_offset, operand)
            elif view_value == 'octal':
                idaapi.op_oct(address + view_offset, operand)

        for ((register_offset, register_name), (end_offset, new_name)
             ) in object_version.get_offset_registerviews().iteritems():
            func = idaapi.get_func(address)
            funcEA = func.startEA
            ret = idaapi.add_regvar(func, funcEA + register_offset,
                                    funcEA + end_offset, register_name,
                                    new_name, None)
            if ret != REGVAR_ERROR_OK:
                logger.warning(
                    "make register_view failed: func=0x%08X, 0x%08X->0x%08X  %s->%s, error=%d"
                    % (funcEA, funcEA + register_offset, funcEA + end_offset,
                       register_name, new_name, ret))
コード例 #4
0
ファイル: ren_reg.py プロジェクト: NicholasFengTW/corkami-1
def main():
    ea = ScreenEA()
    rv = None

    func = idaapi.get_func(ea)
    if func is None:
        Message("Error: not in a function\n")
        return

    reg = get_highlighted_identifier()
    if reg is None:
        Message("Error: no highlighted name\n")
        return

    # it's not a reg ? we get the renaming for it then
    if reg not in REGS:
        rv = org_reg(reg, ea, func)
        if rv is None:
            Message("Error: the highlighted name is neither a register nor a renamed register\n")
            return

    new = AskStr(reg, "new name[;comment]")
    if new is None:
        Message("Cancelled\n")
        return
    if ";" in new:
        new, cmt = new.split(";")
    else:
        cmt = ""

    # was there a previous rename ? let's truncate it
    if rv is not None:
        s, e, c, u, cmt = rv.startEA, rv.endEA, rv.canon, rv.user, rv.cmt
        idaapi.del_regvar(func, s, e,c )
        idaapi.add_regvar(func, s, ea - 1, c, u, cmt)

    idaapi.add_regvar(func, ea, func.endEA, reg if rv is None else rv.canon, new, cmt)

    # optional / to be perfected- added end ranges
    #idc.ExtLinA(ea, 0, "{")
    #idc.ExtLinB(func.endEA, 0, "} %s => %s ;%s" % (reg, new, cmt))

    return
コード例 #5
0
 def yatest_rename_register(self):
     eas = []
     for offset in range(0, 2):
         for operand in range(0, 2):
             for i in range(0, 2):
                 ea = self.get_address_for_operand(offset, operand)
                 key = 'rename_register_%d_%d_%d' % (offset, operand, i)
                 eas.append((ea, operand, key))
                 func = idaapi.get_func(ea)
                 self.assertIsNotNone(func)
                 end = ea + idc.ItemSize(ea) if i == 0 else func.endEA
                 text = idc.GetOpnd(ea, operand)
                 self.assertEqual(
                     idaapi.add_regvar(func, ea, end, text, key, None),
                     idaapi.REGVAR_ERROR_OK)
     yaunit.save('registers', eas)