use crate::{Result, consts::FileFormat};
pub mod dnfile;
pub mod smda;
pub trait Instruction: Send + Sync {
fn is_mov_imm_to_stack(&self) -> Result<bool>;
fn get_printable_len(&self) -> Result<u64>;
fn as_any(&self) -> &dyn std::any::Any;
}
pub trait Function: Send + Sync {
fn inrefs(&self) -> &Vec<u64>;
fn blockrefs(&self) -> &std::collections::HashMap<u64, Vec<u64>>;
fn offset(&self) -> u64;
fn get_blocks(&self) -> Result<std::collections::BTreeMap<u64, Vec<Box<dyn Instruction>>>>;
fn as_any(&self) -> &dyn std::any::Any;
}
pub trait Extractor: Send + Sync {
#[allow(dead_code)]
fn get_base_address(&self) -> Result<u64>;
#[allow(dead_code)]
fn format(&self) -> FileFormat;
fn bitness(&self) -> u32;
#[allow(dead_code)]
fn arch(&self) -> Result<crate::FileArchitecture>;
fn extract_global_features(&self) -> Result<Vec<(crate::rules::features::Feature, u64)>>;
fn extract_file_features(&self) -> Result<Vec<(crate::rules::features::Feature, u64)>>;
fn get_functions(&self) -> Result<std::collections::BTreeMap<u64, Box<dyn Function>>>;
fn extract_function_features(
&self,
f: &Box<dyn Function>,
) -> Result<Vec<(crate::rules::features::Feature, u64)>>;
fn get_basic_blocks(
&self,
f: &Box<dyn Function>,
) -> Result<std::collections::BTreeMap<u64, Vec<Box<dyn Instruction>>>>;
fn get_instructions<'a>(
&self,
f: &Box<dyn Function>,
bb: &'a (&u64, &Vec<Box<dyn Instruction>>),
) -> Result<&'a Vec<Box<dyn Instruction>>>;
fn extract_basic_block_features(
&self,
f: &Box<dyn Function>,
bb: &(&u64, &Vec<Box<dyn Instruction>>),
) -> Result<Vec<(crate::rules::features::Feature, u64)>>;
fn extract_insn_features(
&self,
f: &Box<dyn Function>,
insn: &Box<dyn Instruction>,
) -> Result<Vec<(crate::rules::features::Feature, u64)>>;
fn is_dot_net(&self) -> bool;
fn function_bytes(&self, _addr: u64, _max_len: u32) -> Option<&[u8]> {
None
}
}