virt2file/
lib.rs

1use eyre::Result;
2use goblin::{pe::PE, Hint};
3use std::io::Cursor;
4
5mod windows;
6
7/// Converts between virtual addresses and file offests.
8/// `reverse`: converts from file offsets to virtual addresses instead.
9/// `base`: changes base of the image, by default uses the one from file header.
10pub fn convert(
11    file: impl AsRef<[u8]>,
12    addresses: &[usize],
13    reverse: bool,
14    base: Option<usize>,
15) -> Result<Vec<usize>> {
16    let mut binary = Cursor::new(file);
17    let hint = goblin::peek(&mut binary)?;
18
19    match hint {
20        Hint::PE => {
21            let pe = PE::parse(binary.get_ref().as_ref())?;
22            windows::output(&pe, addresses, reverse, base)
23        }
24        _ => eyre::bail!("Unsupported file format, supported formats are: PE"),
25    }
26}