/// <summary> /// Compiles Data And Return Compiled byte[] /// </summary> /// <returns></returns> public byte[] Compile() { PacketWriter temporary = PacketWriter.CreateInstance(4096 * 4, m_littleEndian); //temporary.Write((short)(ns.Length + (m_IsArcheAge ? 6 : 2))); if (m_IsArcheAge) { //Серверные пакеты switch (level) { case 3: //здесь будет шифрование пакета DD03 (один пакет - World_Compressed) temporary.Write((short)(ns.Length + 4)); temporary.Write((byte)0xDD); temporary.Write((byte)level); temporary.Write((short)m_packetId); byte[] compData3 = ns.ToArray(); //получим тело пакета byte[] decompData3 = Сompressing.Decompress(compData3); temporary.Write(decompData3, 0, decompData3.Length); break; case 4: //здесь будет шифрование пакета DD04 (склеенные пакеты - World_multi_compressed) temporary.Write((short)(ns.Length + 4)); temporary.Write((byte)0xDD); temporary.Write((byte)level); temporary.Write((short)0x01); //вместо opcode, количество склеенных пакетов //len hash opcode Тело пакета //AC04 DD04 0900 CD550D6C1445147EB3BBD7BB6A2977B66ADB54A412ADD1885ECF23B6785D824448087A6A41B170A570D6682D6A6E37B097A8AB69625169281222E16C0C3F12C45A5A49688126A5058998A825FED15CD03431268A54D34862F05CDF4C776FF77AD7DE79FC4E7666DEBC79F3BDF7BDF9D93C327D8E9B7B3307F432B7A15F793A22ED39CEEB0A50453877BD3148DF6BB41866772D23DD0E637062E890B2B252EAEA63D063EF0385DEED34A6D3F7145933CC3697F326347CD4AB1CAD948E8D4353135584ACA11F2BCD8D5C4741586D3FA48C5449C309D08537B3A98C1A8D16C3326F9F4325C6009C2EE5FC71A967814035BE26969066D333D5C6EB56711D171FE802458E27E4707EAE05FA4C9ED21B95CA2B1934355745980C7A5F4DE3D4D03975D05D4841581DEB514E7AA5501F3F8D1F26D13758D4EF78D954468D468B61A93C0FE6E1830F46940B1BE492B7D909A126EA451CBE8DB55CA3994CCE1BDE512C3FDAC13F1538119BF52F8BFAF59BA88FCCAA468B61BAE271BB055A76877716CA9F77F2B790D35A49ECE2A097D7104FAEE107DC15E16385B2AF936FF637084DB84BAA08EB6E884FA715345A0CABA64187053AE20D3716C9873BF89965BE5DA70FB2A8B386FEB2CD1E3373DDE40E6B37CACD9FF08B47E741E97842C2454618E97B1A74FC5CCF0E083BCD2BB3BA2A5C1090DB76B013A22C6351BF624F0DD9F655C45CA89B2440DB13CE75E3DDE18A02B9BF83FF3EE6B2D5290C3AEB731D84F3B7133B3C54BFF6C597E4101C116ED303A0DDB611A5F8AC34670049A8A260E60DA0B616A0E5CF1A3D6CDAD10A4BE9AAEC6BCAE77B05BADA90ECEAE1ECDDD095295D05D0D55BC9AE66D105D9D794AEA6827BED09802D254B594681D08E56C0176CAA5513E7BA2BEE451C539B14C67B387DF68E2437DBCD2599485B3D69DC8CE23F68637252FF279B89A124B129C37BDB7AF9DDBCBA04607E20319A227CEFAC1ADEE900605B06465145764D8D21EBA98E0AAAE86500AAD8A5F754EBA70DABE376B6E76ED5680D719CB6D766D35480BF005C516099C01CA3ED183BA9BEC15194F52F47EFB14B8C0815D66FB17590B1EC8F0238BF03D03400C2B5CEC6F61BBC988C0680DB05AC3CC35A00DBA9BF99B4C7F847E32A5C4B75692442639FF16005DC192484CAB886F55DC528E10B862D3005C03F398BE88855DD94C9416875E198AC2F8377A7310D362FFCA2AC55A42F06D90BC73D80F3A8BCA21FB7E9E301E04C97331F01E869C1B4D094103AA107950B02ECA5BFD490690C41D8BC068764FBCFD0122775645859BF50DAF21923458EE2FCAFC616A0CCBE4FEB59673607262A363D6B4E5E1689F3CFE82FA0FC74F479785417BD9C82F8300830D6805689C457FD8E2AD25A404CE2525451EF976A4E5EE3C49D07CE9566423C969AF8CA214A7CE105CB8EFBFE507EF44BA5A7AE71E23FD5D50F0918BCFE4DBAE3D35313EFBC071792AFF3A13A1F05F63DD9ABD87CD2401FEFF184446E818D29AF68C3EDDF854FB2E9F287E5C6FD15A01AD504AC97783F38E0C3D504F5D61B1984F98CDA9A7C10E3D43C0795F62A695B1FDB53AEFA6A505B759F9FB31C542B351F522009D438A4B63B05B5CE720240AABFB5BCBAB625E158505623E3D4327A75E1D216CED97EC666A136E9AB3B1704F88D3E85D6C7E73F byte[] compData4 = ns.ToArray(); //получим тело пакета byte[] decompData4 = Сompressing.Decompress(compData4); temporary.Write(decompData4, 0, decompData4.Length); break; case 5: { //здесь будет шифрование пакета DD05 temporary.Write((short)(ns.Length + 6)); temporary.Write((byte)0xDD); temporary.Write((byte)level); //TODO: посмотреть, может по другому написать, через copy? byte[] numPck = new byte[1]; numPck[0] = NumPckSc; //вставили номер пакета в массив byte[] data = numPck.Concat(BitConverter.GetBytes((short)m_packetId)).ToArray(); //объединили с ID data = data.Concat(ns.ToArray()).ToArray(); //объединили с телом пакета byte crc8 = Encrypt.Crc8(data); //посчитали CRC пакета byte[] crc = new byte[1]; crc[0] = crc8; //вставили crc в массив data = crc.Concat(data).ToArray(); //добавили спереди контрольную сумму byte[] encrypt = Encrypt.StoCEncrypt(data); //зашифровали пакет temporary.Write(encrypt, 0, encrypt.Length); ++NumPckSc; //следующий номер шифрованного пакета DD05 break; } default: { temporary.Write((short)(ns.Length + 4)); temporary.Write((byte)0xDD); temporary.Write((byte)level); temporary.Write((short)m_packetId); byte[] redata = ns.ToArray(); temporary.Write(redata, 0, redata.Length); break; } } } else { temporary.Write((short)(ns.Length + 2)); temporary.Write((short)m_packetId); byte[] redata = ns.ToArray(); temporary.Write(redata, 0, redata.Length); } PacketWriter.ReleaseInstance(ns); ns = null; byte[] compiled = temporary.ToArray(); PacketWriter.ReleaseInstance(temporary); temporary = null; return(compiled); }
public override void HandleReceived(byte[] data) { PacketReader reader = new PacketReader(data, 0); //reader.Offset += 1; //Undefined Random Byte byte seq = reader.ReadByte(); byte header = reader.ReadByte(); //Packet Level reader.Offset -= 2; //вернемся назад ushort ls = reader.ReadLEUInt16(); //Packet Level+seq ushort opcode = reader.ReadLEUInt16(); //Packet Opcode //обрабатываем пакеты от клиента //len seq header opcode Тело пакета //8200 00 01 0000 B10A4050184653CA705... switch (ls) { case 0x03: byte[] compData3 = new byte[data.Length - 4]; Buffer.BlockCopy(data, 4, compData3, 0, data.Length - 4); //получим тело пакета byte[] decompData3 = Сompressing.Decompress(compData3); //разжимаем пакет Buffer.BlockCopy(decompData3, 0, data, 0, decompData3.Length); //получим тело пакета reader = new PacketReader(decompData3, 0); break; case 0x04: byte[] compData4 = new byte[data.Length - 4]; Buffer.BlockCopy(data, 4, compData4, 0, data.Length - 4); //получим тело пакета byte[] decompData4 = Сompressing.Decompress(compData4); //разжимаем пакет Buffer.BlockCopy(decompData4, 0, data, 0, decompData4.Length); //получим тело пакета reader = new PacketReader(decompData4, 0); break; case 0x05: reader.Offset -= 2; //вернемся к hash, count byte hash = reader.ReadByte(); //считываем hash или CRC (он не меняется) byte count = reader.ReadByte(); //считываем count (шифрован, меняется) //------------------------------ //потом switch уберем switch (hash) { case 0x33: opcode = 0x008E; //вход в игру5 break; case 0x34: opcode = 0x0088; //пакет на релогин из лобби break; //case 0x35: // opcode = 0x0088; //пакет на релогин из игры // break; case 0x36: opcode = 0x008F; //вход в игру6 break; case 0x37: opcode = 0x008B; //вход в игру2 break; case 0x38: opcode = 0x008A; //вход в игру1 break; case 0x39: opcode = 0x008C; //вход в игру3 break; case 0x3F: opcode = 0x008D; //вход в игру4 break; default: break; //------------------------------ //здесь распаковка пакетов от клиента //здесь будет расшифровка пакета 0005 ////пробуем расшифровать ////byte[] ciphertext = new byte[] {0x13, 0x00, 0x00, 0x05, 0x39, 0x96, 0x41, 0x57, 0x3F, 0x2C, 0xEF, 0x75, 0x3E, 0xC8, 0xC1, 0x75, 0xB5, 0xD2, 0x10, 0x43, 0x62}; //var pck = new CtoSDecrypt(); //var size = BitConverter.GetBytes((short) data.Length); //data = size.Concat(data).ToArray(); //объединили с Size //var ciphertext = Encrypt.CtoSEncrypt(data); //Logger.Trace("EncodeXOR: " + Utility.ByteArrayToString(ciphertext)); //var plaintext = pck.DecryptAes2(ciphertext); //Logger.Trace("EncodeAES: " + Utility.ByteArrayToString(plaintext)); ////"13 00 00 05" потеряли ////"16 42|50 00 01 00|D7 94 01 00|3D A5 00 00|A4 3E A5" получили ////reader.Offset += 2; //пропускаем hash&count //Buffer.BlockCopy(plaintext, 2, data, 0, 2); //reader.ReadLEUInt16(); //Packet Opcode //opcode = (ushort) BitConverter.ToInt16(plaintext, 2); } break; default: break; } if (!DelegateList.ClientHandlers.ContainsKey(header)) { Logger.Trace("DelegateList: Received undefined packet - seq: {0}, header: {1}, opcode: 0x{2:X2}", seq, header, opcode); return; } try { PacketHandler <ClientConnection> handler = DelegateList.ClientHandlers[header][opcode]; if (handler != null) { handler.OnReceive(this, reader); } else { Logger.Trace("OnReceive: Received undefined packet - seq: {0}, header: {1}, opcode: 0x{2:X2}", seq, header, opcode); } } catch (Exception ex) { Logger.Trace("Exception: Received undefined packet - seq: {0}, header: {1}, opcode: 0x{2:X2} : {3}", seq, header, opcode, ex.Message); throw; } }