Files
idapython-src/pywraps/py_bytes_find_bytes.py
2025-03-13 16:17:53 +01:00

69 lines
2.3 KiB
Python

#<pycode(py_bytes_find_bytes)>
import typing
import ida_idaapi
import ida_nalt
import ida_range
def find_bytes(
bs: typing.Union[bytes, bytearray, str],
range_start: int,
range_size: typing.Optional[int] = None,
range_end: typing.Optional[int] = ida_idaapi.BADADDR,
mask: typing.Optional[typing.Union[bytes, bytearray]] = None,
flags: typing.Optional[int] = BIN_SEARCH_FORWARD | BIN_SEARCH_NOSHOW,
radix: typing.Optional[int] = 16,
strlit_encoding: typing.Optional[typing.Union[int, str]] = PBSENC_DEF1BPU) -> int:
if isinstance(range_start, ida_range.range_t):
range_start, range_end = range_start.start_ea, range_start.end_ea
patterns = compiled_binpat_vec_t()
if isinstance(bs, str):
if isinstance(strlit_encoding, str):
strlit_encoding_i = ida_nalt.add_encoding(strlit_encoding)
if strlit_encoding_i > 0:
strlit_encoding = strlit_encoding_i
else:
raise Exception("Unknown encoding: \"%s\"" % strlit_encoding)
parse_result = parse_binpat_str(
patterns,
range_start,
bs,
radix,
strlit_encoding)
if parse_result is False or (isinstance(parse_result, str) and len(parse_result) > 0):
raise Exception("Could not parse pattern: %s" % (parse_result or "unknown error",))
else:
p0 = patterns.push_back()
p0.bytes = __to_bytevec(bs)
if mask is not None:
p0.mask = __to_bytevec(mask)
if range_size is not None:
range_end = range_start + range_size
ea, _ = bin_search(range_start, range_end, patterns, flags)
return ea
def find_string(
_str: str,
range_start: int,
range_end: typing.Optional[int] = ida_idaapi.BADADDR,
range_size: typing.Optional[int] = None,
strlit_encoding: typing.Optional[typing.Union[int, str]] = PBSENC_DEF1BPU,
flags: typing.Optional[int] = BIN_SEARCH_FORWARD | BIN_SEARCH_NOSHOW) -> int:
escaped = _str.replace('"', r"\22")
return find_bytes(
'"' + escaped + '"',
range_start,
range_end=range_end,
range_size=range_size,
flags=flags,
strlit_encoding=strlit_encoding)
#</pycode(py_bytes_find_bytes)>