pub struct Scanner<'r> { /* private fields */ }Expand description
Scans data with already compiled YARA rules.
The scanner receives a set of compiled Rules and scans data with those
rules. The same scanner can be used for scanning multiple files or
in-memory data sequentially, but you need multiple scanners for scanning in
parallel.
Implementations§
Source§impl<'r> Scanner<'r>
impl<'r> Scanner<'r>
Sourcepub fn set_timeout(&mut self, timeout: Duration) -> &mut Self
pub fn set_timeout(&mut self, timeout: Duration) -> &mut Self
Sets a timeout for scan operations.
The scan functions will return an ScanError::Timeout once the provided timeout duration has elapsed. The scanner will make every effort to stop promptly after the designated timeout duration. However, in some cases, particularly with rules containing only a few patterns, the scanner could potentially continue running for a longer period than the specified timeout.
Sourcepub fn max_matches_per_pattern(&mut self, n: usize) -> &mut Self
pub fn max_matches_per_pattern(&mut self, n: usize) -> &mut Self
Sets the maximum number of matches per pattern.
When some pattern reaches the maximum number of patterns it won’t produce more matches.
Sourcepub fn use_mmap(&mut self, yes: bool) -> &mut Self
pub fn use_mmap(&mut self, yes: bool) -> &mut Self
Specifies whether Scanner::scan_file and Scanner::scan_file_with_options
may use memory-mapped files to read input.
By default, the scanner uses memory mapping for very large files, as this
is typically faster than copying file contents into memory. However, this
approach has a drawback: if another process truncates the file during
scanning, a SIGBUS signal may occur.
Setting this option disables memory mapping and forces the scanner to always read files into an in-memory buffer instead. This method is slower, but safer.
Sourcepub fn console_log<F>(&mut self, callback: F) -> &mut Self
pub fn console_log<F>(&mut self, callback: F) -> &mut Self
Sets a callback that is invoked every time a YARA rule calls the
console module.
The callback function is invoked with a string representing the
message being logged. The function can print the message to stdout,
append it to a file, etc. If no callback is set these messages are
ignored.
Sourcepub fn scan<'a>(
&'a mut self,
data: &'a [u8],
) -> Result<ScanResults<'a, 'r>, ScanError>
pub fn scan<'a>( &'a mut self, data: &'a [u8], ) -> Result<ScanResults<'a, 'r>, ScanError>
Scans in-memory data.
Sourcepub fn scan_file<'a, P>(
&'a mut self,
target: P,
) -> Result<ScanResults<'a, 'r>, ScanError>
pub fn scan_file<'a, P>( &'a mut self, target: P, ) -> Result<ScanResults<'a, 'r>, ScanError>
Scans a file.
Sourcepub fn scan_with_options<'a, 'opts>(
&'a mut self,
data: &'a [u8],
options: ScanOptions<'opts>,
) -> Result<ScanResults<'a, 'r>, ScanError>
pub fn scan_with_options<'a, 'opts>( &'a mut self, data: &'a [u8], options: ScanOptions<'opts>, ) -> Result<ScanResults<'a, 'r>, ScanError>
Like Scanner::scan, but allows to specify additional scan options.
Sourcepub fn scan_file_with_options<'opts, P>(
&mut self,
target: P,
options: ScanOptions<'opts>,
) -> Result<ScanResults<'_, 'r>, ScanError>
pub fn scan_file_with_options<'opts, P>( &mut self, target: P, options: ScanOptions<'opts>, ) -> Result<ScanResults<'_, 'r>, ScanError>
Like Scanner::scan_file, but allows to specify additional scan
options.
Sourcepub fn set_global<T: TryInto<Variable>>(
&mut self,
ident: &str,
value: T,
) -> Result<&mut Self, VariableError>
pub fn set_global<T: TryInto<Variable>>( &mut self, ident: &str, value: T, ) -> Result<&mut Self, VariableError>
Sets the value of a global variable.
The variable must has been previously defined by calling
crate::Compiler::define_global, and the type it has during the
definition must match the type of the new value (T).
The variable will retain the new value in subsequent scans, unless this function is called again for setting a new value.
Sourcepub fn set_module_output(
&mut self,
data: Box<dyn MessageDyn>,
) -> Result<&mut Self, ScanError>
pub fn set_module_output( &mut self, data: Box<dyn MessageDyn>, ) -> Result<&mut Self, ScanError>
Sets the output data for a YARA module.
Each YARA module generates an output consisting of a data structure that contains information about the scanned file. This data structure is represented by a Protocol Buffer message. Typically, you won’t need to provide this data yourself, as the YARA module automatically generates different outputs for each file it scans.
However, there are two scenarios in which you may want to provide the output for a module yourself:
- When the module does not produce any output on its own.
- When you already know the output of the module for the upcoming file to be scanned, and you prefer to reuse this data instead of generating it again.
Case 1) applies to certain modules lacking a main function, thus
incapable of producing any output on their own. For such modules, you
must set the output before scanning the associated data. Since the
module’s output typically varies with each scanned file, you need to
call Scanner::set_module_output prior to each invocation of
Scanner::scan. Once Scanner::scan is executed, the module’s
output is consumed and will be empty unless set again before the
subsequent call.
Case 2) applies when you have previously stored the module’s output for certain scanned data. In such cases, when rescanning the data, you can utilize this function to supply the module’s output, thereby preventing redundant computation by the module. This optimization enhances performance by eliminating the need for the module to reparse the scanned data.
The data argument must be a Protocol Buffer message corresponding
to any of the existing YARA modules.
Sourcepub fn set_module_output_raw(
&mut self,
name: &str,
data: &[u8],
) -> Result<&mut Self, ScanError>
pub fn set_module_output_raw( &mut self, name: &str, data: &[u8], ) -> Result<&mut Self, ScanError>
Similar to Scanner::set_module_output, but receives a module name
and the protobuf message as raw data.
name can be either the YARA module name (i.e: “pe”, “elf”, “dotnet”,
etc.) or the fully-qualified name for the protobuf message associated
to the module (i.e: “pe.PE”, “elf.ELF”, “dotnet.Dotnet”, etc.).
Sourcepub fn slowest_rules(&self, n: usize) -> Vec<ProfilingData<'_>>
Available on crate feature rules-profiling only.
pub fn slowest_rules(&self, n: usize) -> Vec<ProfilingData<'_>>
rules-profiling only.Returns profiling data for the slowest N rules.
The profiling data reflects the cumulative execution time of each rule
across all scanned files. This information is useful for identifying
performance bottlenecks. To reset the profiling data and start fresh
for subsequent scans, use Scanner::clear_profiling_data.
Sourcepub fn clear_profiling_data(&mut self)
Available on crate feature rules-profiling only.
pub fn clear_profiling_data(&mut self)
rules-profiling only.Clears all accumulated profiling data.
This method resets the profiling data collected during rule execution across scanned files. Use this to start a new profiling session, ensuring the results reflect only the data gathered after this method is called.
Trait Implementations§
Auto Trait Implementations§
impl<'r> Freeze for Scanner<'r>
impl<'r> !RefUnwindSafe for Scanner<'r>
impl<'r> !Send for Scanner<'r>
impl<'r> !Sync for Scanner<'r>
impl<'r> Unpin for Scanner<'r>
impl<'r> !UnwindSafe for Scanner<'r>
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.