GetRVA() public method

public GetRVA ( TextSegment segment ) : UInt32
segment TextSegment
return System.UInt32
Esempio n. 1
0
        private void BuildTextMap()
        {
            TextMap textMap = text_map;

            textMap.AddMap(TextSegment.Code, metadata.code.length, (!pe64) ? 4 : 16);
            textMap.AddMap(TextSegment.Resources, metadata.resources.length, 8);
            textMap.AddMap(TextSegment.Data, metadata.data.length, 4);
            if (metadata.data.length > 0)
            {
                metadata.table_heap.FixupData(textMap.GetRVA(TextSegment.Data));
            }
            textMap.AddMap(TextSegment.StrongNameSignature, GetStrongNameLength(), 4);
            BuildMetadataTextMap();
            int length = 0;

            if (debug_header != null && debug_header.HasEntries)
            {
                int num  = debug_header.Entries.Length * 28;
                int num2 = (int)textMap.GetNextRVA(TextSegment.BlobHeap) + num;
                int num3 = 0;
                for (int i = 0; i < debug_header.Entries.Length; i++)
                {
                    ImageDebugHeaderEntry imageDebugHeaderEntry = debug_header.Entries[i];
                    ImageDebugDirectory   directory             = imageDebugHeaderEntry.Directory;
                    directory.AddressOfRawData      = ((imageDebugHeaderEntry.Data.Length != 0) ? num2 : 0);
                    imageDebugHeaderEntry.Directory = directory;
                    num3 += imageDebugHeaderEntry.Data.Length;
                    num2 += num3;
                }
                length = num + num3;
            }
            textMap.AddMap(TextSegment.DebugDirectory, length, 4);
            if (!has_reloc)
            {
                uint nextRVA = textMap.GetNextRVA(TextSegment.DebugDirectory);
                textMap.AddMap(TextSegment.ImportDirectory, new Range(nextRVA, 0u));
                textMap.AddMap(TextSegment.ImportHintNameTable, new Range(nextRVA, 0u));
                textMap.AddMap(TextSegment.StartupStub, new Range(nextRVA, 0u));
            }
            else
            {
                uint nextRVA2 = textMap.GetNextRVA(TextSegment.DebugDirectory);
                uint num4     = nextRVA2 + 48;
                num4 = (uint)((int)(num4 + 15) & -16);
                uint num5 = num4 - nextRVA2 + 27;
                uint num6 = nextRVA2 + num5;
                num6 = (uint)((module.Architecture == TargetArchitecture.IA64) ? ((int)(num6 + 15) & -16) : (2 + ((int)(num6 + 3) & -4)));
                textMap.AddMap(TextSegment.ImportDirectory, new Range(nextRVA2, num5));
                textMap.AddMap(TextSegment.ImportHintNameTable, new Range(num4, 0u));
                textMap.AddMap(TextSegment.StartupStub, new Range(num6, GetStartupStubLength()));
            }
        }
        private TextMap BuildTextMap()
        {
            TextMap textMap = this.metadata.text_map;

            textMap.AddMap(TextSegment.Code, this.metadata.code.length, (!this.pe64 ? 4 : 16));
            textMap.AddMap(TextSegment.Resources, this.metadata.resources.length, 8);
            textMap.AddMap(TextSegment.Data, this.metadata.data.length, 4);
            if (this.metadata.data.length > 0)
            {
                this.metadata.table_heap.FixupData(textMap.GetRVA(TextSegment.Data));
            }
            textMap.AddMap(TextSegment.StrongNameSignature, this.GetStrongNameLength(), 4);
            textMap.AddMap(TextSegment.MetadataHeader, this.GetMetadataHeaderLength());
            textMap.AddMap(TextSegment.TableHeap, this.metadata.table_heap.length, 4);
            textMap.AddMap(TextSegment.StringHeap, this.metadata.string_heap.length, 4);
            textMap.AddMap(TextSegment.UserStringHeap, (this.metadata.user_string_heap.IsEmpty ? 0 : this.metadata.user_string_heap.length), 4);
            textMap.AddMap(TextSegment.GuidHeap, 16);
            textMap.AddMap(TextSegment.BlobHeap, (this.metadata.blob_heap.IsEmpty ? 0 : this.metadata.blob_heap.length), 4);
            int length = 0;

            if (!this.debug_data.IsNullOrEmpty <byte>())
            {
                this.debug_directory.AddressOfRawData = (int)(textMap.GetNextRVA(TextSegment.BlobHeap) + 28);
                length = (int)this.debug_data.Length + 28;
            }
            textMap.AddMap(TextSegment.DebugDirectory, length, 4);
            if (!this.has_reloc)
            {
                uint nextRVA = textMap.GetNextRVA(TextSegment.DebugDirectory);
                textMap.AddMap(TextSegment.ImportDirectory, new Range(nextRVA, 0));
                textMap.AddMap(TextSegment.ImportHintNameTable, new Range(nextRVA, 0));
                textMap.AddMap(TextSegment.StartupStub, new Range(nextRVA, 0));
                return(textMap);
            }
            uint num  = textMap.GetNextRVA(TextSegment.DebugDirectory);
            uint num1 = num + 48;

            num1 = num1 + 15 & -16;
            uint num2 = num1 - num + 27;
            uint num3 = num + num2;

            num3 = (this.module.Architecture == TargetArchitecture.IA64 ? num3 + 15 & -16 : 2 + (num3 + 3 & -4));
            textMap.AddMap(TextSegment.ImportDirectory, new Range(num, num2));
            textMap.AddMap(TextSegment.ImportHintNameTable, new Range(num1, 0));
            textMap.AddMap(TextSegment.StartupStub, new Range(num3, this.GetStartupStubLength()));
            return(textMap);
        }
