public IEnumerable <PefImageSegment> GetImageSegments(EndianByteImageReader rdr, Address addrLoad) { var addr = addrLoad; for (int i = 0; i < ContainerHeader.sectionCount; i++) { PEFSectionHeader sectionHeader = sectionHeaders[i]; byte[] containerData = rdr.ReadAt(sectionHeader.containerOffset, rdr => rdr.ReadBytes(sectionHeader.packedSize)); if (sectionHeader.IsCompressedSection()) { // replace PEF bytecode with decoded output from the interpreter containerData = DecompressSection(containerData); } if (sectionHeader.defaultAddress != 0) { addr = Address.Ptr32(sectionHeader.defaultAddress); } else { addr = addrLoad; } var segment = new ImageSegment( sectionNameTable[i] ?? $"seg{sectionHeader.defaultAddress:X8}", new ByteMemoryArea(addr, containerData), sectionHeader.GetAccessMode()); yield return(new PefImageSegment(sectionHeader, segment)); addrLoad = (segment.Address + containerData.Length).Align(0x1000); } }
private static string?GetStandardSectionName(PEFSectionHeader section) { return(section.sectionKind switch { PEFSectionType.Code => ".text", PEFSectionType.UnpackedData => ".data", PEFSectionType.PatternInitializedData => ".data", PEFSectionType.Constant => ".rodata", PEFSectionType.Loader => ".loader", PEFSectionType.Debug => ".debug", PEFSectionType.ExecutableData => ".data", PEFSectionType.Exception => ".exception", PEFSectionType.Traceback => ".traceback", _ => null });
public PefSection(string?sectionName, PEFSectionHeader sectionHeader, byte[] sectionData) { Name = sectionName; SectionHeader = sectionHeader; SectionData = sectionData; }
public PefImageSegment(PEFSectionHeader header, ImageSegment segment) { SectionHeader = header; Segment = segment; }