Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Linq;
- class Packet
- {
- private UInt16 header;
- private UInt16 length;
- private byte[] data;
- public Packet(byte[] data)
- {
- this.data = data;
- }
- public void Parse()
- {
- Console.WriteLine("Raw Data: " + TcpEchoServer.nicePacketString(this.data));
- bool encrypted = false;
- if (this.data.Length < 4)
- return;
- if (BitConverter.IsLittleEndian)
- {
- this.length = BitConverter.ToUInt16(data, 0);
- }
- else
- throw new NotImplementedException();
- if (this.length > 8908)
- {
- this.length = Convert.ToUInt16(this.length & 0x7FFF);
- encrypted = true;
- }
- if(this.data.Length - 2 < this.length + 2)
- {
- Console.WriteLine("Invalid Length:" + (this.data.Length - 2) + "/" + (this.length + 2));
- return;
- }
- byte[] content = this.data.Skip(2).Take(this.length).ToArray();
- if (encrypted)
- {
- content = this.Decrypt(content);
- }
- this.Read(content);
- }
- public byte[] Decrypt(byte[] data)
- {
- //Console.WriteLine("Decrypting Data (Length: " + this.length + ")");
- byte lastElement = data[data.Length - 1];
- for (int i = data.Length - 1; i > 0; i--)
- {
- data[i] = (byte)(((data[i - 1] & 0xFF) << (8 - GetShift())) | ((data[i] & 0xFF) >> GetShift()));
- }
- data[0] = (byte)((lastElement << (8 - GetShift())) | ((data[0] & 0xFF) >> GetShift()));
- return data;
- }
- public void Read(byte[] data)
- {
- this.header = BitConverter.ToUInt16(data.Take(2).ToArray(), 0);
- Console.WriteLine("ID: " + this.header + " => " + TcpEchoServer.nicePacketString(data));
- TcpEchoServer.writePacketToFile(data);
- }
- private int GetShift()
- {
- return ((29891) % 7) + 1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement