diff --git a/afl/src/engines/mod.rs b/afl/src/engines/mod.rs index 791e2c7156..d31b41ea33 100644 --- a/afl/src/engines/mod.rs +++ b/afl/src/engines/mod.rs @@ -2,6 +2,7 @@ use core::fmt::Debug; use core::marker::PhantomData; +use std::fs; use serde::{Deserialize, Serialize}; use crate::corpus::{Corpus, Testcase}; @@ -195,6 +196,100 @@ where } } + pub fn load_from_directory( + &mut self, + corpus: &mut C, + generator: &mut G, + engine: &mut Engine, + manager: &mut EM, + in_dir: String, + )-> Result<(), AflError> + where + G: Generator, + C: Corpus, + E: Executor + HasObservers, + ET: ExecutorsTuple, + EM: EventManager, + { + for entry in fs::read_dir(in_dir)? { + + let entry = entry?; + + let file = entry.path().display().to_string(); + + let attributes = fs::metadata(file.clone()); + + if !attributes.is_ok() { + + continue; + + } + + let attr = attributes?; + + if attr.is_file() { + + println!("Load file {}", file); + //let input = read_file(file); + //let fitness = self.evaluate_input(&input, engine.executor_mut())?; + //if !self.add_if_interesting(corpus, input, fitness)?.is_none() { + // added += 1; + //} + + } else if attr.is_dir() { + + let _x = load_from_directory( + &mut corpus, + &mut generator, + &mut engine, + &mut manager, + file, + ); + + } + + } + + Ok(()) + + } + + + pub fn load_initial_inputs( + &mut self, + corpus: &mut C, + generator: &mut G, + engine: &mut Engine, + manager: &mut EM, + in_dir: Vec, + )-> Result<(), AflError> + where + G: Generator, + C: Corpus, + E: Executor + HasObservers, + ET: ExecutorsTuple, + EM: EventManager, + { + let mut added = 0 as u32; + for directory in in_dir { + + let _x = load_from_directory( + &mut corpus, + &mut generator, + &mut engine, + &mut manager, + directory, + ); + + } + manager.log( + 0, + format!("Loaded {} initial testcases", 123), // get corpus count + )?; + manager.process(self, corpus)?; + Ok(()) + } + pub fn generate_initial_inputs( &mut self, rand: &mut R, diff --git a/fuzzers/libfuzzer/src/lib.rs b/fuzzers/libfuzzer/src/lib.rs index e1eac82781..d1ee651ac0 100644 --- a/fuzzers/libfuzzer/src/lib.rs +++ b/fuzzers/libfuzzer/src/lib.rs @@ -105,7 +105,7 @@ pub extern "C" fn afl_libfuzzer_main() { println!("in: {}", indir); } } - + // original code let mut rand = StdRand::new(0); @@ -131,16 +131,28 @@ pub extern "C" fn afl_libfuzzer_main() { let mut engine = Engine::new(executor); - state - .generate_initial_inputs( - &mut rand, - &mut corpus, - &mut generator, - &mut engine, - &mut mgr, - 4, - ) - .expect("Failed to load initial inputs"); + if input != None { + state + .load_initial_inputs( + &mut corpus, + &mut generator, + &mut engine, + &mut mgr, + input.unwrap(), + ) + .expect("Failed to load initial corpus"); + } else { + state + .generate_initial_inputs( + &mut rand, + &mut corpus, + &mut generator, + &mut engine, + &mut mgr, + 4, + ) + .expect("Failed to load initial inputs"); + } let mut mutator = HavocBytesMutator::new_default(); mutator.set_max_size(4096);