def show_microcode(): """Generates and displays microcode for an address range. An address range can be a selection of code or that of the current function.""" sel, sea, eea = kw.read_range_selection(None) pfn = ida_funcs.get_func(kw.get_screen_ea()) if not sel and not pfn: return (False, "Position cursor within a function or select range") if not sel and pfn: sea = pfn.start_ea eea = pfn.end_ea addr_fmt = "%016x" if ida_ida.inf_is_64bit() else "%08x" fn_name = (ida_funcs.get_func_name(pfn.start_ea) if pfn else "0x%s-0x%s" % (addr_fmt % sea, addr_fmt % eea)) F = ida_bytes.get_flags(sea) if not ida_bytes.is_code(F): return (False, "The selected range must start with an instruction") text, mmat, mba_flags = ask_desired_maturity() if text is None and mmat is None: return (True, "Cancelled") if not sel and pfn: mbr = hr.mba_ranges_t(pfn) else: mbr = hr.mba_ranges_t() mbr.ranges.push_back(ida_range.range_t(sea, eea)) hf = hr.hexrays_failure_t() ml = hr.mlist_t() mba = hr.gen_microcode(mbr, hf, ml, hr.DECOMP_WARNINGS, mmat) if not mba: return (False, "0x%s: %s" % (addr_fmt % hf.errea, hf.desc())) vp = printer_t() mba.set_mba_flags(mba_flags) mba._print(vp) mcv = microcode_viewer_t() if not mcv.Create( mba, "0x%s-0x%s (%s)" % (addr_fmt % sea, addr_fmt % eea, text), text, fn_name, vp.get_mc()): return (False, "Error creating viewer") mcv.Show() return (True, "Successfully generated microcode for 0x%s..0x%s" % (addr_fmt % sea, addr_fmt % eea))
def req_rln(self, hash): raddr = hash['raddr'] rs_debug("rln: 0x%x" % raddr) addr = self.rebase_local(raddr) if not addr: rs_log("could not rebase this address (0x%x)" % raddr) return sym = idaapi.get_func_name(addr) if sym: sym = self.demangle(sym) func = idaapi.get_func(addr) if not func: rs_log("could not find func for 0x%x" % addr) return lck = idaapi.lock_func(func) limits = ida_range.range_t() rs = ida_range.rangeset_t() if ida_funcs.get_func_ranges(rs, func) != ida_idaapi.BADADDR: limits.start_ea = rs.begin().start_ea limits.end_ea = rs.begin().end_ea if limits.start_ea != addr: if (addr > limits.start_ea): sym = "%s%s0x%x" % (sym, "+", addr - limits.start_ea) else: sym = "%s%s0x%x" % (sym, "-", limits.start_ea - addr) lck = None else: sym = idc.get_name(addr, ida_name.GN_VISIBLE) if sym: sym = self.demangle(sym) if sym: self.notice_broker('cmd', "\"cmd\":\"%s\"" % sym) rs_debug("resolved symbol: %s" % sym) else: rs_log("could not resolve symbol for address 0x%x" % addr)
# import ida_bytes import ida_range import ida_kernwin import ida_hexrays if ida_hexrays.init_hexrays_plugin(): sel, sea, eea = ida_kernwin.read_range_selection(None) w = ida_kernwin.warning if sel: F = ida_bytes.get_flags(sea) if ida_bytes.is_code(F): hf = ida_hexrays.hexrays_failure_t() mbr = ida_hexrays.mba_ranges_t() mbr.ranges.push_back(ida_range.range_t(sea, eea)) mba = ida_hexrays.gen_microcode(mbr, hf, None, ida_hexrays.DECOMP_WARNINGS) if mba: print("Successfully generated microcode for 0x%08x..0x%08x\n" % (sea, eea)) vp = ida_hexrays.vd_printer_t() mba._print(vp) else: w("0x%08x: %s" % (hf.errea, hf.str)) else: w("The selected range must start with an instruction") else: w("Please select a range of addresses to analyze") else: print('vds13: Hex-rays is not available.')