Ejemplo n.º 1
0
        public ImmutableList <object> LoadMetadata()
        {
            var metadata = new List <object>();

            if (!stream.CanRead)
            {
                throw new ArgumentException("Stream is not available for reading", nameof(stream));
            }
            if (!stream.CanSeek)
            {
                throw new ArgumentException("Stream is not available for seeking", nameof(stream));
            }

            var elfFileHeader = new Header32();

            elfFileHeader.Read(stream);
            metadata.Add(elfFileHeader);

            stream.Seek((long)elfFileHeader.E_PHOFF, SeekOrigin.Begin);
            var programHeader = new ProgramHeader32();

            programHeader.Read(stream);
            metadata.Add(programHeader);

            return(metadata.ToImmutableList());
        }
Ejemplo n.º 2
0
        public LoaderResult32 LoadImage()
        {
            if (!stream.CanRead)
            {
                throw new ArgumentException("Stream is not available for reading", nameof(stream));
            }
            if (!stream.CanSeek)
            {
                throw new ArgumentException("Stream is not available for seeking", nameof(stream));
            }

            var elfFileHeader = new Header32();

            elfFileHeader.Read(stream);

            stream.Seek((long)elfFileHeader.E_PHOFF, SeekOrigin.Begin);
            var programHeader = new ProgramHeader32();

            programHeader.Read(stream);

            var    image       = new byte[(int)programHeader.P_FILESZ - elfFileHeader.E_EHSIZE - (elfFileHeader.E_PHNUM * elfFileHeader.E_PHENTSIZE)];
            UInt32 imageOffset =
                elfFileHeader.E_EHSIZE
                + (UInt32)elfFileHeader.E_EHSIZE.CalculateRoundUpTo16Pad()
                + (UInt32)(elfFileHeader.E_PHNUM * (elfFileHeader.E_PHENTSIZE + elfFileHeader.E_PHENTSIZE.CalculateRoundUpTo16Pad()));

            stream.Seek(imageOffset, SeekOrigin.Begin);
            stream.Read(image, 0, image.Length);

            return(new LoaderResult32(elfFileHeader.E_ENTRY - imageOffset, image,
                                      metadata: new object[] { elfFileHeader, programHeader }));
        }
Ejemplo n.º 3
0
 public static bool TryRead(Stream stream, out Header32 header)
 {
     try
     {
         header = new Header32();
         header.Read(stream);
         return(true);
     }
     catch (Exception)
     {
         header = default(Header32);
         return(false);
     }
 }
Ejemplo n.º 4
0
        public static bool IsFileType(Stream stream)
        {
            if (!stream.CanRead)
            {
                throw new ArgumentException("Stream is not available for reading", nameof(stream));
            }
            if (!stream.CanSeek)
            {
                throw new ArgumentException("Stream is not available for seeking", nameof(stream));
            }

            if (stream.Position != 0)
            {
                stream.Seek(0, SeekOrigin.Begin);
            }

            var magicBuffer = new byte[MAGIC.Length];
            var bytesRead   = stream.Read(magicBuffer, 0, MAGIC.Length);

            if (bytesRead != MAGIC.Length)
            {
                return(false);
            }
            var magicMatch = bytesRead == MAGIC.Length && Enumerable.SequenceEqual(MAGIC, magicBuffer);

            if (!magicMatch)
            {
                return(false);
            }

            stream.Seek(0, SeekOrigin.Begin);
            Header32 potentialHeader;

            if (!Header32.TryRead(stream, out potentialHeader))
            {
                return(false);
            }
            return(potentialHeader.EI_CLASS == HeaderIdentityClass.ELFCLASS32);
        }