示例#1
0
        /// <summary>
        /// Reads all the messages from the message byte code.
        /// </summary>
        /// <param name="messageData">Message byte code.</param>
        /// <param name="encodedMessages">True if messages are encoded.</param>
        /// <returns>Collection of messages.</returns>
        private static List <string> DecompileMessages(byte[] messageData, bool encodedMessages)
        {
            var messages = new List <string>();

            int messagesOffset = 0;

            ////////////////
            // Messages header

            // [0] = Number of messages
            int numMessages = messageData[messagesOffset];

            messagesOffset += 1;

            // [1][2] = Offset of end of messages
            messagesOffset += 2;

            // [3+] = Offset of each message (as per number of messages)

            // [x+] = Message data
            int messageDataOffset = messagesOffset + (numMessages * 2);

            if (numMessages > 0)
            {
                if (encodedMessages)
                {
                    // decrypt the data in-place, this modifies the buffer passed as input
                    var xform = new XorTransform(Key);
                    xform.TransformBlock(messageData, messageDataOffset, messageData.Length - messageDataOffset, messageData, messageDataOffset);
                }

                // Go back to array of offset of each message
                for (int i = 0; i < numMessages; i++)
                {
                    // [0][1] = Offset of message
                    int messageOffset = (messageData[messagesOffset + 1] * 0x100) + messageData[messagesOffset];
                    messagesOffset += 2;

                    string msg;

                    if ((messageOffset - 2) >= 0)
                    {
                        msg = StringDecoder.GetNullTerminatedString(messageData, messageOffset + 1);
                    }
                    else
                    {
                        msg = string.Empty;
                    }

                    messages.Add(msg);
                }
            }

            return(messages);
        }
示例#2
0
        /// <summary>
        /// Decode the inventory resource from byte array.
        /// </summary>
        /// <param name="data">Source array (data may be encrypted).</param>
        /// <param name="padded">Inventory data is padded.</param>
        /// <returns>Inventory resource.</returns>
        public static InventoryResource DecryptAndReadInventory(byte[] data, bool padded)
        {
            if (IsInventoryEncrypted(data, padded))
            {
                // Decrypt the data
                var xform = new XorTransform(XorKey);
                data = xform.TransformFinalBlock(data, 0, data.Length);
            }

            // Read the objects from the buffer
            return(ReadInventory(data, padded));
        }