mirror of
				https://bitbucket.org/Ioncannon/project-meteor-server.git
				synced 2025-05-20 08:26:59 -04:00 
			
		
		
		
	Reimplemented ConsoleColor for packets in NLog.
This commit is contained in:
		| @@ -1,16 +1,17 @@ | ||||
| <?xml version="1.0" encoding="utf-8" ?> | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
|  | ||||
| <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" | ||||
|       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|       xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" | ||||
|       autoReload="true" | ||||
|       throwExceptions="false" | ||||
|       internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" > | ||||
|       internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"> | ||||
|  | ||||
|  | ||||
|   <!-- optional, add some variabeles | ||||
|   https://github.com/nlog/NLog/wiki/Configuration-file#variables | ||||
|   --> | ||||
|   <variable name="myvar" value="myvalue"/> | ||||
|   <variable name="myvar" value="myvalue" /> | ||||
|  | ||||
|   <!--  | ||||
|   See https://github.com/nlog/nlog/wiki/Configuration-file  | ||||
| @@ -23,24 +24,33 @@ | ||||
|     See https://github.com/nlog/NLog/wiki/Targets for possible targets. | ||||
|     See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers. | ||||
|     --> | ||||
|        | ||||
|  | ||||
|     <!-- | ||||
|     Write events to a file with the date in the filename.  | ||||
|     <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" | ||||
|             layout="${longdate} ${uppercase:${level}} ${message}" /> | ||||
|     --> | ||||
|       <!--<target xsi:type="ColoredConsole" name="console" layout="[${longdate}] [${uppercase:${level}}] ${message}" />--> | ||||
|       <target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}/map.log" layout="[${longdate}] [${uppercase:${level}}] ${message}"/> | ||||
|       <target xsi:type="ColoredConsole" name="console" layout="[${longdate}] [${uppercase:${level}}] ${message}"> | ||||
|           <highlight-row condition="equals('${logger}','FFXIVClassic_Map_Server.packets.BasePacket') and equals('${event-context:item=color}','5')" foregroundColor="White" backgroundColor="Yellow" /> | ||||
|           <highlight-row condition="equals('${logger}','FFXIVClassic_Map_Server.packets.SubPacket') and equals('${event-context:item=color}','5')" foregroundColor="White" backgroundColor="DarkMagenta" /> | ||||
|       </target> | ||||
|     <!--<target xsi:type="ColoredConsole" name="console" layout="[${longdate}] [${uppercase:${level}}] ${message}" />--> | ||||
|     <target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}/map.log" | ||||
|             layout="[${date:format=MM/dd/yyyy HH\:mm\:ss}][${uppercase:${level}}]${message}" /> | ||||
|     <target xsi:type="ColoredConsole" name="console" | ||||
|             layout="[${date:format=MM/dd/yyyy HH\:mm\:ss}][${uppercase:${level}}]${message}"> | ||||
|       <highlight-row | ||||
|         condition="equals('${logger}', 'FFXIVClassic_Map_Server.packets.BasePacket') and equals('${event-context:item=color}', '6')" | ||||
|         backgroundColor="DarkYellow" foregroundColor="NoChange" /> | ||||
|       <highlight-row | ||||
|         condition="equals('${logger}', 'FFXIVClassic_Map_Server.packets.SubPacket') and equals('${event-context:item=color}', '4')" | ||||
|         backgroundColor="DarkRed" foregroundColor="NoChange" /> | ||||
|       <highlight-row | ||||
|         condition="equals('${logger}', 'FFXIVClassic_Map_Server.packets.SubPacket') and equals('${event-context:item=color}', '5')" | ||||
|         backgroundColor="DarkMagenta" foregroundColor="NoChange" /> | ||||
|     </target> | ||||
|   </targets> | ||||
|  | ||||
|   <rules> | ||||
|     <!-- add your logging rules here --> | ||||
|       <logger name='*' minlevel='Trace' writeTo='file' /> | ||||
|       <logger name='*' minlevel='Trace' writeTo='console' /> | ||||
|     <logger name='*' minlevel='Trace' writeTo='file' /> | ||||
|     <logger name='*' minlevel='Trace' writeTo='console' /> | ||||
|     <!-- | ||||
|     Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f" | ||||
|     <logger name="*" minlevel="Debug" writeTo="f" /> | ||||
|   | ||||
| @@ -1,47 +1,43 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Runtime.InteropServices; | ||||
| using System.Diagnostics; | ||||
| using System.IO; | ||||
| using FFXIVClassic.Common; | ||||
| using NLog; | ||||
| using System.Runtime.InteropServices; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.packets | ||||
| { | ||||
|  | ||||
|     [StructLayout(LayoutKind.Sequential)] | ||||
|     public struct BasePacketHeader | ||||
|     { | ||||
|         public byte         isAuthenticated; | ||||
|         public byte         isCompressed; | ||||
|         public ushort       connectionType; | ||||
|         public ushort       packetSize; | ||||
|         public ushort       numSubpackets; | ||||
|         public ulong        timestamp; //Miliseconds | ||||
|         public byte isAuthenticated; | ||||
|         public byte isCompressed; | ||||
|         public ushort connectionType; | ||||
|         public ushort packetSize; | ||||
|         public ushort numSubpackets; | ||||
|         public ulong timestamp; //Miliseconds | ||||
|     } | ||||
|  | ||||
|     public class BasePacket | ||||
|     public class BasePacket | ||||
|     { | ||||
|         public static Logger Log = LogManager.GetCurrentClassLogger(); | ||||
|  | ||||
|         public const int TYPE_ZONE = 1; | ||||
|         public const int TYPE_CHAT = 2; | ||||
|         public const int BASEPACKET_SIZE = 0x10; | ||||
|         private static readonly Logger logger = LogManager.GetCurrentClassLogger(); | ||||
|         public byte[] data; | ||||
|  | ||||
|         public BasePacketHeader header; | ||||
|         public byte[]           data; | ||||
|  | ||||
|         //Loads a sniffed packet from a file | ||||
|         public unsafe BasePacket(String path) | ||||
|         public unsafe BasePacket(string path) | ||||
|         { | ||||
|             byte[] bytes = File.ReadAllBytes(path); | ||||
|             var bytes = File.ReadAllBytes(path); | ||||
|  | ||||
|             if (bytes.Length < BASEPACKET_SIZE) | ||||
|                 throw new OverflowException("Packet Error: Packet was too small"); | ||||
|  | ||||
|             fixed (byte* pdata = &bytes[0]) | ||||
|             { | ||||
|                 header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); | ||||
|                 header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); | ||||
|             } | ||||
|  | ||||
|             if (bytes.Length < header.packetSize) | ||||
| @@ -66,7 +62,7 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|             fixed (byte* pdata = &bytes[0]) | ||||
|             { | ||||
|                 header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); | ||||
|                 header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); | ||||
|             } | ||||
|  | ||||
|             if (bytes.Length < header.packetSize) | ||||
| @@ -75,7 +71,7 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|             int packetSize = header.packetSize; | ||||
|  | ||||
|             data = new byte[packetSize - BASEPACKET_SIZE]; | ||||
|             Array.Copy(bytes, BASEPACKET_SIZE, data, 0, packetSize - BASEPACKET_SIZE);          | ||||
|             Array.Copy(bytes, BASEPACKET_SIZE, data, 0, packetSize - BASEPACKET_SIZE); | ||||
|         } | ||||
|  | ||||
|         public unsafe BasePacket(byte[] bytes, ref int offset) | ||||
| @@ -85,13 +81,13 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|             fixed (byte* pdata = &bytes[offset]) | ||||
|             { | ||||
|                 header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); | ||||
|                 header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); | ||||
|             } | ||||
|  | ||||
|             int packetSize = header.packetSize; | ||||
|  | ||||
|             if (bytes.Length < offset + header.packetSize) | ||||
|                 throw new OverflowException("Packet Error: Packet size didn't equal given size");             | ||||
|                 throw new OverflowException("Packet Error: Packet size didn't equal given size"); | ||||
|  | ||||
|             data = new byte[packetSize - BASEPACKET_SIZE]; | ||||
|             Array.Copy(bytes, offset + BASEPACKET_SIZE, data, 0, packetSize - BASEPACKET_SIZE); | ||||
| @@ -100,24 +96,24 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|         } | ||||
|  | ||||
|         public BasePacket(BasePacketHeader header, byte[] data) | ||||
|         {          | ||||
|         { | ||||
|             this.header = header; | ||||
|             this.data = data; | ||||
|         } | ||||
|  | ||||
|         public List<SubPacket> GetSubpackets() | ||||
|         { | ||||
|             List<SubPacket> subpackets = new List<SubPacket>(header.numSubpackets); | ||||
|             var subpackets = new List<SubPacket>(header.numSubpackets); | ||||
|  | ||||
|             int offset = 0; | ||||
|             var offset = 0; | ||||
|  | ||||
|             while (offset < data.Length) | ||||
|                 subpackets.Add(new SubPacket(data, ref offset));             | ||||
|                 subpackets.Add(new SubPacket(data, ref offset)); | ||||
|  | ||||
|             return subpackets; | ||||
|         } | ||||
|  | ||||
|         public unsafe static BasePacketHeader GetHeader(byte[] bytes) | ||||
|         public static unsafe BasePacketHeader GetHeader(byte[] bytes) | ||||
|         { | ||||
|             BasePacketHeader header; | ||||
|             if (bytes.Length < BASEPACKET_SIZE) | ||||
| @@ -125,7 +121,7 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|             fixed (byte* pdata = &bytes[0]) | ||||
|             { | ||||
|                 header = (BasePacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); | ||||
|                 header = (BasePacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(BasePacketHeader)); | ||||
|             } | ||||
|  | ||||
|             return header; | ||||
| @@ -133,10 +129,10 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|         public byte[] GetHeaderBytes() | ||||
|         { | ||||
|             int size = Marshal.SizeOf(header); | ||||
|             byte[] arr = new byte[size]; | ||||
|             var size = Marshal.SizeOf(header); | ||||
|             var arr = new byte[size]; | ||||
|  | ||||
|             IntPtr ptr = Marshal.AllocHGlobal(size); | ||||
|             var ptr = Marshal.AllocHGlobal(size); | ||||
|             Marshal.StructureToPtr(header, ptr, true); | ||||
|             Marshal.Copy(ptr, arr, 0, size); | ||||
|             Marshal.FreeHGlobal(ptr); | ||||
| @@ -145,7 +141,7 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|         public byte[] GetPacketBytes() | ||||
|         { | ||||
|             byte[] outBytes = new byte[header.packetSize]; | ||||
|             var outBytes = new byte[header.packetSize]; | ||||
|             Array.Copy(GetHeaderBytes(), 0, outBytes, 0, BASEPACKET_SIZE); | ||||
|             Array.Copy(data, 0, outBytes, BASEPACKET_SIZE, data.Length); | ||||
|             return outBytes; | ||||
| @@ -154,16 +150,18 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|         //Replaces all instances of the sniffed actorID with the given one | ||||
|         public void ReplaceActorID(uint actorID) | ||||
|         { | ||||
|             using (MemoryStream mem = new MemoryStream(data)) | ||||
|             using (var mem = new MemoryStream(data)) | ||||
|             { | ||||
|                 using (BinaryWriter binWriter = new BinaryWriter(mem)) | ||||
|                 using (var binWriter = new BinaryWriter(mem)) | ||||
|                 { | ||||
|                     using (BinaryReader binreader = new BinaryReader(mem)) | ||||
|                     using (var binreader = new BinaryReader(mem)) | ||||
|                     { | ||||
|                         while (binreader.BaseStream.Position + 4 < data.Length) | ||||
|                         { | ||||
|                             uint read = binreader.ReadUInt32(); | ||||
|                             if (read == 0x029B2941 || read == 0x02977DC7 || read == 0x0297D2C8 || read == 0x0230d573 || read == 0x23317df || read == 0x23344a3 || read == 0x1730bdb || read == 0x6c) //Original ID | ||||
|                             var read = binreader.ReadUInt32(); | ||||
|                             if (read == 0x029B2941 || read == 0x02977DC7 || read == 0x0297D2C8 || read == 0x0230d573 || | ||||
|                                 read == 0x23317df || read == 0x23344a3 || read == 0x1730bdb || read == 0x6c) | ||||
|                                 //Original ID | ||||
|                             { | ||||
|                                 binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin); | ||||
|                                 binWriter.Write(actorID); | ||||
| @@ -177,15 +175,15 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|         //Replaces all instances of the sniffed actorID with the given one | ||||
|         public void ReplaceActorID(uint fromActorID, uint actorID) | ||||
|         { | ||||
|             using (MemoryStream mem = new MemoryStream(data)) | ||||
|             using (var mem = new MemoryStream(data)) | ||||
|             { | ||||
|                 using (BinaryWriter binWriter = new BinaryWriter(mem)) | ||||
|                 using (var binWriter = new BinaryWriter(mem)) | ||||
|                 { | ||||
|                     using (BinaryReader binreader = new BinaryReader(mem)) | ||||
|                     using (var binreader = new BinaryReader(mem)) | ||||
|                     { | ||||
|                         while (binreader.BaseStream.Position + 4 < data.Length) | ||||
|                         { | ||||
|                             uint read = binreader.ReadUInt32(); | ||||
|                             var read = binreader.ReadUInt32(); | ||||
|                             if (read == fromActorID) //Original ID | ||||
|                             { | ||||
|                                 binWriter.BaseStream.Seek(binreader.BaseStream.Position - 0x4, SeekOrigin.Begin); | ||||
| @@ -197,49 +195,65 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public void DebugPrintPacket() | ||||
|         { | ||||
| #if DEBUG | ||||
|             logger.ColorDebug( | ||||
|                 string.Format("IsAuth:{0} IsEncrypted:{1}, Size:0x{2:X}, NumSubpackets:{3}{4}{5}", | ||||
|                     header.isAuthenticated, header.isCompressed, header.packetSize, header.numSubpackets, | ||||
|                     Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes())), ConsoleOutputColor.DarkYellow); | ||||
|  | ||||
|             foreach (var sub in GetSubpackets()) | ||||
|             { | ||||
|                 sub.DebugPrintSubPacket(); | ||||
|             } | ||||
| #endif | ||||
|         } | ||||
|  | ||||
|         #region Utility Functions | ||||
|  | ||||
|         public static BasePacket CreatePacket(List<SubPacket> subpackets, bool isAuthed, bool isCompressed) | ||||
|         { | ||||
|             //Create Header | ||||
|             BasePacketHeader header = new BasePacketHeader(); | ||||
|             var header = new BasePacketHeader(); | ||||
|             byte[] data = null; | ||||
|  | ||||
|             header.isAuthenticated = isAuthed?(byte)1:(byte)0; | ||||
|             header.isCompressed = isCompressed?(byte)1:(byte)0; | ||||
|             header.numSubpackets = (ushort)subpackets.Count; | ||||
|             header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0; | ||||
|             header.isCompressed = isCompressed ? (byte) 1 : (byte) 0; | ||||
|             header.numSubpackets = (ushort) subpackets.Count; | ||||
|             header.packetSize = BASEPACKET_SIZE; | ||||
|             header.timestamp = Utils.MilisUnixTimeStampUTC(); | ||||
|  | ||||
|             //Get packet size | ||||
|             foreach (SubPacket subpacket in subpackets) | ||||
|             foreach (var subpacket in subpackets) | ||||
|                 header.packetSize += subpacket.header.subpacketSize; | ||||
|  | ||||
|             data = new byte[header.packetSize-0x10]; | ||||
|             data = new byte[header.packetSize - 0x10]; | ||||
|  | ||||
|             //Add Subpackets | ||||
|             int offset = 0; | ||||
|             foreach (SubPacket subpacket in subpackets) | ||||
|             var offset = 0; | ||||
|             foreach (var subpacket in subpackets) | ||||
|             { | ||||
|                 byte[] subpacketData = subpacket.GetBytes(); | ||||
|                 var subpacketData = subpacket.GetBytes(); | ||||
|                 Array.Copy(subpacketData, 0, data, offset, subpacketData.Length); | ||||
|                 offset += (ushort)subpacketData.Length; | ||||
|                 offset += (ushort) subpacketData.Length; | ||||
|             } | ||||
|  | ||||
|             Debug.Assert(data != null && offset == data.Length && header.packetSize == 0x10 + offset); | ||||
|  | ||||
|             BasePacket packet = new BasePacket(header, data); | ||||
|             var packet = new BasePacket(header, data); | ||||
|             return packet; | ||||
|         } | ||||
|  | ||||
|         public static BasePacket CreatePacket(SubPacket subpacket, bool isAuthed, bool isCompressed) | ||||
|         { | ||||
|             //Create Header | ||||
|             BasePacketHeader header = new BasePacketHeader(); | ||||
|             var header = new BasePacketHeader(); | ||||
|             byte[] data = null; | ||||
|  | ||||
|             header.isAuthenticated = isAuthed ? (byte)1 : (byte)0; | ||||
|             header.isCompressed = isCompressed ? (byte)1 : (byte)0; | ||||
|             header.numSubpackets = (ushort)1; | ||||
|             header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0; | ||||
|             header.isCompressed = isCompressed ? (byte) 1 : (byte) 0; | ||||
|             header.numSubpackets = 1; | ||||
|             header.packetSize = BASEPACKET_SIZE; | ||||
|             header.timestamp = Utils.MilisUnixTimeStampUTC(); | ||||
|  | ||||
| @@ -249,68 +263,41 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|             data = new byte[header.packetSize - 0x10]; | ||||
|  | ||||
|             //Add Subpackets | ||||
|             byte[] subpacketData = subpacket.GetBytes(); | ||||
|             Array.Copy(subpacketData, 0, data, 0, subpacketData.Length);             | ||||
|             var subpacketData = subpacket.GetBytes(); | ||||
|             Array.Copy(subpacketData, 0, data, 0, subpacketData.Length); | ||||
|  | ||||
|             Debug.Assert(data != null); | ||||
|  | ||||
|             BasePacket packet = new BasePacket(header, data); | ||||
|             var packet = new BasePacket(header, data); | ||||
|             return packet; | ||||
|         } | ||||
|  | ||||
|         public static BasePacket CreatePacket(byte[] data, bool isAuthed, bool isCompressed) | ||||
|         { | ||||
|  | ||||
|             Debug.Assert(data != null); | ||||
|  | ||||
|             //Create Header | ||||
|             BasePacketHeader header = new BasePacketHeader(); | ||||
|             var header = new BasePacketHeader(); | ||||
|  | ||||
|             header.isAuthenticated = isAuthed ? (byte)1 : (byte)0; | ||||
|             header.isCompressed = isCompressed ? (byte)1 : (byte)0; | ||||
|             header.numSubpackets = (ushort)1; | ||||
|             header.isAuthenticated = isAuthed ? (byte) 1 : (byte) 0; | ||||
|             header.isCompressed = isCompressed ? (byte) 1 : (byte) 0; | ||||
|             header.numSubpackets = 1; | ||||
|             header.packetSize = BASEPACKET_SIZE; | ||||
|             header.timestamp = Utils.MilisUnixTimeStampUTC(); | ||||
|  | ||||
|             //Get packet size | ||||
|             header.packetSize += (ushort)data.Length;           | ||||
|             header.packetSize += (ushort) data.Length; | ||||
|  | ||||
|             BasePacket packet = new BasePacket(header, data); | ||||
|             var packet = new BasePacket(header, data); | ||||
|             return packet; | ||||
|         } | ||||
|  | ||||
|         public static unsafe void EncryptPacket(Blowfish blowfish, BasePacket packet) | ||||
|         { | ||||
|             byte[] data = packet.data; | ||||
|             var data = packet.data; | ||||
|             int size = packet.header.packetSize; | ||||
|  | ||||
|             int offset = 0; | ||||
|             while (offset < data.Length) {  | ||||
|                 if (data.Length < offset + SubPacket.SUBPACKET_SIZE) | ||||
|                     throw new OverflowException("Packet Error: Subpacket was too small"); | ||||
|  | ||||
|                 SubPacketHeader header; | ||||
|                 fixed (byte* pdata = &data[offset]) | ||||
|                 { | ||||
|                     header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); | ||||
|                 } | ||||
|  | ||||
|                 if (data.Length < offset + header.subpacketSize) | ||||
|                     throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data"); | ||||
|  | ||||
|                 blowfish.Encipher(data, offset + 0x10, header.subpacketSize-0x10); | ||||
|  | ||||
|                 offset += header.subpacketSize; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         public static unsafe void DecryptPacket(Blowfish blowfish, ref BasePacket packet) | ||||
|         { | ||||
|             byte[] data = packet.data; | ||||
|             int size = packet.header.packetSize; | ||||
|  | ||||
|             int offset = 0; | ||||
|             var offset = 0; | ||||
|             while (offset < data.Length) | ||||
|             { | ||||
|                 if (data.Length < offset + SubPacket.SUBPACKET_SIZE) | ||||
| @@ -319,35 +306,54 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|                 SubPacketHeader header; | ||||
|                 fixed (byte* pdata = &data[offset]) | ||||
|                 { | ||||
|                     header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); | ||||
|                     header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); | ||||
|                 } | ||||
|  | ||||
|                 if (data.Length < offset + header.subpacketSize) | ||||
|                     throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data"); | ||||
|  | ||||
|                 blowfish.Decipher(data, offset + 0x10, header.subpacketSize-0x10); | ||||
|                 blowfish.Encipher(data, offset + 0x10, header.subpacketSize - 0x10); | ||||
|  | ||||
|                 offset += header.subpacketSize; | ||||
|             } | ||||
|         } | ||||
|         #endregion | ||||
|  | ||||
|         public void DebugPrintPacket() | ||||
|         public static unsafe void DecryptPacket(Blowfish blowfish, ref BasePacket packet) | ||||
|         { | ||||
| #if DEBUG | ||||
|             // todo: create new target for colourful packet logging | ||||
|             //Console.BackgroundColor = ConsoleColor.DarkYellow; | ||||
|             var data = packet.data; | ||||
|             int size = packet.header.packetSize; | ||||
|  | ||||
|             Log.Debug("IsAuth: {0} IsEncrypted: {1}, Size: 0x{2:X}, NumSubpackets: {3}{4}{5}", header.isAuthenticated, header.isCompressed, header.packetSize, header.numSubpackets, Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes())); | ||||
|  | ||||
|             foreach (SubPacket sub in GetSubpackets()) | ||||
|             var offset = 0; | ||||
|             while (offset < data.Length) | ||||
|             { | ||||
|                 sub.DebugPrintSubPacket(); | ||||
|             } | ||||
|                 if (data.Length < offset + SubPacket.SUBPACKET_SIZE) | ||||
|                     throw new OverflowException("Packet Error: Subpacket was too small"); | ||||
|  | ||||
|             //Console.BackgroundColor = ConsoleColor.Black; | ||||
| #endif | ||||
|                 SubPacketHeader header; | ||||
|                 fixed (byte* pdata = &data[offset]) | ||||
|                 { | ||||
|                     header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); | ||||
|                 } | ||||
|  | ||||
|                 if (data.Length < offset + header.subpacketSize) | ||||
|                     throw new OverflowException("Packet Error: Subpacket size didn't equal subpacket data"); | ||||
|  | ||||
|                 blowfish.Decipher(data, offset + 0x10, header.subpacketSize - 0x10); | ||||
|  | ||||
|                 offset += header.subpacketSize; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         #endregion | ||||
|     } | ||||
| } | ||||
|  | ||||
|     public static class LoggerExtensions | ||||
|     { | ||||
|         public static void ColorDebug(this Logger logger, string message, ConsoleOutputColor color) | ||||
|         { | ||||
|             var logEvent = new LogEventInfo(LogLevel.Debug, logger.Name, message); | ||||
|             logEvent.Properties["color"] = (int) color; | ||||
|             logger.Log(logEvent); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,39 +1,37 @@ | ||||
| using System; | ||||
| using System.Runtime.InteropServices; | ||||
| using FFXIVClassic.Common; | ||||
| using NLog; | ||||
|  | ||||
| namespace FFXIVClassic_Map_Server.packets | ||||
| { | ||||
|     [StructLayout(LayoutKind.Sequential)] | ||||
|     public struct SubPacketHeader | ||||
|     { | ||||
|         public ushort       subpacketSize; | ||||
|         public ushort       type; | ||||
|         public uint         sourceId;  | ||||
|         public uint         targetId; | ||||
|         public uint         unknown1; | ||||
|         public ushort subpacketSize; | ||||
|         public ushort type; | ||||
|         public uint sourceId; | ||||
|         public uint targetId; | ||||
|         public uint unknown1; | ||||
|     } | ||||
|  | ||||
|     [StructLayout(LayoutKind.Sequential)] | ||||
|     public struct GameMessageHeader | ||||
|     { | ||||
|         public ushort       unknown4; //Always 0x14 | ||||
|         public ushort       opcode; | ||||
|         public uint         unknown5;  | ||||
|         public uint         timestamp; | ||||
|         public uint         unknown6; | ||||
|         public ushort unknown4; //Always 0x14 | ||||
|         public ushort opcode; | ||||
|         public uint unknown5; | ||||
|         public uint timestamp; | ||||
|         public uint unknown6; | ||||
|     } | ||||
|  | ||||
|     public class SubPacket | ||||
|     { | ||||
|         public static Logger Log = LogManager.GetCurrentClassLogger(); | ||||
|         public const int SUBPACKET_SIZE = 0x10; | ||||
|         public const int GAMEMESSAGE_SIZE = 0x10; | ||||
|  | ||||
|         public SubPacketHeader  header; | ||||
|         private static readonly Logger logger = LogManager.GetCurrentClassLogger(); | ||||
|         public byte[] data; | ||||
|         public GameMessageHeader gameMessage; | ||||
|         public byte[]           data; | ||||
|  | ||||
|         public SubPacketHeader header; | ||||
|  | ||||
|         public unsafe SubPacket(byte[] bytes, ref int offset) | ||||
|         { | ||||
| @@ -42,14 +40,15 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|             fixed (byte* pdata = &bytes[offset]) | ||||
|             { | ||||
|                 header = (SubPacketHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); | ||||
|                 header = (SubPacketHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(SubPacketHeader)); | ||||
|             } | ||||
|  | ||||
|             if (header.type == 0x3) | ||||
|             { | ||||
|                 fixed (byte* pdata = &bytes[offset + SUBPACKET_SIZE]) | ||||
|                 { | ||||
|                     gameMessage = (GameMessageHeader)Marshal.PtrToStructure(new IntPtr(pdata), typeof(GameMessageHeader)); | ||||
|                     gameMessage = | ||||
|                         (GameMessageHeader) Marshal.PtrToStructure(new IntPtr(pdata), typeof(GameMessageHeader)); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| @@ -72,8 +71,8 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|         public SubPacket(ushort opcode, uint sourceId, uint targetId, byte[] data) | ||||
|         { | ||||
|             this.header = new SubPacketHeader(); | ||||
|             this.gameMessage = new GameMessageHeader(); | ||||
|             header = new SubPacketHeader(); | ||||
|             gameMessage = new GameMessageHeader(); | ||||
|  | ||||
|             gameMessage.opcode = opcode; | ||||
|             header.sourceId = sourceId; | ||||
| @@ -89,13 +88,13 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|             this.data = data; | ||||
|  | ||||
|             header.subpacketSize = (ushort)(SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length); | ||||
|             header.subpacketSize = (ushort) (SUBPACKET_SIZE + GAMEMESSAGE_SIZE + data.Length); | ||||
|         } | ||||
|  | ||||
|         public SubPacket(SubPacket original, uint newTargetId) | ||||
|         { | ||||
|             this.header = new SubPacketHeader(); | ||||
|             this.gameMessage = original.gameMessage; | ||||
|             header = new SubPacketHeader(); | ||||
|             gameMessage = original.gameMessage; | ||||
|             header.subpacketSize = original.header.subpacketSize; | ||||
|             header.type = original.header.type; | ||||
|             header.sourceId = original.header.sourceId; | ||||
| @@ -105,10 +104,10 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|         public byte[] GetHeaderBytes() | ||||
|         { | ||||
|             int size = Marshal.SizeOf(header); | ||||
|             byte[] arr = new byte[size]; | ||||
|             var size = Marshal.SizeOf(header); | ||||
|             var arr = new byte[size]; | ||||
|  | ||||
|             IntPtr ptr = Marshal.AllocHGlobal(size); | ||||
|             var ptr = Marshal.AllocHGlobal(size); | ||||
|             Marshal.StructureToPtr(header, ptr, true); | ||||
|             Marshal.Copy(ptr, arr, 0, size); | ||||
|             Marshal.FreeHGlobal(ptr); | ||||
| @@ -117,10 +116,10 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|         public byte[] GetGameMessageBytes() | ||||
|         { | ||||
|             int size = Marshal.SizeOf(gameMessage); | ||||
|             byte[] arr = new byte[size]; | ||||
|             var size = Marshal.SizeOf(gameMessage); | ||||
|             var arr = new byte[size]; | ||||
|  | ||||
|             IntPtr ptr = Marshal.AllocHGlobal(size); | ||||
|             var ptr = Marshal.AllocHGlobal(size); | ||||
|             Marshal.StructureToPtr(gameMessage, ptr, true); | ||||
|             Marshal.Copy(ptr, arr, 0, size); | ||||
|             Marshal.FreeHGlobal(ptr); | ||||
| @@ -129,7 +128,7 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|  | ||||
|         public byte[] GetBytes() | ||||
|         { | ||||
|             byte[] outBytes = new byte[header.subpacketSize]; | ||||
|             var outBytes = new byte[header.subpacketSize]; | ||||
|             Array.Copy(GetHeaderBytes(), 0, outBytes, 0, SUBPACKET_SIZE); | ||||
|  | ||||
|             if (header.type == 0x3) | ||||
| @@ -142,23 +141,30 @@ namespace FFXIVClassic_Map_Server.packets | ||||
|         public void DebugPrintSubPacket() | ||||
|         { | ||||
| #if DEBUG | ||||
|             // todo: create new target for colourful packet logging | ||||
|             //Console.BackgroundColor = ConsoleColor.DarkRed; | ||||
|             logger.ColorDebug( | ||||
|                 string.Format("Size:0x{0:X} Opcode:0x{1:X}{2}{3}", header.subpacketSize, header.type, | ||||
|                     Environment.NewLine, | ||||
|                     Utils.ByteArrayToHex(GetHeaderBytes())), ConsoleOutputColor.DarkRed); | ||||
|  | ||||
|             Log.Debug("Size: 0x{0:X}{1}{2}", header.subpacketSize, Environment.NewLine, Utils.ByteArrayToHex(GetHeaderBytes())); | ||||
|              | ||||
|             if (header.type == 0x03) | ||||
|             { | ||||
|                 Log.Debug("Opcode: 0x{0:X}{1}{2}", gameMessage.opcode, Environment.NewLine, Utils.ByteArrayToHex(GetGameMessageBytes(), SUBPACKET_SIZE)); | ||||
|                 logger.ColorDebug(Utils.ByteArrayToHex(GetGameMessageBytes(), SUBPACKET_SIZE), | ||||
|                     ConsoleOutputColor.DarkRed); | ||||
|  | ||||
|                 //Console.BackgroundColor = ConsoleColor.DarkMagenta; | ||||
|  | ||||
|                 Log.Debug("Data: {0}{1}", Environment.NewLine, Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE)); | ||||
|                 logger.ColorDebug(Utils.ByteArrayToHex(data, SUBPACKET_SIZE + GAMEMESSAGE_SIZE), | ||||
|                     ConsoleOutputColor.DarkMagenta); | ||||
|             } | ||||
|  | ||||
|             //Console.BackgroundColor = ConsoleColor.Black; | ||||
| #endif | ||||
|         } | ||||
|  | ||||
|     } | ||||
| } | ||||
|  | ||||
|     public static class LoggerExtensions | ||||
|     { | ||||
|         public static void ColorDebug(this Logger logger, string message, ConsoleOutputColor color) | ||||
|         { | ||||
|             var logEvent = new LogEventInfo(LogLevel.Debug, logger.Name, message); | ||||
|             logEvent.Properties["color"] = (int) color; | ||||
|             logger.Log(logEvent); | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user