13 std::vector<PatternByte>
bytes;
14 std::istringstream
stream(pattern);
21 bytes.push_back({.Wildcard =
true});
29 if (
ec != std::errc{} ||
stop !=
end || value > 0xFF)
31 Log::Error(
"Signature pattern has an invalid byte '{}'; ignoring the pattern.",
token);
41 for (
size_t i = 0;
i < size; ++
i)
49 size_t anchor = pattern.size();
52 for (
size_t i = 0;
i < pattern.size(); ++
i)
54 if (pattern[
i].Wildcard)
70 for (
size_t i = 0;
i < pattern.size(); ++
i)
72 if (!pattern[
i].Wildcard &&
at[
i] != pattern[
i].Value)
82 if (!base || pattern.empty() || size < pattern.size())
87 const size_t lastStart = size - pattern.size();
90 if (
anchor >= pattern.size())
Parsing and searching byte patterns, with no notion of a loaded module.
void Error(std::format_string< Args... > fmt, Args &&... args)
std::vector< PatternByte > ParsePattern(const std::string &pattern)
const uint8_t * FindFirst(const uint8_t *base, size_t size, const std::vector< PatternByte > &pattern, size_t anchor)
static bool Matches(const uint8_t *at, const std::vector< PatternByte > &pattern)
static std::string ReadFile(const std::filesystem::path &path)
size_t AnchorOf(const std::vector< PatternByte > &pattern, const ByteHistogram &frequencies)
std::array< size_t, 256 > ByteHistogram
void CountBytes(const uint8_t *base, size_t size, ByteHistogram &counts)