Esempio n. 3
0
        private TextMap BuildTextMap()
        {
            TextMap map = this.metadata.text_map;

            map.AddMap(TextSegment.Code, this.metadata.code.length, !this.pe64 ? 4 : 0x10);
            map.AddMap(TextSegment.Resources, this.metadata.resources.length, 8);
            map.AddMap(TextSegment.Data, this.metadata.data.length, 4);
            if (this.metadata.data.length > 0)
            {
                this.metadata.table_heap.FixupData(map.GetRVA(TextSegment.Data));
            }
            map.AddMap(TextSegment.StrongNameSignature, this.GetStrongNameLength(), 4);
            map.AddMap(TextSegment.MetadataHeader, this.GetMetadataHeaderLength());
            map.AddMap(TextSegment.TableHeap, this.metadata.table_heap.length, 4);
            map.AddMap(TextSegment.StringHeap, this.metadata.string_heap.length, 4);
            map.AddMap(TextSegment.UserStringHeap, this.metadata.user_string_heap.IsEmpty ? 0 : this.metadata.user_string_heap.length, 4);
            map.AddMap(TextSegment.GuidHeap, 0x10);
            map.AddMap(TextSegment.BlobHeap, this.metadata.blob_heap.IsEmpty ? 0 : this.metadata.blob_heap.length, 4);
            int length = 0;

            if (!this.debug_data.IsNullOrEmpty <byte>())
            {
                this.debug_directory.AddressOfRawData = (int)(map.GetNextRVA(TextSegment.BlobHeap) + 0x1c);
                length = this.debug_data.Length + 0x1c;
            }
            map.AddMap(TextSegment.DebugDirectory, length, 4);
            if (!this.has_reloc)
            {
                uint num2 = map.GetNextRVA(TextSegment.DebugDirectory);
                map.AddMap(TextSegment.ImportDirectory, new Range(num2, 0));
                map.AddMap(TextSegment.ImportHintNameTable, new Range(num2, 0));
                map.AddMap(TextSegment.StartupStub, new Range(num2, 0));
                return(map);
            }
            uint nextRVA = map.GetNextRVA(TextSegment.DebugDirectory);
            uint index   = (uint)(((nextRVA + 0x30) + 15) & -16);
            uint num5    = (index - nextRVA) + ((uint)0x1b);
            uint num6    = nextRVA + num5;

            map.AddMap(TextSegment.ImportDirectory, new Range(nextRVA, num5));
            map.AddMap(TextSegment.ImportHintNameTable, new Range(index, 0));
            map.AddMap(TextSegment.StartupStub, new Range((this.module.Architecture == TargetArchitecture.IA64) ? ((uint)((num6 + 15) & -16)) : ((uint)(2 + ((num6 + 3) & -4))), this.GetStartupStubLength()));
            return(map);
        }
