hexforge_modules/helper.py (54 lines of code) (raw):
import idaapi
import idc
import ida_hexrays
import ida_kernwin
# IDA python functions
def get_selected_bytes() -> bytearray:
"""
The function generates a bytearray of selected bytes in IDA. If no bytes are selected, it returns the byte at the current cursor position.
:return: A bytearray of the selected bytes or the byte at the current cursor position if no selection is made.
"""
success, start, end = idaapi.read_range_selection(None)
if not success:
return bytearray(idaapi.get_bytes(idc.here(), 1))
size = end - start
return bytearray(idaapi.get_bytes(start, size))
def write_bytes_to_selected(data) -> None:
"""
The function writes the given bytes data to the selected memory region in IDA. If no region is selected, it writes to the current cursor position.
:param data: The byte data to write to the selected memory region.
:return: None
"""
if data:
success, start, _ = idaapi.read_range_selection(None)
# if user did not select a memory region, get current cursor address
if not success:
start = idc.here()
if start == -1:
return None
for i, x in enumerate(data):
idaapi.patch_byte(start + i, x)
def get_highlighted_string_from_decompiler() -> str:
"""
Get the highlighted string from the decompiler view in IDA Pro.
:return: The highlighted string or an empty string if no text is highlighted.
"""
widget = ida_kernwin.get_current_widget()
if widget and ida_kernwin.get_widget_type(widget) == ida_kernwin.BWN_PSEUDOCODE:
vu = ida_hexrays.get_widget_vdui(widget)
if vu:
highlighted_text = ida_kernwin.get_highlight(vu.ct)
if highlighted_text:
return highlighted_text[0]
return ""
# Template class for modules
class ModuleTemplate:
def __init__(self):
pass
def init_action(self):
action_desc = idaapi.action_desc_t(
self.ACTION_NAME, # The action name.
self.ACTION_TEXT, # The action text.
IDACtxEntry(self._action), # The action handler.
None, # Optional: action shortcut
self.ACTION_TOOLTIP, # Optional: tooltip
0, # icon
)
assert idaapi.register_action(action_desc), "Action registration failed"
def del_action(self):
idaapi.unregister_action(self.ACTION_NAME)
# function to execute
def _action(self):
"""
The function to execute when the context menu is invoked.
This should contain the main logic of the module.
"""
pass
# IDA ctxt
class IDACtxEntry(idaapi.action_handler_t):
"""
A basic Context Menu class to utilize IDA's action handlers.
"""
def __init__(self, action_function):
idaapi.action_handler_t.__init__(self)
self.action_function = action_function
def activate(self, ctx):
"""
Execute the embedded action_function when this context menu is invoked.
"""
self.action_function()
return 1
def update(self, ctx):
"""
Ensure the context menu is always available in IDA.
"""
return idaapi.AST_ENABLE_ALWAYS