Win32ShMem
This commit is contained in:
parent
34dc92fe58
commit
898c178c3b
@ -64,6 +64,7 @@ uds = "0.2.3"
|
|||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
windows = "0.3.1"
|
windows = "0.3.1"
|
||||||
|
uuid = { version = "0.8", features = ["v4"] }
|
||||||
|
|
||||||
[target.'cfg(windows)'.build-dependencies]
|
[target.'cfg(windows)'.build-dependencies]
|
||||||
windows = "0.3.1"
|
windows = "0.3.1"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
fn main() {
|
fn main() {
|
||||||
#[cfg(target_os = "windows")]
|
#[cfg(target_os = "windows")]
|
||||||
windows::build!(
|
windows::build!(
|
||||||
windows::win32::system_services::HANDLE,
|
windows::win32::system_services::{HANDLE, PAGE_TYPE, PSTR},
|
||||||
windows::win32::windows_programming::CloseHandle,
|
windows::win32::windows_programming::CloseHandle,
|
||||||
// API needed for the shared memory
|
// API needed for the shared memory
|
||||||
windows::win32::system_services::{CreateFileMappingA, OpenFileMappingA, MapViewOfFile, UnmapViewOfFile},
|
windows::win32::system_services::{CreateFileMappingA, OpenFileMappingA, MapViewOfFile, UnmapViewOfFile},
|
||||||
|
@ -318,14 +318,14 @@ pub mod unix_shmem {
|
|||||||
impl Drop for UnixShMem {
|
impl Drop for UnixShMem {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
afl_shmem_deinit(self);
|
unix_shmem_deinit(self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create an uninitialized shmap
|
/// Create an uninitialized shmap
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
const fn afl_shmem_unitialized() -> UnixShMem {
|
const fn unix_shmem_unitialized() -> UnixShMem {
|
||||||
UnixShMem {
|
UnixShMem {
|
||||||
shm_str: [0; 20],
|
shm_str: [0; 20],
|
||||||
shm_id: -1,
|
shm_id: -1,
|
||||||
@ -337,8 +337,8 @@ pub mod unix_shmem {
|
|||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
impl UnixShMem {
|
impl UnixShMem {
|
||||||
pub fn from_str(shm_str: &CStr, map_size: usize) -> Result<Self, Error> {
|
pub fn from_str(shm_str: &CStr, map_size: usize) -> Result<Self, Error> {
|
||||||
let mut ret = afl_shmem_unitialized();
|
let mut ret = unix_shmem_unitialized();
|
||||||
let map = unsafe { afl_shmem_by_str(&mut ret, shm_str, map_size) };
|
let map = unsafe { unix_shmem_by_str(&mut ret, shm_str, map_size) };
|
||||||
if !map.is_null() {
|
if !map.is_null() {
|
||||||
Ok(ret)
|
Ok(ret)
|
||||||
} else {
|
} else {
|
||||||
@ -350,8 +350,8 @@ pub mod unix_shmem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn new(map_size: usize) -> Result<Self, Error> {
|
pub fn new(map_size: usize) -> Result<Self, Error> {
|
||||||
let mut ret = afl_shmem_unitialized();
|
let mut ret = unix_shmem_unitialized();
|
||||||
let map = unsafe { afl_shmem_init(&mut ret, map_size) };
|
let map = unsafe { unix_shmem_init(&mut ret, map_size) };
|
||||||
if !map.is_null() {
|
if !map.is_null() {
|
||||||
Ok(ret)
|
Ok(ret)
|
||||||
} else {
|
} else {
|
||||||
@ -364,7 +364,7 @@ pub mod unix_shmem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Deinitialize this shmem instance
|
/// Deinitialize this shmem instance
|
||||||
unsafe fn afl_shmem_deinit(shm: *mut UnixShMem) {
|
unsafe fn unix_shmem_deinit(shm: *mut UnixShMem) {
|
||||||
if shm.is_null() || (*shm).map.is_null() {
|
if shm.is_null() || (*shm).map.is_null() {
|
||||||
/* Serialized map id */
|
/* Serialized map id */
|
||||||
// Not set or not initialized;
|
// Not set or not initialized;
|
||||||
@ -377,7 +377,7 @@ pub mod unix_shmem {
|
|||||||
|
|
||||||
/// Functions to create Shared memory region, for observation channels and
|
/// Functions to create Shared memory region, for observation channels and
|
||||||
/// opening inputs and stuff.
|
/// opening inputs and stuff.
|
||||||
unsafe fn afl_shmem_init(shm: *mut UnixShMem, map_size: usize) -> *mut c_uchar {
|
unsafe fn unix_shmem_init(shm: *mut UnixShMem, map_size: usize) -> *mut c_uchar {
|
||||||
(*shm).map_size = map_size;
|
(*shm).map_size = map_size;
|
||||||
(*shm).map = ptr::null_mut();
|
(*shm).map = ptr::null_mut();
|
||||||
(*shm).shm_id = shmget(
|
(*shm).shm_id = shmget(
|
||||||
@ -409,7 +409,7 @@ pub mod unix_shmem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Uses a shmap id string to open a shared map
|
/// Uses a shmap id string to open a shared map
|
||||||
unsafe fn afl_shmem_by_str(
|
unsafe fn unix_shmem_by_str(
|
||||||
shm: *mut UnixShMem,
|
shm: *mut UnixShMem,
|
||||||
shm_str: &CStr,
|
shm_str: &CStr,
|
||||||
map_size: usize,
|
map_size: usize,
|
||||||
@ -443,18 +443,130 @@ pub mod unix_shmem {
|
|||||||
#[cfg(all(feature = "std", windows))]
|
#[cfg(all(feature = "std", windows))]
|
||||||
pub mod shmem {
|
pub mod shmem {
|
||||||
|
|
||||||
//TODO use super::ShMem;
|
use super::ShMem;
|
||||||
|
use crate::{
|
||||||
|
bolts::bindings::{
|
||||||
|
windows::win32::system_services::{
|
||||||
|
CreateFileMappingA, MapViewOfFile, OpenFileMappingA, UnmapViewOfFile,
|
||||||
|
},
|
||||||
|
windows::win32::system_services::{HANDLE, PAGE_TYPE},
|
||||||
|
windows::win32::windows_programming::CloseHandle,
|
||||||
|
},
|
||||||
|
Error,
|
||||||
|
};
|
||||||
|
|
||||||
|
use uuid::Uuid;
|
||||||
|
|
||||||
|
const INVALID_HANDLE_VALUE: i32 = -1;
|
||||||
|
const FILE_MAP_ALL_ACCESS: u32 = 0xf001f;
|
||||||
|
|
||||||
/// The default Sharedmap impl for windows using shmctl & shmget
|
/// The default Sharedmap impl for windows using shmctl & shmget
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Win32ShMem {
|
pub struct Win32ShMem {
|
||||||
pub filename: [u8; 64],
|
pub shm_str: [u8; 20],
|
||||||
//TODO pub handle: windows::win32::system_services::HANDLE,
|
pub handle: HANDLE,
|
||||||
pub map: *mut u8,
|
pub map: *mut u8,
|
||||||
pub map_size: usize,
|
pub map_size: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO complete
|
impl ShMem for Win32ShMem {
|
||||||
|
fn existing_from_shm_slice(
|
||||||
|
map_str_bytes: &[u8; 20],
|
||||||
|
map_size: usize,
|
||||||
|
) -> Result<Self, Error> {
|
||||||
|
Self::from_str(map_str_bytes, map_size)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_map(map_size: usize) -> Result<Self, Error> {
|
||||||
|
Self::new(map_size)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn shm_slice(&self) -> &[u8; 20] {
|
||||||
|
&self.shm_str
|
||||||
|
}
|
||||||
|
|
||||||
|
fn map(&self) -> &[u8] {
|
||||||
|
unsafe { slice::from_raw_parts(self.map, self.map_size) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn map_mut(&mut self) -> &mut [u8] {
|
||||||
|
unsafe { slice::from_raw_parts_mut(self.map, self.map_size) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deinit sharedmaps on drop
|
||||||
|
impl Drop for Win32ShMem {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe {
|
||||||
|
UnmapViewOfFile(self.map);
|
||||||
|
CloseHandle(self.hanlde);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Win32ShMem {
|
||||||
|
pub fn from_str(map_str_bytes: &[u8; 20], map_size: usize) -> Result<Self, Error> {
|
||||||
|
unsafe {
|
||||||
|
let handle = OpenFileMappingA(FILE_MAP_ALL_ACCESS, false, map_str_bytes);
|
||||||
|
if handle == ptr::null() {
|
||||||
|
return Error::Unknown(format!(
|
||||||
|
"Cannot open shared memory {}",
|
||||||
|
String::from_utf8_lossy(map_str_bytes)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let map =
|
||||||
|
MapViewOfFile(handle.clone(), FILE_MAP_ALL_ACCESS, 0, 0, map_size) as *mut u8;
|
||||||
|
if map == ptr::null_mut() {
|
||||||
|
return Error::Unknown(format!(
|
||||||
|
"Cannot map shared memory {}",
|
||||||
|
String::from_utf8_lossy(map_str_bytes)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(Self {
|
||||||
|
shm_str: name[0..20].clone(),
|
||||||
|
handle,
|
||||||
|
map,
|
||||||
|
map_size,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new(map_size: usize) -> Result<Self, Error> {
|
||||||
|
let uuid = Uuid::new_v4().unwrap();
|
||||||
|
let mut map_str_bytes = format!("libafl_{}", uuid.to_simple()).as_mut_bytes();
|
||||||
|
map_str_bytes[19] = 0; // Trucate to size 20
|
||||||
|
unsafe {
|
||||||
|
let handle = CreateFileMappingA(
|
||||||
|
INVALID_HANDLE_VALUE,
|
||||||
|
ptr::null_mut(),
|
||||||
|
PAGE_TYPE::PAGE_READWRITE,
|
||||||
|
0,
|
||||||
|
map_size,
|
||||||
|
map_str_bytes,
|
||||||
|
);
|
||||||
|
if handle == ptr::null() {
|
||||||
|
return Error::Unknown(format!(
|
||||||
|
"Cannot create shared memory {}",
|
||||||
|
String::from_utf8_lossy(map_str_bytes)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let map =
|
||||||
|
MapViewOfFile(handle.clone(), FILE_MAP_ALL_ACCESS, 0, 0, map_size) as *mut u8;
|
||||||
|
if map == ptr::null_mut() {
|
||||||
|
return Error::Unknown(format!(
|
||||||
|
"Cannot map shared memory {}",
|
||||||
|
String::from_utf8_lossy(map_str_bytes)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(Self {
|
||||||
|
shm_str: map_str_bytes[0..20].clone(),
|
||||||
|
handle,
|
||||||
|
map,
|
||||||
|
map_size,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user