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

243 lines
8.4 KiB
Python

class data_type_t(object):
"""
Information about a data type
"""
def may_create_at(self, ea, nbytes):
"""May create data?
No such callback means: always succeed (i.e., no restriction where
such a data type can be created.)
@param ea: candidate address for the data item
@param nbytes: candidate size for the data item
@return: True/False
"""
return True
def calc_item_size(self, ea, maxsize):
"""This callback is used to determine size of the (possible)
item at `ea`.
No such callback means that datatype is of fixed size `value_size`.
(thus, this callback is required only for varsize datatypes.)
@param ea: address of the item
@param maxsize: maximum size of the item
@return: 0 - no such item can be created/displayed
"""
return 0
class data_format_t(object):
"""
Information about a data format
"""
def printf(self, value, current_ea, operand_num, dtid):
"""Convert `value` to colored string using custom format.
@param value: value to print (of type 'str', sequence of bytes)
@param current_ea: current address (BADADDR if unknown)
@param operand_num: current operand number
@param dtid: custom data type id
@return: string representing data
"""
return None
def scan(self, input, current_ea, operand_num):
"""Convert uncolored string (user input) to the value.
This callback is called from the debugger when an user enters a
new value for a register with a custom data representation (e.g.,
an MMX register.)
@param input: input string
@param current_ea: current address (BADADDR if unknown)
@param operand_num: current operand number (-1 if unknown)
@return: tuple(bool, string)
(True, output value) or
(False, error message)
"""
return (False, "Not implemented")
def analyze(self, current_ea, operand_num):
"""Analyze custom data format occurrence.
This callback is called in 2 cases:
- after emulating an instruction (after a call of
'ev_emu_insn') if its operand is marked as "custom data
representation"
- when emulating data (this is done using a call of
'ev_out_data' with analyze_only == true). This is the right
place to create cross references from the current item.
@param current_ea: current address (BADADDR if unknown)
@param operand_num: current operand number
"""
pass
def register_custom_data_type(dt):
"""
Registers a custom data type.
@param dt: an instance of the data_type_t class
@return:
< 0 if failed to register
> 0 data type id
"""
pass
def unregister_custom_data_type(dtid):
"""
Unregisters a custom data type.
@param dtid: the data type id
@return: Boolean
"""
pass
def register_custom_data_format(df):
"""
Registers a custom data format with a given data type.
@param df: an instance of data_format_t
@return:
< 0 if failed to register
> 0 data format id
"""
pass
def unregister_custom_data_format(dfid):
"""
Unregisters a custom data format
@param dfid: data format id
@return: Boolean
"""
pass
def visit_patched_bytes(ea1: ida_idaapi.ea_t, ea2: ida_idaapi.ea_t, callable):
"""
Enumerates patched bytes in the given range and invokes a callable
@param ea1: start address
@param ea2: end address
@param callable: a Python callable with the following prototype:
callable(ea, fpos, org_val, patch_val).
If the callable returns non-zero then that value will be
returned to the caller and the enumeration will be
interrupted.
@return: Zero if the enumeration was successful or the return
value of the callback if enumeration was interrupted.
"""
pass
def get_bytes(ea: ida_idaapi.ea_t, size: int, gmb_flags: int=GMB_READALL):
"""
Get the specified number of bytes of the program.
@param ea: program address
@param size: number of bytes to return
@param gmb_flags: OR'ed combination of GMB_* values (defaults to GMB_READALL)
@return: the bytes (as bytes object), or None in case of failure
"""
pass
def get_bytes_and_mask(ea: ida_idaapi.ea_t, size: int, gmb_flags: int=GMB_READALL):
"""
Get the specified number of bytes of the program, and a bitmask
specifying what bytes are defined and what bytes are not.
@param ea: program address
@param size: number of bytes to return
@param gmb_flags: OR'ed combination of GMB_* values (defaults to GMB_READALL)
@return: a tuple (bytes, mask), or None in case of failure.
Both 'bytes' and 'mask' are 'str' instances.
"""
pass
# Conversion options for get_strlit_contents():
STRCONV_ESCAPE = 0x00000001 # convert non-printable characters to C escapes (\n, \xNN, \uNNNN)
def get_strlit_contents(ea: ida_idaapi.ea_t, len: int, type: int, flags: int = 0):
"""
Get contents of string literal, as UTF-8-encoded codepoints.
It works even if the string has not been created in the database yet.
Note that the returned value will be of type 'bytes'; if
you want auto-conversion to unicode strings (that is: real Python
strings), you should probably be using the idautils.Strings class.
@param ea: linear address of the string
@param len: length of the string in bytes (including terminating 0)
@param type: type of the string. Represents both the character encoding,
<u>and</u> the 'type' of string at the given location.
@param flags: combination of STRCONV_..., to perform output conversion.
@return: a bytes-filled str object.
"""
pass
def op_stroff(*args) -> bool:
"""
Set operand representation to be 'struct offset'.
This function has the following signatures:
1. op_stroff(ins: ida_ua.insn_t, n: int, path: List[int], delta: int)
2. op_stroff(ins: ida_ua.insn_t, n: int, path: ida_pro.tid_array, path_len: int, delta: int) (backward-compatibility only)
Here is an example using this function:
ins = ida_ua.insn_t()
if ida_ua.decode_insn(ins, some_address):
operand = 0
path = [ida_typeinf.get_named_type_tid("my_stucture_t")] # a one-element path
ida_bytes.op_stroff(ins, operand, path, 0)
"""
pass
def get_stroff_path(*args):
"""
Get the structure offset path for operand `n`, at the
specified address.
This function has the following signatures:
1. get_stroff_path(ea: ida_idaapi.ea_t, n : int) -> Tuple[List[int], int]
2. get_stroff_path(path: tid_array, delta: sval_pointer, ea: ida_idaapi.ea_t, n : int) (backward-compatibility only)
@param ea address where the operand holds a path to a structure offset (1st form)
@param n operand number (1st form)
@return a tuple holding a (list_of_tid_t's, delta_within_the_last_type), or (None, None)
"""
pass
def bin_search(*args):
"""
Search for a set of bytes in the program
This function has the following signatures:
1. bin_search(start_ea: ida_idaapi.ea_t, end_ea: ida_idaapi.ea_t, data: compiled_binpat_vec_t, flags: int) -> Tuple[ida_idaapi.ea_t, int]
2. bin_search(start_ea: ida_idaapi.ea_t, end_ea: ida_idaapi.ea_t, image: bytes, mask: bytes, len: int, flags: int) -> ida_idaapi.ea_t
The return value type will differ depending on the form:
1. a tuple `(matched-address, index-in-compiled_binpat_vec_t)` (1st form)
2. the address of a match, or ida_idaapi.BADADDR if not found (2nd form)
This is a low-level function; more user-friendly alternatives
are available. Please see 'find_bytes' and 'find_string'.
@param start_ea: linear address, start of range to search
@param end_ea: linear address, end of range to search (exclusive)
@param data: (1st form) the prepared data to search for (see parse_binpat_str())
@param bytes: (2nd form) a set of bytes to match
@param mask: (2nd form) a mask to apply to the set of bytes
@param flags: combination of BIN_SEARCH_* flags
@return: either a tuple holding both the address of the match and the index of the compiled pattern that matched, or the address of a match (ida_idaapi.BADADDR if not found)
"""
pass