public static PefImportedLibrary Load(EndianByteImageReader rdr, PefLoaderStringTable loaderStringTable) { var lib = PEFImportedLibrary.Load(rdr); var name = loaderStringTable.ReadCString(lib.nameOffset); return(new PefImportedLibrary(lib, name)); }
private PEFContainerHeader(EndianByteImageReader rdr) { this = rdr.ReadStruct <PEFContainerHeader>(); if (tag1 != TAG1_MAGIC) { throw new BadImageFormatException("Unexpected tag1 magic"); } if (tag2 != TAG2_MAGIC) { throw new BadImageFormatException("Unexpected tag2 magic"); } switch (architecture) { case OSType.kPowerPCCFragArch: case OSType.kMotorola68KCFragArch: case OSType.kAnyCFragArch: break; default: throw new BadImageFormatException("Unexpected/unsupported architecture"); } if (formatVersion != 1) { throw new BadImageFormatException($"Unsupported format version {formatVersion}"); } }
private Program MakeProgram(EndianByteImageReader rdr) { if (container == null) { throw new InvalidOperationException(); } var cfgSvc = Services.RequireService <IConfigurationService>(); var arch = GetArchitecture(cfgSvc); var platform = GetPlatform(cfgSvc, arch); var pefSegments = container.GetImageSegments(rdr, PreferredBaseAddress !).ToArray(); var segments = pefSegments.Select(s => s.Segment); var addrBase = pefSegments.Min(s => s.Segment.Address); var segMap = new SegmentMap(addrBase, segments.ToArray()); var pefFile = PefFile.Load(container, pefSegments); var entryPoints = pefFile.GetEntryPoints(arch).ToSortedList(s => s.Address); var symbols = pefFile.GetSymbols(arch).ToArray(); var program = new Program(segMap, arch, platform) { EntryPoints = entryPoints }; foreach (var sym in symbols) { program.ImageSymbols.Add(sym.Address, sym); } return(program); }
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 PEFLoaderRelocationHeader(EndianByteImageReader rdr) { this = rdr.ReadStruct <PEFLoaderRelocationHeader>(); if (reservedA != 0) { throw new BadImageFormatException("Invalid PEFLoaderRelocationHeader"); } }
private PEFImportedLibrary(EndianByteImageReader rdr) { this = rdr.ReadStruct <PEFImportedLibrary>(); if (reservedA != 0 || reservedB != 0) { throw new BadImageFormatException("Invalid PEFImportedLibrary"); } }
protected Parser(MachOLoader ldr, EndianByteImageReader rdr) { this.ldr = ldr; this.cfgSvc = ldr.Services.RequireService <IConfigurationService>(); this.rdr = rdr; this.mpCputypeToUnixthreadPc = new Dictionary <uint, uint> { { CPU_TYPE_POWERPC, 0x0000 }, { CPU_TYPE_POWERPC64, 0x0010 }, { CPU_TYPE_X86, 0x38 }, { CPU_TYPE_X86_64, 0x80 }, { CPU_TYPE_ARM, 0x4C }, { CPU_TYPE_ARM64, 0x110 }, { CPU_TYPE_MC680x0, 0x44 } }; this.segments = new Dictionary <string, ulong>(); }
public static PEFExportedSymbol Load(EndianByteImageReader rdr) => new PEFExportedSymbol(rdr);
private PEFExportedSymbol(EndianByteImageReader rdr) { this = rdr.ReadStruct <PEFExportedSymbol>(); }
public static PEFImportedLibrary Load(EndianByteImageReader rdr) => new PEFImportedLibrary(rdr);
private static IEnumerable <PEFSectionHeader> ReadSections(PEFContainerHeader containerHeader, EndianByteImageReader rdr) { for (int i = 0; i < containerHeader.sectionCount; i++) { yield return(rdr.ReadStruct <PEFSectionHeader>()); } }
public PefLoaderSegmentReader(PefImageSegment loaderSegment) { fields = new PefLoaderFields(); rdr = (EndianByteImageReader)loaderSegment.Segment.MemoryArea.CreateBeReader(0); }
public PefLoaderStringTable(PEFLoaderInfoHeader infoHeader, EndianByteImageReader rdr) { this.infoHeader = infoHeader; this.rdr = rdr; }
private PefContainer LoadContainer(EndianByteImageReader rdr) { return(PefContainer.Load(rdr)); }
private PEFSectionHeader(EndianByteImageReader rdr) { this = rdr.ReadStruct <PEFSectionHeader>(); }
public static PEFSectionHeader Load(EndianByteImageReader rdr) => new PEFSectionHeader(rdr);
private PEFLoaderInfoHeader(EndianByteImageReader rdr) { this = rdr.ReadStruct <PEFLoaderInfoHeader>(); }
public static PEFContainerHeader Load(EndianByteImageReader rdr) => new PEFContainerHeader(rdr);
public static PEFLoaderInfoHeader Load(EndianByteImageReader rdr) => new PEFLoaderInfoHeader(rdr);