예제 #1
0
        public byte Decrypt(IFileDataWrapper data)
        {
            int  baseByteOffset = _encrypterData.BaseByteOffset < 0 ? data.Size + _encrypterData.BaseByteOffset : _encrypterData.BaseByteOffset;
            byte xorByte        = data.GetByte(baseByteOffset);

            if (_encrypterData.BaseByteXOR.HasValue)
            {
                xorByte = (byte)(xorByte ^ _encrypterData.BaseByteXOR.Value);
            }

            if (_encrypterData.FixFirstByte)
            {
                byte firstByte;
                if (_encrypterData.FirstByteXOR.HasValue)
                {
                    firstByte = (byte)(xorByte ^ _encrypterData.FirstByteXOR.Value);
                }
                else
                {
                    firstByte = xorByte;
                }
                data.PutByte(0, firstByte);
            }

            data.XOR(0, data.Size, xorByte);

            return(xorByte);
        }
        public void Unpack()
        {
            if (Directory.Exists(_baseDirectory))
            {
                Directory.Delete(_baseDirectory, true);
            }

            _data.GoTo(0x20);
            int offset = _data.GetInt();

            _data.GoTo(offset);

            byte zip   = _data.GetByte();
            int  zSize = _data.GetLong();
            int  size  = _data.GetLong();

            offset = _data.Location;
            using (IFileDataWrapper archive = zip != 0 ? _data.GetCompressedData(offset, zSize, size) : _data.GetData(offset, zSize))
                Extract(archive, archive.Size, string.Empty);
        }