mirror of
https://github.com/AFLplusplus/AFLplusplus.git
synced 2025-06-15 19:38:09 +00:00
some rust cleanup
This commit is contained in:
@ -3,5 +3,6 @@ members = [
|
|||||||
"custom_mutator-sys",
|
"custom_mutator-sys",
|
||||||
"custom_mutator",
|
"custom_mutator",
|
||||||
"example",
|
"example",
|
||||||
"example_lain",
|
# Lain needs a nightly toolchain
|
||||||
|
# "example_lain",
|
||||||
]
|
]
|
@ -1,9 +1,11 @@
|
|||||||
|
# Rust Custom Mutators
|
||||||
|
|
||||||
Bindings to create custom mutators in Rust.
|
Bindings to create custom mutators in Rust.
|
||||||
|
|
||||||
These bindings are documented with rustdoc. To view the documentation run
|
These bindings are documented with rustdoc. To view the documentation run
|
||||||
```cargo doc -p custom_mutator --open```.
|
```cargo doc -p custom_mutator --open```.
|
||||||
|
|
||||||
A minimal example can be found in `example`.
|
A minimal example can be found in `example`. Build it using `cargo build --example example_mutator`.
|
||||||
|
|
||||||
An example using [lain](https://github.com/microsoft/lain) can be found in `example_lain`.
|
An example using [lain](https://github.com/microsoft/lain) for structured fuzzing can be found in `example_lain`.
|
||||||
Since lain requires a nightly rust toolchain, you need to set one up before you can play with it.
|
Since lain requires a nightly rust toolchain, you need to set one up before you can play with it.
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
//! The state is passed to [`CustomMutator::init`], when the feature is activated.
|
//! The state is passed to [`CustomMutator::init`], when the feature is activated.
|
||||||
//!
|
//!
|
||||||
//! _This is completely unsafe and uses automatically generated types extracted from the AFL++ source._
|
//! _This is completely unsafe and uses automatically generated types extracted from the AFL++ source._
|
||||||
use std::{ffi::CStr, fmt::Debug, os::raw::c_uint};
|
use std::{ffi::CStr, fmt::Debug};
|
||||||
|
|
||||||
#[cfg(feature = "afl_internals")]
|
#[cfg(feature = "afl_internals")]
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
@ -37,7 +37,7 @@ pub trait RawCustomMutator {
|
|||||||
where
|
where
|
||||||
Self: Sized;
|
Self: Sized;
|
||||||
#[cfg(not(feature = "afl_internals"))]
|
#[cfg(not(feature = "afl_internals"))]
|
||||||
fn init(seed: c_uint) -> Self
|
fn init(seed: u32) -> Self
|
||||||
where
|
where
|
||||||
Self: Sized;
|
Self: Sized;
|
||||||
|
|
||||||
@ -87,7 +87,7 @@ pub mod wrappers {
|
|||||||
convert::TryInto,
|
convert::TryInto,
|
||||||
ffi::{c_void, CStr},
|
ffi::{c_void, CStr},
|
||||||
mem::ManuallyDrop,
|
mem::ManuallyDrop,
|
||||||
os::raw::{c_char, c_uint},
|
os::raw::c_char,
|
||||||
panic::catch_unwind,
|
panic::catch_unwind,
|
||||||
process::abort,
|
process::abort,
|
||||||
ptr::null,
|
ptr::null,
|
||||||
@ -112,13 +112,13 @@ pub mod wrappers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "afl_internals")]
|
#[cfg(feature = "afl_internals")]
|
||||||
fn new(afl: &'static afl_state, seed: c_uint) -> Box<Self> {
|
fn new(afl: &'static afl_state, seed: u32) -> Box<Self> {
|
||||||
Box::new(Self {
|
Box::new(Self {
|
||||||
mutator: M::init(afl, seed),
|
mutator: M::init(afl, seed),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
#[cfg(not(feature = "afl_internals"))]
|
#[cfg(not(feature = "afl_internals"))]
|
||||||
fn new(seed: c_uint) -> Box<Self> {
|
fn new(seed: u32) -> Box<Self> {
|
||||||
Box::new(Self {
|
Box::new(Self {
|
||||||
mutator: M::init(seed),
|
mutator: M::init(seed),
|
||||||
})
|
})
|
||||||
@ -143,7 +143,7 @@ pub mod wrappers {
|
|||||||
|
|
||||||
/// Internal function used in the macro
|
/// Internal function used in the macro
|
||||||
#[cfg(not(feature = "afl_internals"))]
|
#[cfg(not(feature = "afl_internals"))]
|
||||||
pub fn afl_custom_init_<M: RawCustomMutator>(seed: c_uint) -> *const c_void {
|
pub fn afl_custom_init_<M: RawCustomMutator>(seed: u32) -> *const c_void {
|
||||||
match catch_unwind(|| FFIContext::<M>::new(seed).into_ptr()) {
|
match catch_unwind(|| FFIContext::<M>::new(seed).into_ptr()) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(err) => panic_handler("afl_custom_init", err),
|
Err(err) => panic_handler("afl_custom_init", err),
|
||||||
@ -154,7 +154,7 @@ pub mod wrappers {
|
|||||||
#[cfg(feature = "afl_internals")]
|
#[cfg(feature = "afl_internals")]
|
||||||
pub fn afl_custom_init_<M: RawCustomMutator>(
|
pub fn afl_custom_init_<M: RawCustomMutator>(
|
||||||
afl: Option<&'static afl_state>,
|
afl: Option<&'static afl_state>,
|
||||||
seed: c_uint,
|
seed: u32,
|
||||||
) -> *const c_void {
|
) -> *const c_void {
|
||||||
match catch_unwind(|| {
|
match catch_unwind(|| {
|
||||||
let afl = afl.expect("mutator func called with NULL afl");
|
let afl = afl.expect("mutator func called with NULL afl");
|
||||||
@ -328,16 +328,15 @@ pub mod wrappers {
|
|||||||
/// # #[cfg(feature = "afl_internals")]
|
/// # #[cfg(feature = "afl_internals")]
|
||||||
/// # use custom_mutator::afl_state;
|
/// # use custom_mutator::afl_state;
|
||||||
/// # use custom_mutator::CustomMutator;
|
/// # use custom_mutator::CustomMutator;
|
||||||
/// # use std::os::raw::c_uint;
|
|
||||||
/// struct MyMutator;
|
/// struct MyMutator;
|
||||||
/// impl CustomMutator for MyMutator {
|
/// impl CustomMutator for MyMutator {
|
||||||
/// /// ...
|
/// /// ...
|
||||||
/// # type Error = ();
|
/// # type Error = ();
|
||||||
/// # #[cfg(feature = "afl_internals")]
|
/// # #[cfg(feature = "afl_internals")]
|
||||||
/// # fn init(_afl_state: &afl_state, _seed: c_uint) -> Result<Self,()> {unimplemented!()}
|
/// # fn init(_afl_state: &afl_state, _seed: u32) -> Result<Self,()> {unimplemented!()}
|
||||||
/// # #[cfg(not(feature = "afl_internals"))]
|
/// # #[cfg(not(feature = "afl_internals"))]
|
||||||
/// # fn init(_seed: c_uint) -> Result<Self,()> {unimplemented!()}
|
/// # fn init(_seed: u32) -> Result<Self, Self::Error> {unimplemented!()}
|
||||||
/// # fn fuzz<'b,'s:'b>(&'s mut self, _buffer: &'b mut [u8], _add_buff: Option<&[u8]>, _max_size: usize) -> Result<Option<&'b [u8]>,()> {unimplemented!()}
|
/// # fn fuzz<'b,'s:'b>(&'s mut self, _buffer: &'b mut [u8], _add_buff: Option<&[u8]>, _max_size: usize) -> Result<Option<&'b [u8]>, Self::Error> {unimplemented!()}
|
||||||
/// }
|
/// }
|
||||||
/// export_mutator!(MyMutator);
|
/// export_mutator!(MyMutator);
|
||||||
/// ```
|
/// ```
|
||||||
@ -350,7 +349,7 @@ macro_rules! export_mutator {
|
|||||||
afl: ::std::option::Option<&'static $crate::afl_state>,
|
afl: ::std::option::Option<&'static $crate::afl_state>,
|
||||||
seed: ::std::os::raw::c_uint,
|
seed: ::std::os::raw::c_uint,
|
||||||
) -> *const ::std::os::raw::c_void {
|
) -> *const ::std::os::raw::c_void {
|
||||||
$crate::wrappers::afl_custom_init_::<$mutator_type>(afl, seed)
|
$crate::wrappers::afl_custom_init_::<$mutator_type>(afl, seed as u32)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "afl_internals"))]
|
#[cfg(not(feature = "afl_internals"))]
|
||||||
@ -359,7 +358,7 @@ macro_rules! export_mutator {
|
|||||||
_afl: *const ::std::os::raw::c_void,
|
_afl: *const ::std::os::raw::c_void,
|
||||||
seed: ::std::os::raw::c_uint,
|
seed: ::std::os::raw::c_uint,
|
||||||
) -> *const ::std::os::raw::c_void {
|
) -> *const ::std::os::raw::c_void {
|
||||||
$crate::wrappers::afl_custom_init_::<$mutator_type>(seed)
|
$crate::wrappers::afl_custom_init_::<$mutator_type>(seed as u32)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@ -442,8 +441,6 @@ macro_rules! export_mutator {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
/// this sanity test is supposed to just find out whether an empty mutator being exported by the macro compiles
|
/// this sanity test is supposed to just find out whether an empty mutator being exported by the macro compiles
|
||||||
mod sanity_test {
|
mod sanity_test {
|
||||||
use std::os::raw::c_uint;
|
|
||||||
|
|
||||||
#[cfg(feature = "afl_internals")]
|
#[cfg(feature = "afl_internals")]
|
||||||
use super::afl_state;
|
use super::afl_state;
|
||||||
|
|
||||||
@ -453,12 +450,12 @@ mod sanity_test {
|
|||||||
|
|
||||||
impl RawCustomMutator for ExampleMutator {
|
impl RawCustomMutator for ExampleMutator {
|
||||||
#[cfg(feature = "afl_internals")]
|
#[cfg(feature = "afl_internals")]
|
||||||
fn init(_afl: &afl_state, _seed: c_uint) -> Self {
|
fn init(_afl: &afl_state, _seed: u32) -> Self {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "afl_internals"))]
|
#[cfg(not(feature = "afl_internals"))]
|
||||||
fn init(_seed: c_uint) -> Self {
|
fn init(_seed: u32) -> Self {
|
||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,12 +494,12 @@ pub trait CustomMutator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "afl_internals")]
|
#[cfg(feature = "afl_internals")]
|
||||||
fn init(afl: &'static afl_state, seed: c_uint) -> Result<Self, Self::Error>
|
fn init(afl: &'static afl_state, seed: u32) -> Result<Self, Self::Error>
|
||||||
where
|
where
|
||||||
Self: Sized;
|
Self: Sized;
|
||||||
|
|
||||||
#[cfg(not(feature = "afl_internals"))]
|
#[cfg(not(feature = "afl_internals"))]
|
||||||
fn init(seed: c_uint) -> Result<Self, Self::Error>
|
fn init(seed: u32) -> Result<Self, Self::Error>
|
||||||
where
|
where
|
||||||
Self: Sized;
|
Self: Sized;
|
||||||
|
|
||||||
@ -544,7 +541,7 @@ where
|
|||||||
M::Error: Debug,
|
M::Error: Debug,
|
||||||
{
|
{
|
||||||
#[cfg(feature = "afl_internals")]
|
#[cfg(feature = "afl_internals")]
|
||||||
fn init(afl: &'static afl_state, seed: c_uint) -> Self
|
fn init(afl: &'static afl_state, seed: u32) -> Self
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
{
|
{
|
||||||
@ -558,7 +555,7 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(feature = "afl_internals"))]
|
#[cfg(not(feature = "afl_internals"))]
|
||||||
fn init(seed: c_uint) -> Self
|
fn init(seed: u32) -> Self
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "example"
|
name = "example_mutator"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
authors = ["Julius Hohnerlein <julihoh@users.noreply.github.com>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
@ -9,5 +9,7 @@ edition = "2018"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
custom_mutator = { path = "../custom_mutator" }
|
custom_mutator = { path = "../custom_mutator" }
|
||||||
|
|
||||||
[lib]
|
[[example]]
|
||||||
|
name = "example_mutator"
|
||||||
|
path = "./src/example_mutator.rs"
|
||||||
crate-type = ["cdylib"]
|
crate-type = ["cdylib"]
|
@ -1,14 +1,13 @@
|
|||||||
#![allow(unused_variables)]
|
#![allow(unused_variables)]
|
||||||
|
|
||||||
use custom_mutator::{export_mutator, CustomMutator};
|
use custom_mutator::{export_mutator, CustomMutator};
|
||||||
use std::os::raw::c_uint;
|
|
||||||
|
|
||||||
struct ExampleMutator;
|
struct ExampleMutator;
|
||||||
|
|
||||||
impl CustomMutator for ExampleMutator {
|
impl CustomMutator for ExampleMutator {
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
|
||||||
fn init(seed: c_uint) -> Result<Self, ()> {
|
fn init(seed: u32) -> Result<Self, Self::Error> {
|
||||||
Ok(Self)
|
Ok(Self)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -17,7 +16,7 @@ impl CustomMutator for ExampleMutator {
|
|||||||
buffer: &'b mut [u8],
|
buffer: &'b mut [u8],
|
||||||
add_buff: Option<&[u8]>,
|
add_buff: Option<&[u8]>,
|
||||||
max_size: usize,
|
max_size: usize,
|
||||||
) -> Result<Option<&'b [u8]>, ()> {
|
) -> Result<Option<&'b [u8]>, Self::Error> {
|
||||||
buffer.reverse();
|
buffer.reverse();
|
||||||
Ok(Some(buffer))
|
Ok(Some(buffer))
|
||||||
}
|
}
|
||||||
@ -30,7 +29,7 @@ struct OwnBufferExampleMutator {
|
|||||||
impl CustomMutator for OwnBufferExampleMutator {
|
impl CustomMutator for OwnBufferExampleMutator {
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
|
||||||
fn init(seed: c_uint) -> Result<Self, ()> {
|
fn init(seed: u32) -> Result<Self, Self::Error> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
own_buffer: Vec::new(),
|
own_buffer: Vec::new(),
|
||||||
})
|
})
|
@ -10,5 +10,7 @@ edition = "2018"
|
|||||||
custom_mutator = { path = "../custom_mutator" }
|
custom_mutator = { path = "../custom_mutator" }
|
||||||
lain="0.5"
|
lain="0.5"
|
||||||
|
|
||||||
[lib]
|
[[example]]
|
||||||
|
name = "example_lain"
|
||||||
|
path = "./src/lain_mutator.rs"
|
||||||
crate-type = ["cdylib"]
|
crate-type = ["cdylib"]
|
@ -4,7 +4,6 @@ use lain::{
|
|||||||
prelude::*,
|
prelude::*,
|
||||||
rand::{rngs::StdRng, SeedableRng},
|
rand::{rngs::StdRng, SeedableRng},
|
||||||
};
|
};
|
||||||
use std::os::raw::c_uint;
|
|
||||||
|
|
||||||
#[derive(Debug, Mutatable, NewFuzzed, BinarySerialize)]
|
#[derive(Debug, Mutatable, NewFuzzed, BinarySerialize)]
|
||||||
struct MyStruct {
|
struct MyStruct {
|
||||||
@ -31,7 +30,7 @@ struct LainMutator {
|
|||||||
impl CustomMutator for LainMutator {
|
impl CustomMutator for LainMutator {
|
||||||
type Error = ();
|
type Error = ();
|
||||||
|
|
||||||
fn init(seed: c_uint) -> Result<Self, ()> {
|
fn init(seed: u32) -> Result<Self, ()> {
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
mutator: Mutator::new(StdRng::seed_from_u64(seed as u64)),
|
mutator: Mutator::new(StdRng::seed_from_u64(seed as u64)),
|
||||||
buffer: Vec::new(),
|
buffer: Vec::new(),
|
Reference in New Issue
Block a user