xgadget/binary/
segment.rs

1use rayon::prelude::*;
2
3/// A single executable segment
4#[derive(Debug, PartialEq, Eq, Clone, Hash)]
5pub struct Segment {
6    /// Segment start address
7    pub addr: u64,
8    /// Segment contents
9    pub bytes: Vec<u8>,
10}
11
12impl Segment {
13    /// Constructor
14    pub fn new(addr: u64, bytes: Vec<u8>) -> Segment {
15        Segment { addr, bytes }
16    }
17
18    /// Check if contains address
19    pub fn contains(&self, addr: u64) -> bool {
20        (self.addr <= addr) && (addr < (self.addr + self.bytes.len() as u64))
21    }
22
23    /// Get offsets of byte occurrences
24    pub fn get_matching_offsets(&self, vals: &[u8]) -> Vec<usize> {
25        self.bytes
26            .par_iter()
27            .enumerate()
28            .filter(|&(_, b)| vals.contains(b))
29            .map(|(i, _)| i)
30            .collect()
31    }
32}