Exemplo n.º 1
0
        public static PefImportedLibrary Load(EndianByteImageReader rdr, PefLoaderStringTable loaderStringTable)
        {
            var lib  = PEFImportedLibrary.Load(rdr);
            var name = loaderStringTable.ReadCString(lib.nameOffset);

            return(new PefImportedLibrary(lib, name));
        }
Exemplo n.º 2
0
        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}");
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
        private PEFLoaderRelocationHeader(EndianByteImageReader rdr)
        {
            this = rdr.ReadStruct <PEFLoaderRelocationHeader>();

            if (reservedA != 0)
            {
                throw new BadImageFormatException("Invalid PEFLoaderRelocationHeader");
            }
        }
Exemplo n.º 6
0
        private PEFImportedLibrary(EndianByteImageReader rdr)
        {
            this = rdr.ReadStruct <PEFImportedLibrary>();

            if (reservedA != 0 || reservedB != 0)
            {
                throw new BadImageFormatException("Invalid PEFImportedLibrary");
            }
        }
Exemplo n.º 7
0
 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>();
 }
Exemplo n.º 8
0
 public static PEFExportedSymbol Load(EndianByteImageReader rdr) => new PEFExportedSymbol(rdr);
Exemplo n.º 9
0
 private PEFExportedSymbol(EndianByteImageReader rdr)
 {
     this = rdr.ReadStruct <PEFExportedSymbol>();
 }
Exemplo n.º 10
0
 public static PEFImportedLibrary Load(EndianByteImageReader rdr) => new PEFImportedLibrary(rdr);
Exemplo n.º 11
0
 private static IEnumerable <PEFSectionHeader> ReadSections(PEFContainerHeader containerHeader, EndianByteImageReader rdr)
 {
     for (int i = 0; i < containerHeader.sectionCount; i++)
     {
         yield return(rdr.ReadStruct <PEFSectionHeader>());
     }
 }
Exemplo n.º 12
0
 public PefLoaderSegmentReader(PefImageSegment loaderSegment)
 {
     fields = new PefLoaderFields();
     rdr    = (EndianByteImageReader)loaderSegment.Segment.MemoryArea.CreateBeReader(0);
 }
Exemplo n.º 13
0
 public PefLoaderStringTable(PEFLoaderInfoHeader infoHeader, EndianByteImageReader rdr)
 {
     this.infoHeader = infoHeader;
     this.rdr        = rdr;
 }
Exemplo n.º 14
0
 private PefContainer LoadContainer(EndianByteImageReader rdr)
 {
     return(PefContainer.Load(rdr));
 }
Exemplo n.º 15
0
 private PEFSectionHeader(EndianByteImageReader rdr)
 {
     this = rdr.ReadStruct <PEFSectionHeader>();
 }
Exemplo n.º 16
0
 public static PEFSectionHeader Load(EndianByteImageReader rdr) => new PEFSectionHeader(rdr);
Exemplo n.º 17
0
 private PEFLoaderInfoHeader(EndianByteImageReader rdr)
 {
     this = rdr.ReadStruct <PEFLoaderInfoHeader>();
 }
Exemplo n.º 18
0
 public static PEFContainerHeader Load(EndianByteImageReader rdr) => new PEFContainerHeader(rdr);
Exemplo n.º 19
0
 public static PEFLoaderInfoHeader Load(EndianByteImageReader rdr) => new PEFLoaderInfoHeader(rdr);