Esempio n. 4
0
        void WriteOptionalHeaders()
        {
            WriteUInt16((ushort)(!pe64 ? 0x10b : 0x20b));           // Magic
            WriteUInt16(module.linker_version);
            WriteUInt32(text.SizeOfRawData);                        // CodeSize
            WriteUInt32((reloc != null ? reloc.SizeOfRawData : 0)
                        + (rsrc != null ? rsrc.SizeOfRawData : 0)); // InitializedDataSize
            WriteUInt32(0);                                         // UninitializedDataSize

            var startub_stub = text_map.GetRange(TextSegment.StartupStub);

            WriteUInt32(startub_stub.Length > 0 ? startub_stub.Start : 0); // EntryPointRVA
            WriteUInt32(text_rva);                                         // BaseOfCode

            if (!pe64)
            {
                WriteUInt32(0);                         // BaseOfData
                WriteUInt32((uint)image_base);          // ImageBase
            }
            else
            {
                WriteUInt64(image_base);                        // ImageBase
            }

            WriteUInt32(section_alignment);     // SectionAlignment
            WriteUInt32(file_alignment);        // FileAlignment

            WriteUInt16(4);                     // OSMajor
            WriteUInt16(0);                     // OSMinor
            WriteUInt16(0);                     // UserMajor
            WriteUInt16(0);                     // UserMinor
            WriteUInt16(4);                     // SubSysMajor
            WriteUInt16(0);                     // SubSysMinor
            WriteUInt32(0);                     // Reserved

            var last_section = LastSection();

            WriteUInt32(last_section.VirtualAddress + Align(last_section.VirtualSize, section_alignment)); // ImageSize
            WriteUInt32(text.PointerToRawData);                                                            // HeaderSize

            WriteUInt32(0);                                                                                // Checksum
            WriteUInt16(GetSubSystem());                                                                   // SubSystem
            WriteUInt16((ushort)module.Characteristics);                                                   // DLLFlags

            const ulong stack_reserve = 0x100000;
            const ulong stack_commit  = 0x1000;
            const ulong heap_reserve  = 0x100000;
            const ulong heap_commit   = 0x1000;

            if (!pe64)
            {
                WriteUInt32((uint)stack_reserve);
                WriteUInt32((uint)stack_commit);
                WriteUInt32((uint)heap_reserve);
                WriteUInt32((uint)heap_commit);
            }
            else
            {
                WriteUInt64(stack_reserve);
                WriteUInt64(stack_commit);
                WriteUInt64(heap_reserve);
                WriteUInt64(heap_commit);
            }

            WriteUInt32(0);                                                             // LoaderFlags
            WriteUInt32(16);                                                            // NumberOfDataDir

            WriteZeroDataDirectory();                                                   // ExportTable
            WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportDirectory)); // ImportTable
            if (rsrc != null)                                                           // ResourceTable
            {
                WriteUInt32(rsrc.VirtualAddress);
                WriteUInt32(rsrc.VirtualSize);
            }
            else
            {
                WriteZeroDataDirectory();
            }

            WriteZeroDataDirectory();                              // ExceptionTable
            WriteZeroDataDirectory();                              // CertificateTable
            WriteUInt32(reloc != null ? reloc.VirtualAddress : 0); // BaseRelocationTable
            WriteUInt32(reloc != null ? reloc.VirtualSize : 0);

            if (text_map.GetLength(TextSegment.DebugDirectory) > 0)
            {
                WriteUInt32(text_map.GetRVA(TextSegment.DebugDirectory));
                WriteUInt32((uint)(debug_header.Entries.Length * ImageDebugDirectory.Size));
            }
            else
            {
                WriteZeroDataDirectory();
            }

            WriteZeroDataDirectory();                                                      // Copyright
            WriteZeroDataDirectory();                                                      // GlobalPtr
            WriteZeroDataDirectory();                                                      // TLSTable
            WriteZeroDataDirectory();                                                      // LoadConfigTable
            WriteZeroDataDirectory();                                                      // BoundImport
            WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportAddressTable)); // IAT
            WriteZeroDataDirectory();                                                      // DelayImportDesc
            WriteDataDirectory(text_map.GetDataDirectory(TextSegment.CLIHeader));          // CLIHeader
            WriteZeroDataDirectory();                                                      // Reserved
        }
