mirror of
https://github.com/EFForg/rayhunter.git
synced 2026-07-09 10:08:10 -07:00
wavehunter and wavehunter-reader now output pcap files
This commit is contained in:
+14
-7
@@ -1,21 +1,28 @@
|
|||||||
use wavehunter::diag_device::{DiagDevice, DiagResult};
|
use wavehunter::diag_device::{DiagDevice, DiagResult};
|
||||||
use wavehunter::diag_reader::DiagReader;
|
use wavehunter::diag_reader::DiagReader;
|
||||||
|
use wavehunter::gsmtap_parser::GsmtapParser;
|
||||||
|
use wavehunter::pcap::PcapFile;
|
||||||
|
|
||||||
|
use log::debug;
|
||||||
|
|
||||||
fn main() -> DiagResult<()> {
|
fn main() -> DiagResult<()> {
|
||||||
// this should eventually be removed for prod
|
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
|
|
||||||
let file = std::fs::File::options()
|
let mut dev = DiagDevice::new()?;
|
||||||
.read(true)
|
|
||||||
.write(true)
|
|
||||||
.open("/dev/diag")?;
|
|
||||||
let mut dev = DiagDevice::new(&file)?;
|
|
||||||
dev.enable_debug_mode("/data/wavehunter-debug")?;
|
dev.enable_debug_mode("/data/wavehunter-debug")?;
|
||||||
dev.config_logs()?;
|
dev.config_logs()?;
|
||||||
|
|
||||||
|
let mut gsmtap_parser = GsmtapParser::new();
|
||||||
|
let mut pcap_file = PcapFile::new("/data/wavehunter.pcap").unwrap();
|
||||||
|
pcap_file.write_iface_header().unwrap();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
for msg in dev.read_response()? {
|
for msg in dev.read_response()? {
|
||||||
println!("msg: {:?}", msg);
|
debug!("msg: {:?}", msg);
|
||||||
|
if let Some((timestamp, gsmtap_msg)) = gsmtap_parser.recv_message(msg).unwrap() {
|
||||||
|
debug!("gsmtap_msg: {:?}", gsmtap_msg);
|
||||||
|
pcap_file.write_gsmtap_message(gsmtap_msg, timestamp).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,32 @@
|
|||||||
use wavehunter::debug_file::DebugFileReader;
|
use wavehunter::debug_file::DebugFileReader;
|
||||||
use wavehunter::diag_reader::DiagReader;
|
use wavehunter::diag_reader::DiagReader;
|
||||||
use wavehunter::diag_device::DiagResult;
|
use wavehunter::diag_device::DiagResult;
|
||||||
|
use wavehunter::gsmtap_parser::GsmtapParser;
|
||||||
|
use wavehunter::pcap::PcapFile;
|
||||||
|
|
||||||
|
use log::{debug, error};
|
||||||
|
|
||||||
fn main() -> DiagResult<()> {
|
fn main() -> DiagResult<()> {
|
||||||
// this should eventually be removed for prod
|
|
||||||
env_logger::init();
|
env_logger::init();
|
||||||
|
|
||||||
let args: Vec<String> = std::env::args().collect();
|
let args: Vec<String> = std::env::args().collect();
|
||||||
if args.len() != 2 {
|
if args.len() != 2 {
|
||||||
println!("Usage: {} /path/to/debug/file", args[0]);
|
error!("Usage: {} /path/to/debug/file", args[0]);
|
||||||
std::process::exit(1);
|
std::process::exit(1);
|
||||||
}
|
}
|
||||||
let mut debug_reader = DebugFileReader::new(&args[1])?;
|
let mut debug_reader = DebugFileReader::new(&args[1])?;
|
||||||
|
|
||||||
|
let mut gsmtap_parser = GsmtapParser::new();
|
||||||
|
let mut pcap_file = PcapFile::new("./wavehunter.pcap").unwrap();
|
||||||
|
pcap_file.write_iface_header().unwrap();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
for msg in debug_reader.read_response()? {
|
for msg in debug_reader.read_response()? {
|
||||||
println!("msg: {:?}", msg);
|
debug!("msg: {:?}", msg);
|
||||||
|
if let Some((timestamp, gsmtap_msg)) = gsmtap_parser.recv_message(msg).unwrap() {
|
||||||
|
debug!("gsmtap_msg: {:?}", gsmtap_msg);
|
||||||
|
pcap_file.write_gsmtap_message(gsmtap_msg, timestamp).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-12
@@ -57,25 +57,23 @@ const MEMORY_DEVICE_MODE: i32 = 2;
|
|||||||
const DIAG_IOCTL_REMOTE_DEV: u32 = 32;
|
const DIAG_IOCTL_REMOTE_DEV: u32 = 32;
|
||||||
const DIAG_IOCTL_SWITCH_LOGGING: u32 = 7;
|
const DIAG_IOCTL_SWITCH_LOGGING: u32 = 7;
|
||||||
|
|
||||||
pub struct DiagDevice<'a> {
|
pub struct DiagDevice {
|
||||||
file: &'a File,
|
file: File,
|
||||||
debug_file: Option<File>,
|
debug_file: Option<File>,
|
||||||
read_buf: Vec<u8>,
|
read_buf: Vec<u8>,
|
||||||
use_mdm: i32,
|
use_mdm: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl DiagReader for DiagDevice {
|
||||||
|
|
||||||
impl<'a> DiagReader for DiagDevice<'a> {
|
|
||||||
fn get_next_messages_container(&mut self) -> DiagResult<MessagesContainer> {
|
fn get_next_messages_container(&mut self) -> DiagResult<MessagesContainer> {
|
||||||
let bytes_read = self.file.read(&mut self.read_buf).unwrap();
|
let bytes_read = self.file.read(&mut self.read_buf)?;
|
||||||
if let Some(debug_file) = self.debug_file.as_mut() {
|
if let Some(debug_file) = self.debug_file.as_mut() {
|
||||||
let debug_block = DebugFileBlock {
|
let debug_block = DebugFileBlock {
|
||||||
size: bytes_read as u32,
|
size: bytes_read as u32,
|
||||||
data: &self.read_buf[0..bytes_read],
|
data: &self.read_buf[0..bytes_read],
|
||||||
};
|
};
|
||||||
let debug_block_bytes = debug_block.to_bytes().unwrap();
|
let debug_block_bytes = debug_block.to_bytes()?;
|
||||||
debug_file.write_all(&debug_block_bytes).unwrap();
|
debug_file.write_all(&debug_block_bytes)?;
|
||||||
}
|
}
|
||||||
let ((leftover_bytes, _), container) = MessagesContainer::from_bytes((&self.read_buf[0..bytes_read], 0))?;
|
let ((leftover_bytes, _), container) = MessagesContainer::from_bytes((&self.read_buf[0..bytes_read], 0))?;
|
||||||
if leftover_bytes.len() > 0 {
|
if leftover_bytes.len() > 0 {
|
||||||
@@ -85,8 +83,12 @@ impl<'a> DiagReader for DiagDevice<'a> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> DiagDevice<'a> {
|
impl DiagDevice {
|
||||||
pub fn new(file: &'a File) -> DiagResult<Self> {
|
pub fn new() -> DiagResult<Self> {
|
||||||
|
let file = std::fs::File::options()
|
||||||
|
.read(true)
|
||||||
|
.write(true)
|
||||||
|
.open("/dev/diag")?;
|
||||||
let fd = file.as_raw_fd();
|
let fd = file.as_raw_fd();
|
||||||
|
|
||||||
enable_frame_readwrite(fd, MEMORY_DEVICE_MODE)?;
|
enable_frame_readwrite(fd, MEMORY_DEVICE_MODE)?;
|
||||||
@@ -117,8 +119,8 @@ impl<'a> DiagDevice<'a> {
|
|||||||
data_type: DataType::UserSpace,
|
data_type: DataType::UserSpace,
|
||||||
use_mdm: self.use_mdm > 0,
|
use_mdm: self.use_mdm > 0,
|
||||||
mdm_field: -1,
|
mdm_field: -1,
|
||||||
hdlc_encapsulated_request: hdlc_encapsulate(&req.to_bytes().unwrap(), &CRC_CCITT),
|
hdlc_encapsulated_request: hdlc_encapsulate(&req.to_bytes()?, &CRC_CCITT),
|
||||||
}.to_bytes().unwrap();
|
}.to_bytes()?;
|
||||||
unsafe {
|
unsafe {
|
||||||
let fd = self.file.as_raw_fd();
|
let fd = self.file.as_raw_fd();
|
||||||
let buf_ptr = buf.as_ptr() as *const libc::c_void;
|
let buf_ptr = buf.as_ptr() as *const libc::c_void;
|
||||||
|
|||||||
Reference in New Issue
Block a user