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
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
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))
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
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)