Esempio n. 5
0
        void WriteOptionalHeaders()
        {
            Section text = GetSection(".text");

            WriteUInt16((ushort)(!pe64 ? 0x10b : 0x20b)); // Magic
            WriteByte(8);                                 // LMajor
            WriteByte(0);                                 // LMinor
            WriteUInt32(text.SizeOfRawData);              // CodeSize
            uint dataSize = 0;

            foreach (Section sect in sections)
            {
                sect.PointerToRawData += Align(GetHeaderSize(), file_alignment);
                if (sect.Name != ".text")
                {
                    dataSize += sect.SizeOfRawData;
                }
            }
            WriteUInt32(dataSize);      // InitializedDataSize
            WriteUInt32(0);             // UninitializedDataSize

            var entry_point_rva = text_map.GetRVA(TextSegment.StartupStub);

            if (module.Architecture == TargetArchitecture.IA64)
            {
                entry_point_rva += 0x20;
            }
            WriteUInt32(entry_point_rva);       // EntryPointRVA
            WriteUInt32(text_rva);              // BaseOfCode

            if (!pe64)
            {
                WriteUInt32(0);                         // BaseOfData
                WriteUInt32((uint)image_base);          // ImageBase
            }
            else
            {
                WriteUInt64(image_base);                        // ImageBase
            }

            WriteUInt32(section_alignment);     // SectionAlignment
            WriteUInt32(file_alignment);        // FileAlignment

            WriteUInt16(4);                     // OSMajor
            WriteUInt16(0);                     // OSMinor
            WriteUInt16(0);                     // UserMajor
            WriteUInt16(0);                     // UserMinor
            WriteUInt16(4);                     // SubSysMajor
            WriteUInt16(0);                     // SubSysMinor
            WriteUInt32(0);                     // Reserved

            Section reloc = GetSection(".reloc");
            Section last  = sections[sections.Count - 1];

            foreach (Section sect in sections)
            {
                if (sect.VirtualAddress > last.VirtualAddress)
                {
                    last = sect;
                }
            }
            WriteUInt32(last.VirtualAddress + Align(last.VirtualSize, section_alignment)); // ImageSize
            WriteUInt32(text.PointerToRawData);                                            // HeaderSize

            WriteUInt32(0);                                                                // Checksum
            WriteUInt16(GetSubSystem());                                                   // SubSystem
            WriteUInt16(0x8540);                                                           // DLLFlags

            const ulong stack_reserve = 0x100000;
            const ulong stack_commit  = 0x1000;
            const ulong heap_reserve  = 0x100000;
            const ulong heap_commit   = 0x1000;

            if (!pe64)
            {
                WriteUInt32((uint)stack_reserve);
                WriteUInt32((uint)stack_commit);
                WriteUInt32((uint)heap_reserve);
                WriteUInt32((uint)heap_commit);
            }
            else
            {
                WriteUInt64(stack_reserve);
                WriteUInt64(stack_commit);
                WriteUInt64(heap_reserve);
                WriteUInt64(heap_commit);
            }

            WriteUInt32(0);                                                             // LoaderFlags
            WriteUInt32(16);                                                            // NumberOfDataDir

            WriteZeroDataDirectory();                                                   // ExportTable
            WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportDirectory)); // ImportTable
            Section rsrc = GetSection(".rsrc");

            if (rsrc != null)                                                   // ResourceTable
            {
                WriteUInt32(rsrc.VirtualAddress);
                WriteUInt32(rsrc.VirtualSize);
            }
            else
            {
                WriteZeroDataDirectory();
            }

            WriteZeroDataDirectory();                   // ExceptionTable
            WriteZeroDataDirectory();                   // CertificateTable
            WriteUInt32(reloc.VirtualAddress);          // BaseRelocationTable
            WriteUInt32(reloc.VirtualSize);

            if (text_map.GetLength(TextSegment.DebugDirectory) > 0)
            {
                WriteUInt32(text_map.GetRVA(TextSegment.DebugDirectory));
                WriteUInt32(28u);
            }
            else
            {
                WriteZeroDataDirectory();
            }

            WriteZeroDataDirectory();                                                      // Copyright
            WriteZeroDataDirectory();                                                      // GlobalPtr
            WriteZeroDataDirectory();                                                      // TLSTable
            WriteZeroDataDirectory();                                                      // LoadConfigTable
            WriteZeroDataDirectory();                                                      // BoundImport
            WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportAddressTable)); // IAT
            WriteZeroDataDirectory();                                                      // DelayImportDesc
            WriteDataDirectory(text_map.GetDataDirectory(TextSegment.CLIHeader));          // CLIHeader
            WriteZeroDataDirectory();                                                      // Reserved
        }
