diff --git a/.gitignore b/.gitignore index 9a9b355..f122054 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ /target .idea/ config.json -packet.bin -outpacket.bin +*.bin diff --git a/src/encryption.rs b/src/encryption.rs index 7b9b04b..e204cb1 100644 --- a/src/encryption.rs +++ b/src/encryption.rs @@ -1,4 +1,5 @@ use std::io::Cursor; +use std::fs::write; use binrw::{BinRead, BinResult}; use physis::blowfish::Blowfish; @@ -40,15 +41,19 @@ where panic!("This segment type is encrypted and no key was provided!"); }; - let size = size - 16; // 16 = header size + let size = size - (std::mem::size_of::() * 4) as u32; // 16 = header size let mut data = Vec::new(); data.resize(size as usize, 0x0); reader.read_exact(&mut data)?; + write("encrypted.bin", &data); + let blowfish = Blowfish::new(encryption_key); let decrypted_data = blowfish.decrypt(&data).unwrap(); + write("decrypted.bin", &decrypted_data); + let mut cursor = Cursor::new(&decrypted_data); T::read_options(&mut cursor, endian, ()) } diff --git a/src/packet.rs b/src/packet.rs index bc02ead..cd35972 100644 --- a/src/packet.rs +++ b/src/packet.rs @@ -39,7 +39,9 @@ enum ConnectionType { #[binrw] #[derive(Debug, Clone)] struct IPCSegment { - unk: u32, + unk1: u8, + unk2: u8, + op_code: u8, } #[binrw] @@ -142,8 +144,8 @@ async fn send_packet(socket: &mut WriteHalf, segments: &[PacketSegmen } let header = PacketHeader { - unk1: 0, - unk2: 0, + unk1: 0xE2465DFF41A05252, // wtf? + unk2: 0x75C4997B4D642A7F, // wtf? x2 timestamp, size: std::mem::size_of::() as u32 + total_segment_size, connection_type: ConnectionType::Lobby, @@ -202,9 +204,11 @@ pub async fn parse_packet(socket: &mut WriteHalf, data: &[u8], state: state.client_key = Some(generate_encryption_key(key, phrase)); let blowfish = Blowfish::new(&state.client_key.unwrap()); - let mut data = blowfish.encrypt(&0xE0003C2Au32.to_le_bytes()).unwrap(); + let mut data = 0xE0003C2Au32.to_le_bytes().to_vec(); data.resize(0x280, 0); + let data = blowfish.encrypt(&data).unwrap(); + let response_packet = PacketSegment { source_actor: 0, target_actor: 0,