コード例 #1
0
ファイル: LZNT1.cs プロジェクト: pirenga/CVE-2020-1206-POC
        public override object Unmarshal(LittleEndianByteBuffer buffer, ref int offset)
        {
            var result = new LZNT1_UncompressedChunk();

            result.Chunk_header = Unmarshal <LZNT1_ChunkHeader>(buffer, ref offset);
            int  value      = result.Chunk_header.Value;
            bool compressed = (value & 0x8000) != 0;

            if (compressed)
            {
                throw new XcaException("Unreachable code!");
            }
            int signature = (value & 0x7000) >> 12;

            if (signature != 3)
            {
                throw new XcaException("[Data error]: Wrong signature!");
            }
            int size = (value & 0x0FFF) + 1;

            result.Uncompressed_data = new byte[size];
            for (int i = 0; i < size; i++)
            {
                result.Uncompressed_data[i] = (byte)buffer.ReadBytes(offset + i, 1);
            }
            offset += size;
            return(result);
        }
コード例 #2
0
ファイル: LZNT1.cs プロジェクト: pirenga/CVE-2020-1206-POC
        public static LZNT1_Chunk Compress(byte[] arg, List <LZNT1_Data> data)
        {
            int compressedLength = CalculateCompressedLength(data);

            if (compressedLength < arg.Length)
            {
                var compressedChunk = new LZNT1_CompressedChunk();
                compressedChunk.Chunk_header        = new LZNT1_ChunkHeader();
                compressedChunk.Chunk_header.Value  = 0xB000;
                compressedChunk.Chunk_header.Value |= compressedLength - 3;
                compressedChunk.Flag_group          = new LZNT1_FlagGroup();
                var flagData = new List <LZNT1_FlagData>();

                int i = 0;
                while (i < data.Count)
                {
                    int groupLength = Math.Min(8, data.Count - i);

                    var group = data.Skip(i).Take(groupLength);

                    var flagDataItem = new LZNT1_FlagData(group.ToArray());

                    flagData.Add(flagDataItem);

                    i += groupLength;
                }

                compressedChunk.Flag_group.Flag_data = flagData.ToArray();
                return(compressedChunk);
            }
            else
            {
                var uncompressedChunk = new LZNT1_UncompressedChunk();
                uncompressedChunk.Chunk_header        = new LZNT1_ChunkHeader();
                uncompressedChunk.Chunk_header.Value  = 0x3000;
                uncompressedChunk.Chunk_header.Value |= arg.Length - 1;
                uncompressedChunk.Uncompressed_data   = arg.ToArray();
                return(uncompressedChunk);
            }
        }