Beispiel #1
0
        /// <summary>
        /// Loads PE section that contains the specified <paramref name="relativeVirtualAddress"/> into memory
        /// and returns a memory block that starts at <paramref name="relativeVirtualAddress"/> and ends at the end of the containing section.
        /// </summary>
        /// <param name="relativeVirtualAddress">Relative Virtual Address of the data to read.</param>
        /// <returns>
        /// An empty block if <paramref name="relativeVirtualAddress"/> doesn't represent a location in any of the PE sections of this PE image.
        /// </returns>
        /// <exception cref="BadImageFormatException">The PE headers contain invalid data.</exception>
        /// <exception cref="IOException">IO error while reading from the underlying stream.</exception>
        /// <exception cref="InvalidOperationException">PE image not available.</exception>
        /// <exception cref="ArgumentOutOfRangeException"><paramref name="relativeVirtualAddress"/> is negative.</exception>
        public PEMemoryBlock GetSectionData(int relativeVirtualAddress)
        {
            if (relativeVirtualAddress < 0)
            {
                Throw.ArgumentOutOfRange(nameof(relativeVirtualAddress));
            }

            int sectionIndex = PEHeaders.GetContainingSectionIndex(relativeVirtualAddress);

            if (sectionIndex < 0)
            {
                return(default(PEMemoryBlock));
            }

            var block = GetPESectionBlock(sectionIndex);

            int relativeOffset = relativeVirtualAddress - PEHeaders.SectionHeaders[sectionIndex].VirtualAddress;

            if (relativeOffset > block.Size)
            {
                return(default(PEMemoryBlock));
            }

            return(new PEMemoryBlock(block, relativeOffset));
        }
Beispiel #2
0
        /// <summary>
        /// Loads PE section that contains the specified <paramref name="relativeVirtualAddress"/> into memory
        /// and returns a memory block that starts at <paramref name="relativeVirtualAddress"/> and ends at the end of the containing section.
        /// </summary>
        /// <param name="relativeVirtualAddress">Relative Virtual Address of the data to read.</param>
        /// <returns>
        /// An empty block if <paramref name="relativeVirtualAddress"/> doesn't represent a location in any of the PE sections of this PE image.
        /// </returns>
        /// <exception cref="BadImageFormatException">The PE headers contain invalid data.</exception>
        public PEMemoryBlock GetSectionData(int relativeVirtualAddress)
        {
            var sectionIndex = PEHeaders.GetContainingSectionIndex(relativeVirtualAddress);

            if (sectionIndex < 0)
            {
                return(default(PEMemoryBlock));
            }

            int relativeOffset = relativeVirtualAddress - PEHeaders.SectionHeaders[sectionIndex].VirtualAddress;
            int size           = PEHeaders.SectionHeaders[sectionIndex].VirtualSize - relativeOffset;

            AbstractMemoryBlock block;

            if (_peImage != null)
            {
                block = GetPESectionBlock(sectionIndex);
            }
            else
            {
                block           = GetEntireImageBlock();
                relativeOffset += PEHeaders.SectionHeaders[sectionIndex].PointerToRawData;
            }

            return(new PEMemoryBlock(block, relativeOffset));
        }