use crate::common::get_cstring;
use crate::extractors::vxworks::extract_symbol_table;
use crate::signatures::common::{SignatureError, SignatureResult, CONFIDENCE_HIGH, CONFIDENCE_LOW};
pub const SYMTAB_DESCRIPTION: &str = "VxWorks symbol table";
pub const WIND_KERNEL_DESCRIPTION: &str = "VxWorks WIND kernel version";
pub fn wind_kernel_magic() -> Vec<Vec<u8>> {
vec![b"WIND version ".to_vec()]
}
pub fn symbol_table_magic() -> Vec<Vec<u8>> {
vec![
b"\x00\x00\x05\x00\x00\x00\x00\x00".to_vec(),
b"\x00\x00\x07\x00\x00\x00\x00\x00".to_vec(),
b"\x00\x00\x09\x00\x00\x00\x00\x00".to_vec(),
b"\x00\x05\x00\x00\x00\x00\x00\x00".to_vec(),
b"\x00\x07\x00\x00\x00\x00\x00\x00".to_vec(),
b"\x00\x09\x00\x00\x00\x00\x00\x00".to_vec(),
]
}
pub fn wind_kernel_parser(
file_data: &[u8],
offset: usize,
) -> Result<SignatureResult, SignatureError> {
const MAGIC_SIZE: usize = 13;
let mut result = SignatureResult {
offset,
description: WIND_KERNEL_DESCRIPTION.to_string(),
confidence: CONFIDENCE_LOW,
..Default::default()
};
let version_offset: usize = offset + MAGIC_SIZE;
if let Some(version_bytes) = file_data.get(version_offset..) {
let version_string = get_cstring(version_bytes);
if !version_string.is_empty() {
result.size = MAGIC_SIZE + version_string.len();
result.description = format!("{} {}", result.description, version_string);
return Ok(result);
}
}
Err(SignatureError)
}
pub fn symbol_table_parser(
file_data: &[u8],
offset: usize,
) -> Result<SignatureResult, SignatureError> {
const MAGIC_OFFSET: usize = 8;
let mut result = SignatureResult {
description: SYMTAB_DESCRIPTION.to_string(),
confidence: CONFIDENCE_HIGH,
..Default::default()
};
if offset >= MAGIC_OFFSET {
let symtab_start: usize = offset - MAGIC_OFFSET;
let dry_run = extract_symbol_table(file_data, symtab_start, None);
if dry_run.success {
if let Some(symtab_size) = dry_run.size {
result.size = symtab_size;
result.offset = symtab_start;
result.description =
format!("{}, total size: {} bytes", result.description, result.size);
return Ok(result);
}
}
}
Err(SignatureError)
}