Intended audience
IDA 7.2 users, who have experience with IDAPython and/or the decompiler.
The problem
As you may already know, the decompilers allow not only decompiling the current function (shortcut F5
) but also all the functions in the database (shortcut Ctrl+F5
).A somewhat less-well known feature of the “multiple” decompilation, is that if a range is selected (for example in the IDA View-A
), only functions within that range will be decompiled. Alas this is not good enough for the use-case of one of users, who would like to be able to select entries in the list provided by the Functions window
, and decompile those (the biggest difference with the “IDA View-A
range” approach, is that there can be gaps in the selection — functions that the user doesn’t want to spend time decompiling.)
The solution
Although IDA doesn’t provide a built-in solution for this particular use-case (it cannot cover them all), we can use IDA’s scriptability to come up with the following IDAPython script, which should offer a very satisfying implementation of the idea described above:import ida_kernwin import ida_funcs import ida_hexrays class decompile_selected_t(ida_kernwin.action_handler_t): def activate(self, ctx): out_path = ida_kernwin.ask_file( True, None, "Please specify the output file name"); if out_path: eas = [] for pfn_idx in ctx.chooser_selection: pfn = ida_funcs.getn_func(pfn_idx) if pfn: eas.append(pfn.start_ea) ida_hexrays.decompile_many(out_path, eas, 0) return 1 def update(self, ctx): if ctx.widget_type == ida_kernwin.BWN_FUNCS: return ida_kernwin.AST_ENABLE_FOR_WIDGET else: return ida_kernwin.AST_DISABLE_FOR_WIDGET ACTION_NAME = "decompile-selected" ida_kernwin.register_action( ida_kernwin.action_desc_t( ACTION_NAME, "Decompile selected", decompile_selected_t(), "Ctrl+F5")) class popup_hooks_t(ida_kernwin.UI_Hooks): def finish_populating_widget_popup(self, w, popup): if ida_kernwin.get_widget_type(w) == ida_kernwin.BWN_FUNCS: ida_kernwin.attach_action_to_popup( w, popup, ACTION_NAME, None) hooks = popup_hooks_t() hooks.hook()