Exemplo n.º 1
0
        /// <summary>
        /// Creates a new blob reader starting at the given offset.
        /// </summary>
        /// <param name="offset">The index of the blob to read.</param>
        /// <returns>The blob reader.</returns>
        public IBinaryStreamReader CreateBlobReader(uint offset)
        {
            var  reader = _reader.CreateSubReader(_reader.StartPosition + offset);
            uint length;

            reader.TryReadCompressedUInt32(out length);
            return(reader.CreateSubReader(reader.Position, (int)length));
        }
Exemplo n.º 2
0
 /// <summary>
 /// Gets the GUID at the given index.
 /// </summary>
 /// <param name="offset">The index of the GUID to get.</param>
 /// <returns>The GUID.</returns>
 public Guid GetGuidByOffset(uint offset)
 {
     if (offset == 0)
     {
         return(Guid.Empty);
     }
     return(ReadGuid(_reader.CreateSubReader(_reader.StartPosition + offset - 1)));
 }
Exemplo n.º 3
0
        /// <summary>
        /// Gets the string at the given offset.
        /// </summary>
        /// <param name="offset">The offset of the string to get.</param>
        /// <returns>The string.</returns>
        public string GetStringByOffset(uint offset)
        {
            if (offset == 0)
            {
                return(string.Empty);
            }
            var reader = _reader.CreateSubReader(_reader.StartPosition);

            reader.Position += offset;
            return(ReadString(reader));
        }
Exemplo n.º 4
0
        /// <summary>
        /// Gets the managed resource data at the given offset.
        /// </summary>
        /// <param name="offset">The offset of the managed resource to get.</param>
        /// <returns>The raw data of the managed resource.</returns>
        public byte[] GetResourceData(uint offset)
        {
            if (_reader == null)
            {
                return(null);
            }

            var reader = _reader.CreateSubReader(_reader.StartPosition + offset);
            int length = reader.ReadInt32();

            return(reader.ReadBytes(length));
        }
Exemplo n.º 5
0
        private Dictionary<ushort, uint> ReadOrdinalRvaTable(IBinaryStreamReader reader, WindowsAssembly application)
        {
            var dictionary = new Dictionary<ushort, uint>();
            if (NumberOfNames > 0)
            {
                var nameOrdinalReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfNameOrdinals));
                var nameRvaReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfNames));

                for (int i = 0; i < NumberOfNames; i++)
                    dictionary.Add(nameOrdinalReader.ReadUInt16(), nameRvaReader.ReadUInt32());
            }
            return dictionary;
        }
Exemplo n.º 6
0
        /// <summary>
        /// Gets the string at the given offset.
        /// </summary>
        /// <param name="offset">The offset of the string to get.</param>
        /// <returns>The string.</returns>
        public string GetStringByOffset(uint offset)
        {
            if (offset == 0 || offset >= _reader.Length)
            {
                return(null);
            }

            var reader = _reader.CreateSubReader(_reader.StartPosition);

            reader.Position += offset;
            lock (_cachedStrings)
            {
                return(ReadString(reader));
            }
        }
Exemplo n.º 7
0
        private Dictionary <uint, uint> ReadOrdinalRvaTable(IBinaryStreamReader reader, IOffsetConverter converter)
        {
            var dictionary = new Dictionary <uint, uint>();

            if (NumberOfNames > 0)
            {
                var nameOrdinalReader = reader.CreateSubReader(converter.RvaToFileOffset(AddressOfNameOrdinals));
                var nameRvaReader     = reader.CreateSubReader(converter.RvaToFileOffset(AddressOfNames));

                for (int i = 0; i < NumberOfNames; i++)
                {
                    dictionary.Add(nameOrdinalReader.ReadUInt16() + OrdinalBase, nameRvaReader.ReadUInt32());
                }
            }
            return(dictionary);
        }
Exemplo n.º 8
0
        private uint[] ReadAddresses(IBinaryStreamReader reader, WindowsAssembly application)
        {
            var addressReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfFunctions));
            var addresses     = new uint[NumberOfFunctions];

            for (int i = 0; i < NumberOfFunctions; i++)
            {
                addresses[i] = addressReader.ReadUInt32();
            }
            return(addresses);
        }
Exemplo n.º 9
0
        private uint[] ReadAddresses(IBinaryStreamReader reader, IOffsetConverter converter)
        {
            var addressReader = reader.CreateSubReader(converter.RvaToFileOffset(AddressOfFunctions));
            var addresses     = new uint[NumberOfFunctions];

            for (int i = 0; i < NumberOfFunctions; i++)
            {
                addresses[i] = addressReader.ReadUInt32();
            }
            return(addresses);
        }
Exemplo n.º 10
0
 /// <summary>
 /// Forks the reader by creating a new instance of a binary stream reader, using the same data source, but a different address.
 /// </summary>
 /// <param name="reader">The reader to fork.</param>
 /// <param name="address">The address of the forked reader to start at.</param>
 /// <returns>A forked binary stream reader with the same data source, but a different address.</returns>
 public static IBinaryStreamReader CreateSubReader(this IBinaryStreamReader reader, long address)
 {
     return(reader.CreateSubReader(address, (int)(reader.Length - (address - reader.StartPosition))));
 }
Exemplo n.º 11
0
        private Dictionary<ushort, uint> ReadOrdinalRvaTable(IBinaryStreamReader reader, WindowsAssembly application)
        {
            var dictionary = new Dictionary<ushort, uint>();
            if (NumberOfNames > 0)
            {
                var nameOrdinalReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfNameOrdinals));
                var nameRvaReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfNames));

                for (int i = 0; i < NumberOfNames; i++)
                    dictionary.Add(nameOrdinalReader.ReadUInt16(), nameRvaReader.ReadUInt32());
            }
            return dictionary;
        }
Exemplo n.º 12
0
        private uint[] ReadAddresses(IBinaryStreamReader reader, WindowsAssembly application)
        {
            var addressReader = reader.CreateSubReader(application.RvaToFileOffset(AddressOfFunctions));
            var addresses = new uint[NumberOfFunctions];

            for (int i = 0; i < NumberOfFunctions; i++)
            {
                addresses[i] = addressReader.ReadUInt32();
            }
            return addresses;
        }