Esempio n. 6
0
        private void WriteOptionalHeaders()
        {
            base.WriteUInt16((ushort)((!pe64) ? 267 : 523));
            base.WriteUInt16(module.linker_version);
            base.WriteUInt32(text.SizeOfRawData);
            base.WriteUInt32(((reloc != null) ? reloc.SizeOfRawData : 0) + ((rsrc != null) ? rsrc.SizeOfRawData : 0));
            base.WriteUInt32(0u);
            Range range = text_map.GetRange(TextSegment.StartupStub);

            base.WriteUInt32((range.Length != 0) ? range.Start : 0);
            base.WriteUInt32(8192u);
            if (!pe64)
            {
                base.WriteUInt32(0u);
                base.WriteUInt32(4194304u);
            }
            else
            {
                base.WriteUInt64(4194304uL);
            }
            base.WriteUInt32(8192u);
            base.WriteUInt32(512u);
            base.WriteUInt16(4);
            base.WriteUInt16(0);
            base.WriteUInt16(0);
            base.WriteUInt16(0);
            base.WriteUInt16(4);
            base.WriteUInt16(0);
            base.WriteUInt32(0u);
            Section section = LastSection();

            base.WriteUInt32(section.VirtualAddress + Align(section.VirtualSize, 8192u));
            base.WriteUInt32(text.PointerToRawData);
            base.WriteUInt32(0u);
            base.WriteUInt16(GetSubSystem());
            base.WriteUInt16((ushort)module.Characteristics);
            if (!pe64)
            {
                base.WriteUInt32(1048576u);
                base.WriteUInt32(4096u);
                base.WriteUInt32(1048576u);
                base.WriteUInt32(4096u);
            }
            else
            {
                base.WriteUInt64(1048576uL);
                base.WriteUInt64(4096uL);
                base.WriteUInt64(1048576uL);
                base.WriteUInt64(4096uL);
            }
            base.WriteUInt32(0u);
            base.WriteUInt32(16u);
            WriteZeroDataDirectory();
            base.WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportDirectory));
            if (rsrc != null)
            {
                base.WriteUInt32(rsrc.VirtualAddress);
                base.WriteUInt32(rsrc.VirtualSize);
            }
            else
            {
                WriteZeroDataDirectory();
            }
            WriteZeroDataDirectory();
            WriteZeroDataDirectory();
            base.WriteUInt32((reloc != null) ? reloc.VirtualAddress : 0);
            base.WriteUInt32((reloc != null) ? reloc.VirtualSize : 0);
            if (text_map.GetLength(TextSegment.DebugDirectory) > 0)
            {
                base.WriteUInt32(text_map.GetRVA(TextSegment.DebugDirectory));
                base.WriteUInt32((uint)(debug_header.Entries.Length * 28));
            }
            else
            {
                WriteZeroDataDirectory();
            }
            WriteZeroDataDirectory();
            WriteZeroDataDirectory();
            WriteZeroDataDirectory();
            WriteZeroDataDirectory();
            WriteZeroDataDirectory();
            base.WriteDataDirectory(text_map.GetDataDirectory(TextSegment.ImportAddressTable));
            WriteZeroDataDirectory();
            base.WriteDataDirectory(text_map.GetDataDirectory(TextSegment.CLIHeader));
            WriteZeroDataDirectory();
        }