Пример #1
0
        public void MoveTo(int rva)
        {
            if (!IsInSection (rva)) {
                code_section = reader.image.GetSectionAtVirtualAddress ((uint) rva);
                Reset (code_section.Data);
            }

            base.position = rva - (int) code_section.VirtualAddress;
        }
Пример #2
0
 public TableHeap(Section section, uint start, uint size)
     : base(section, start, size)
 {
 }
Пример #3
0
 public BlobHeap(Section section, uint start, uint size)
     : base(section, start, size)
 {
 }
Пример #4
0
 public uint ResolveVirtualAddressInSection(RVA rva, Section section)
 {
     return rva + section.PointerToRawData - section.VirtualAddress;
 }
Пример #5
0
 public CodeReader(Section section, MetadataReader reader)
     : base(section.Data)
 {
     this.code_section = section;
     this.reader = reader;
 }
Пример #6
0
        void PrepareSection(Section section)
        {
            MoveTo (section.PointerToRawData);

            const int buffer_size = 4096;

            if (section.SizeOfRawData <= buffer_size) {
                Write (new byte [section.SizeOfRawData]);
                MoveTo (section.PointerToRawData);
                return;
            }

            var written = 0;
            var buffer = new byte [buffer_size];
            while (written != section.SizeOfRawData) {
                var write_size = System.Math.Min((int) section.SizeOfRawData - written, buffer_size);
                Write (buffer, 0, write_size);
                written += write_size;
            }

            MoveTo (section.PointerToRawData);
        }
Пример #7
0
        void WriteSection(Section section, uint characteristics)
        {
            var name = new byte [8];
            var sect_name = section.Name;
            for (int i = 0; i < sect_name.Length; i++)
                name [i] = (byte) sect_name [i];

            WriteBytes (name);
            WriteUInt32 (section.VirtualSize);
            WriteUInt32 (section.VirtualAddress);
            WriteUInt32 (section.SizeOfRawData);
            WriteUInt32 (section.PointerToRawData);
            WriteUInt32 (0);	// PointerToRelocations
            WriteUInt32 (0);	// PointerToLineNumbers
            WriteUInt16 (0);	// NumberOfRelocations
            WriteUInt16 (0);	// NumberOfLineNumbers
            WriteUInt32 (characteristics);
        }
Пример #8
0
 Section CreateSection(string name, uint size, Section previous)
 {
     return new Section {
         Name = name,
         VirtualAddress = previous != null
             ? previous.VirtualAddress + Align (previous.VirtualSize, section_alignment)
             : text_rva,
         VirtualSize = size,
         PointerToRawData = previous != null
             ? previous.PointerToRawData + previous.SizeOfRawData
             : Align (GetHeaderSize (), file_alignment),
         SizeOfRawData = Align (size, file_alignment)
     };
 }
Пример #9
0
 void MoveToRVA(Section section, RVA rva)
 {
     BaseStream.Seek (section.PointerToRawData + rva - section.VirtualAddress, SeekOrigin.Begin);
 }
Пример #10
0
        void ReadSections(ushort count)
        {
            var sections = new Section [count];

            for (int i = 0; i < count; i++) {
                var section = new Section ();

                // Name
                section.Name = ReadZeroTerminatedString (8);

                // VirtualSize		4
                Advance (4);

                // VirtualAddress	4
                section.VirtualAddress = ReadUInt32 ();
                // SizeOfRawData	4
                section.SizeOfRawData = ReadUInt32 ();
                // PointerToRawData	4
                section.PointerToRawData = ReadUInt32 ();

                // PointerToRelocations		4
                // PointerToLineNumbers		4
                // NumberOfRelocations		2
                // NumberOfLineNumbers		2
                // Characteristics			4
                Advance (16);

                sections [i] = section;

                ReadSectionData (section);
            }

            image.Sections = sections;
        }
Пример #11
0
        void BuildSections()
        {
            var has_win32_resources = win32_resources != null;
            if (has_win32_resources)
                sections++;

            text = CreateSection (".text", text_map.GetLength (), null);
            var previous = text;

            if (has_win32_resources) {
                rsrc = CreateSection (".rsrc", (uint) win32_resources.length, previous);

                PatchWin32Resources (win32_resources);
                previous = rsrc;
            }

            if (has_reloc)
                reloc = CreateSection (".reloc", 12u, previous);
        }
Пример #12
0
        void ReadSectionData(Section section)
        {
            var position = BaseStream.Position;

            MoveTo (section.PointerToRawData);

            var length = (int) section.SizeOfRawData;
            var data = new byte [length];
            int offset = 0, read;

            while ((read = Read (data, offset, length - offset)) > 0)
                offset += read;

            section.Data = data;

            BaseStream.Position = position;
        }
Пример #13
0
        void ReadMetadataStream(Section section)
        {
            // Offset		4
            uint start = metadata.VirtualAddress - section.VirtualAddress + ReadUInt32 (); // relative to the section start

            // Size			4
            uint size = ReadUInt32 ();

            var name = ReadAlignedString (16);
            switch (name) {
            case "#~":
            case "#-":
                image.TableHeap = new TableHeap (section, start, size);
                break;
            case "#Strings":
                image.StringHeap = new StringHeap (section, start, size);
                break;
            case "#Blob":
                image.BlobHeap = new BlobHeap (section, start, size);
                break;
            case "#GUID":
                image.GuidHeap = new GuidHeap (section, start, size);
                break;
            case "#US":
                image.UserStringHeap = new UserStringHeap (section, start, size);
                break;
            }
        }
Пример #14
0
 public StringHeap(Section section, uint start, uint size)
     : base(section, start, size)
 {
 }
Пример #15
0
 protected Heap(Section section, uint offset, uint size)
 {
     this.Section = section;
     this.Offset = offset;
     this.Size = size;
 }
Пример #16
0
 public GuidHeap(Section section, uint start, uint size)
     : base(section, start, size)
 {
 }