feat: added modified TCP packet parser

checksum generation code is different, to allow for
some sneaky tricks with regards to identifying the sparse
session but binding to the same port multiple times
This commit is contained in:
Andrew Rioux
2023-09-18 01:29:05 -04:00
parent 25948a17f4
commit e5f6c2aa7e
9 changed files with 137 additions and 21 deletions

View File

@@ -105,7 +105,9 @@ pub fn spawn_connection_handler(
let packet = connection_packet.pkt();
let Layer3Pkt::IPv4Pkt(ip_pkt) = packet.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
let data = udp_pkt.get_data();
@@ -198,7 +200,9 @@ fn authenticate<F: Fn()>(
use packets::*;
let p = p.pkt();
let Layer3Pkt::IPv4Pkt(ip_pkt) = p.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
let Ok(data) = conninfo.try_decrypt_and_verify(udp_pkt.get_data()) else {
counter += 1;
@@ -246,7 +250,9 @@ where
let pkt = msg.pkt();
let Layer3Pkt::IPv4Pkt(ip_pkt) = pkt.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
if ip_pkt.source_ip() != conninfo.srcip || udp_pkt.srcport() != conninfo.srcport {
continue;

View File

@@ -111,7 +111,9 @@ impl InterfaceSender {
Self::Udp(interf) => {
use packets::*;
let Layer3Pkt::IPv4Pkt(ip_pkt) = packet.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
let addr = SocketAddrV4::new(ip_pkt.dest_ip(), udp_pkt.dstport());

View File

@@ -49,7 +49,9 @@ fn main() -> anyhow::Result<()> {
let (kill_connection, kill_connection_recv) = channel::<(Ipv4Addr, u16)>();
thread::spawn(move || loop {
let Ok(packet) = recv_eth_packet.recv() else { continue };
let Ok(packet) = recv_eth_packet.recv() else {
continue;
};
if let Err(_) = interface_sender.sendpacket(packet.pkt()) {}
});
@@ -57,7 +59,9 @@ fn main() -> anyhow::Result<()> {
s.spawn({
let connections = &connections;
move || loop {
let Ok(connection) = kill_connection_recv.recv() else { continue };
let Ok(connection) = kill_connection_recv.recv() else {
continue;
};
if let Ok(mut e) = connections.lock() {
e.remove(&connection);
}
@@ -71,7 +75,9 @@ fn main() -> anyhow::Result<()> {
let pkt = pkt.pkt();
let Layer3Pkt::IPv4Pkt(ip_pkt) = pkt.get_layer3_pkt()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()?;
let Layer4Pkt::UDP(udp_pkt) = ip_pkt.get_layer4_packet()? else {
todo!()
};
let connection_handle = &(ip_pkt.dest_ip(), udp_pkt.srcport());