mirror of
https://github.com/idapython/src
synced 2026-06-08 14:47:00 +00:00
91 lines
3.0 KiB
Python
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")
|