Files
2025-03-13 16:17:53 +01:00

91 lines
3.0 KiB
Python

"""
summary: retrieve the selection from the "Strings" window
description:
In IDA it's possible to write actions that can be applied even to
core (i.e., "standard") widgets. The actions in this example use the
action "context" to know what the current selection is.
This example shows how you can either retrieve string literals data
directly from the chooser (`ida_kernwin.get_chooser_data`), or
by querying the IDB (`ida_bytes.get_strlit_contents`)
keywords: actions
see_also: list_strings
level: intermediate
"""
import ida_kernwin
import ida_strlist
import ida_bytes
class show_strings_base_ah_t(ida_kernwin.action_handler_t):
def __init__(self, use_get_chooser_data):
ida_kernwin.action_handler_t.__init__(self)
self.use_get_chooser_data = use_get_chooser_data
def activate(self, ctx):
for idx in ctx.chooser_selection:
if self.use_get_chooser_data:
_, _, _, s = ida_kernwin.get_chooser_data(ctx.widget_title, idx)
else:
si = ida_strlist.string_info_t()
if ida_strlist.get_strlist_item(si, idx):
s = ida_bytes.get_strlit_contents(si.ea, si.length, si.type)
print("Selected string (retrieved using %s) at index %d: \"%s\"" % (
"get_chooser_data()" if self.use_get_chooser_data else "get_strlist_item()",
idx,
s))
return 0
def update(self, ctx):
return ida_kernwin.AST_ENABLE_FOR_WIDGET \
if ctx.widget_type == ida_kernwin.BWN_STRINGS \
else ida_kernwin.AST_DISABLE_FOR_WIDGET
class show_strings_using_get_chooser_data_ah_t(show_strings_base_ah_t):
ACTION_NAME = "test:show_string_using_get_chooser_data"
ACTION_LABEL = "Show current string(s) using get_chooser_data()"
ACTION_SHORTCUT = "Ctrl+Shift+S"
def __init__(self):
show_strings_base_ah_t.__init__(self, True)
class show_strings_using_get_strlist_item_ah_t(show_strings_base_ah_t):
ACTION_NAME = "test:show_string_using_get_strlist_item"
ACTION_LABEL = "Show current string(s) using get_strlist_item() + get_strlit_contents()"
ACTION_SHORTCUT = "Ctrl+Shift+K"
def __init__(self):
show_strings_base_ah_t.__init__(self, False)
klasses = [
show_strings_using_get_chooser_data_ah_t,
show_strings_using_get_strlist_item_ah_t,
]
sw = ida_kernwin.find_widget("Strings")
if not sw:
sw = ida_kernwin.open_strings_window(ida_idaapi.BADADDR)
for klass in klasses:
if ida_kernwin.unregister_action(klass.ACTION_NAME):
print("Unregistered previously-registered action \"%s\"" % klass.ACTION_LABEL)
if ida_kernwin.register_action(
ida_kernwin.action_desc_t(
klass.ACTION_NAME,
klass.ACTION_LABEL,
klass(),
klass.ACTION_SHORTCUT)):
print("Registered action \"%s\"" % (klass.ACTION_LABEL,))
if sw:
ida_kernwin.attach_action_to_popup(sw, None, klass.ACTION_NAME)
print("Permanently added action to \"String window\"'s popup")