diff --git a/FFXIVClassic Common Class Lib/Utils.cs b/FFXIVClassic Common Class Lib/Utils.cs index 12f5f88f..a6479b78 100644 --- a/FFXIVClassic Common Class Lib/Utils.cs +++ b/FFXIVClassic Common Class Lib/Utils.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using System.Text; namespace FFXIVClassic.Common @@ -13,7 +14,7 @@ namespace FFXIVClassic.Common for (var i = 0; i < 256; i++) { var s = i.ToString("X2"); - result[i] = s[0] + ((uint) s[1] << 16); + result[i] = s[0] + ((uint)s[1] << 16); } return result; } @@ -28,13 +29,13 @@ namespace FFXIVClassic.Common var hexChars = "0123456789ABCDEF".ToCharArray(); var offsetBlock = 8 + 3; - var byteBlock = offsetBlock + bytesPerLine*3 + (bytesPerLine - 1)/8 + 2; + var byteBlock = offsetBlock + bytesPerLine * 3 + (bytesPerLine - 1) / 8 + 2; var lineLength = byteBlock + bytesPerLine + Environment.NewLine.Length; var line = (new string(' ', lineLength - Environment.NewLine.Length) + Environment.NewLine).ToCharArray(); - var numLines = (bytes.Length + bytesPerLine - 1)/bytesPerLine; + var numLines = (bytes.Length + bytesPerLine - 1) / bytesPerLine; - var sb = new StringBuilder(numLines*lineLength); + var sb = new StringBuilder(numLines * lineLength); for (var i = 0; i < bytes.Length; i += bytesPerLine) { @@ -70,7 +71,7 @@ namespace FFXIVClassic.Common var by = bytes[i + j]; line[hexColumn] = hexChars[(by >> 4) & 0xF]; line[hexColumn + 1] = hexChars[by & 0xF]; - line[charColumn] = by < 32 ? '.' : (char) by; + line[charColumn] = by < 32 ? '.' : (char)by; } hexColumn += 3; @@ -89,7 +90,7 @@ namespace FFXIVClassic.Common var currentTime = DateTime.Now; var zuluTime = currentTime.ToUniversalTime(); var unixEpoch = new DateTime(1970, 1, 1); - unixTimeStamp = (uint) zuluTime.Subtract(unixEpoch).TotalSeconds; + unixTimeStamp = (uint)zuluTime.Subtract(unixEpoch).TotalSeconds; return unixTimeStamp; } @@ -100,7 +101,7 @@ namespace FFXIVClassic.Common var currentTime = DateTime.Now; var zuluTime = currentTime.ToUniversalTime(); var unixEpoch = new DateTime(1970, 1, 1); - unixTimeStamp = (ulong) zuluTime.Subtract(unixEpoch).TotalMilliseconds; + unixTimeStamp = (ulong)zuluTime.Subtract(unixEpoch).TotalMilliseconds; return unixTimeStamp; } @@ -127,7 +128,7 @@ namespace FFXIVClassic.Common public static int SwapEndian(int input) { - var inputAsUint = (uint) input; + var inputAsUint = (uint)input; input = (int) (((inputAsUint >> 24) & 0xff) | @@ -151,7 +152,7 @@ namespace FFXIVClassic.Common // Initialize the hash to a 'random' value - var h = seed ^ (uint) len; + var h = seed ^ (uint)len; // Mix 4 bytes at a time into the hash @@ -160,7 +161,7 @@ namespace FFXIVClassic.Common { h *= m; - var k = (uint) BitConverter.ToInt32(data, dataIndex); + var k = (uint)BitConverter.ToInt32(data, dataIndex); k = ((k >> 24) & 0xff) | // move byte 3 to byte 0 ((k << 8) & 0xff0000) | // move byte 1 to byte 2 ((k >> 8) & 0xff00) | // move byte 2 to byte 1 @@ -180,10 +181,10 @@ namespace FFXIVClassic.Common switch (len) { case 3: - h ^= (uint) data[0] << 16; + h ^= (uint)data[0] << 16; goto case 2; case 2: - h ^= (uint) data[len - 2] << 8; + h ^= (uint)data[len - 2] << 8; goto case 1; case 1: h ^= data[len - 1]; @@ -204,7 +205,7 @@ namespace FFXIVClassic.Common public static byte[] ConvertBoolArrayToBinaryStream(bool[] array) { - var data = new byte[array.Length/8 + (array.Length%8 != 0 ? 1 : 0)]; + var data = new byte[array.Length / 8 + (array.Length % 8 != 0 ? 1 : 0)]; var dataCounter = 0; for (var i = 0; i < array.Length; i += 8) @@ -213,7 +214,7 @@ namespace FFXIVClassic.Common { if (i + bitCount >= array.Length) break; - data[dataCounter] = (byte) (((array[i + bitCount] ? 1 : 0) << 7 - bitCount) | data[dataCounter]); + data[dataCounter] = (byte)(((array[i + bitCount] ? 1 : 0) << 7 - bitCount) | data[dataCounter]); } dataCounter++; } @@ -225,10 +226,130 @@ namespace FFXIVClassic.Common { var lookup = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - var secondDigit = lookup.Substring((int) Math.Floor(number/(double) lookup.Length), 1); - var firstDigit = lookup.Substring(number%lookup.Length, 1); + var secondDigit = lookup.Substring((int)Math.Floor(number / (double)lookup.Length), 1); + var firstDigit = lookup.Substring(number % lookup.Length, 1); return secondDigit + firstDigit; } + + + public static string FFXIVLoginStringDecodeBinary(string path) + { + Console.OutputEncoding = System.Text.Encoding.UTF8; + byte[] data = File.ReadAllBytes(path); + int offset = 0x5405a; + //int offset = 0x5425d; + //int offset = 0x53ea0; + while (true) + { + string result = ""; + uint key = (uint)data[offset + 0] << 8 | data[offset + 1]; + uint key2 = data[offset + 2]; + key = RotateRight(key, 1) & 0xFFFF; + key -= 0x22AF; + key &= 0xFFFF; + key2 = key2 ^ key; + key = RotateRight(key, 1) & 0xFFFF; + key -= 0x22AF; + key &= 0xFFFF; + uint finalKey = key; + key = data[offset + 3]; + uint count = (key2 & 0xFF) << 8; + key = key ^ finalKey; + key &= 0xFF; + count |= key; + + int count2 = 0; + while (count != 0) + { + uint encrypted = data[offset + 4 + count2]; + finalKey = RotateRight(finalKey, 1) & 0xFFFF; + finalKey -= 0x22AF; + finalKey &= 0xFFFF; + encrypted = encrypted ^ (finalKey & 0xFF); + + result += (char)encrypted; + count--; + count2++; + } + + offset += 4 + count2; + } + } + + public static string FFXIVLoginStringDecode(byte[] data) + { + string result = ""; + uint key = (uint)data[0] << 8 | data[1]; + uint key2 = data[2]; + key = RotateRight(key, 1) & 0xFFFF; + key -= 0x22AF; + key2 = key2 ^ key; + key = RotateRight(key, 1) & 0xFFFF; + key -= 0x22AF; + uint finalKey = key; + key = data[3]; + uint count = (key2 & 0xFF) << 8; + key = key ^ finalKey; + key &= 0xFF; + count |= key; + + int count2 = 0; + while (count != 0) + { + uint encrypted = data[4 + count2]; + finalKey = RotateRight(finalKey, 1) & 0xFFFF; + finalKey -= 0x22AF; + encrypted = encrypted ^ (finalKey & 0xFF); + result += (char)encrypted; + count--; + count2++; + } + + return result; + } + + public static byte[] FFXIVLoginStringEncode(uint key, string text) + { + key = key & 0xFFFF; + + uint count = 0; + byte[] asciiBytes = Encoding.ASCII.GetBytes(text); + byte[] result = new byte[4 + text.Length]; + for (count = 0; count < text.Length; count++) + { + result[result.Length - count - 1] = (byte)(asciiBytes[asciiBytes.Length - count - 1] ^ (key & 0xFF)); + key += 0x22AF; + key &= 0xFFFF; + key = RotateLeft(key, 1) & 0xFFFF; + } + + count = count ^ key; + result[3] = (byte)(count & 0xFF); + + key += 0x22AF & 0xFFFF; + key = RotateLeft(key, 1) & 0xFFFF; + + result[2] = (byte)(key & 0xFF); + + key += 0x22AF & 0xFFFF; + key = RotateLeft(key, 1) & 0xFFFF; + + + result[1] = (byte)(key & 0xFF); + result[0] = (byte)((key >> 8) & 0xFF); + + return result; + } + + public static uint RotateLeft(uint value, int bits) + { + return (value << bits) | (value >> (16 - bits)); + } + + public static uint RotateRight(uint value, int bits) + { + return (value >> bits) | (value << (16 - bits)); + } } } \ No newline at end of file diff --git a/FFXIVClassic Map Server/CommandProcessor.cs b/FFXIVClassic Map Server/CommandProcessor.cs index 6cebd662..50985884 100644 --- a/FFXIVClassic Map Server/CommandProcessor.cs +++ b/FFXIVClassic Map Server/CommandProcessor.cs @@ -88,7 +88,7 @@ namespace FFXIVClassic_Map_Server if (cmd.Any()) { // if client isnt null, take player to be the player actor - var player = client.GetActor(); + var player = client?.GetActor(); if (cmd.Equals("help")) { diff --git a/FFXIVClassic Map Server/NLog.config b/FFXIVClassic Map Server/NLog.config index cad2eea9..a59613ac 100644 --- a/FFXIVClassic Map Server/NLog.config +++ b/FFXIVClassic Map Server/NLog.config @@ -53,6 +53,7 @@ +