예제 #1
0
 public static UInt16 ReadUInt16(this System.IO.Stream stream, ElfDocumentHeader header)
 {
     byte[] buf = new byte[2];
     stream.Read(buf, 0, 2);
     header.ResortArray(buf);
     return(BitConverter.ToUInt16(buf, 0));
 }
예제 #2
0
        public static byte[] ResortArray(this ElfDocumentHeader header, byte[] src)
        {
            if (BitConverter.IsLittleEndian == header.Head_IsLittleEndian)
            {
                return(src);
            }

            byte[] dest = new byte[src.Length];
            unsafe
            {
                int last   = src.Length - 1;
                int forlen = src.Length / 2;
                fixed(byte *_src = src)
                {
                    for (var i = 0; i < forlen; i++)
                    {
                        //a = i;
                        //b = last-i;
                        byte t = _src[i];
                        byte b = _src[last - i];
                        _src[i]        = b;
                        _src[last - i] = t;
                    }
                }
            }
            return(src);
        }
예제 #3
0
 public static Int64 ReadInt64(this System.IO.Stream stream, ElfDocumentHeader header)
 {
     byte[] buf = new byte[8];
     stream.Read(buf, 0, 8);
     header.ResortArray(buf);
     return(BitConverter.ToInt64(buf, 0));
 }
예제 #4
0
 public static UInt64 ReadUIntPtr(this System.IO.Stream stream, ElfDocumentHeader header)
 {
     if (header.Head_Is64Bit)
     {
         return(ReadUInt64(stream, header));
     }
     else
     {
         return(ReadUInt32(stream, header));
     }
 }
예제 #5
0
        public void Read(System.IO.Stream stream, ElfDocumentHeader header)
        {
            NameIndex = stream.ReadUInt32(header);
            Type      = (SectionType)stream.ReadUInt32(header);
            var RawFlags = stream.ReadUIntPtr(header);

            Flags            = unchecked ((SectionFlags)RawFlags);
            Flag_Writable    = (Flags & SectionFlags.Writable) > 0;
            Flag_Allocatable = (Flags & SectionFlags.Allocatable) > 0;
            Flag_Executable  = (Flags & SectionFlags.Executable) > 0;

            LoadAddress = stream.ReadUIntPtr(header);
            Offset      = stream.ReadUIntPtr(header);
            Size        = stream.ReadUIntPtr(header);
            Link        = stream.ReadUInt32(header);
            Info        = stream.ReadUInt32(header);
            Alignment   = stream.ReadUIntPtr(header);
            EntrySize   = stream.ReadUIntPtr(header);
        }
예제 #6
0
 public void Read(System.IO.Stream stream)
 {
     //read header;
     this.header = new ElfDocumentHeader();
     header.Read(stream);
     //read sectionheaders
     sectionHeaders.Clear();
     for (var i = 0; i < header.Head_SectionHeaderEntryCount; i++)
     {
         long offset = (long)header.Head_SectionHeaderOffset + (long)i * header.Head_SectionHeaderEntrySize;
         stream.Seek(offset, System.IO.SeekOrigin.Begin);
         ElfSectionHeader _header = new ElfSectionHeader();
         _header.Read(stream, header);
         long offsetend = stream.Position;
         var  size      = offsetend - offset;
         if (size != header.Head_SectionHeaderEntrySize)
         {
             throw new Exception("Error Section Read");
         }
         sectionHeaders.Add(_header);
     }
     //read sectiondata
     sectionRaws.Clear();
     for (var i = 0; i < header.Head_SectionHeaderEntryCount; i++)
     {
         byte[] data   = new byte[this.sectionHeaders[i].Size];
         var    offset = (int)this.sectionHeaders[i].Offset;
         stream.Seek(offset, System.IO.SeekOrigin.Begin);
         stream.Read(data, 0, data.Length);
         sectionRaws.Add(data);
     }
     //read segmentheaders
     for (var i = 0; i < header.Head_SegmentHeaderEntryCount; i++)
     {
         long offset = (long)header.Head_SegmentHeaderOffset + (long)i * header.Head_SegmentHeaderEntrySize;
         stream.Seek(offset, System.IO.SeekOrigin.Begin);
         ElfSegmentHeader segment = new ElfSegmentHeader();
         segment.Read(stream, header);
         segments.Add(segment);
     }
     Read_StringTable();
 }
예제 #7
0
        public void Read(System.IO.Stream stream, ElfDocumentHeader header)
        {
            Type = (SegmentType)stream.ReadUInt32(header);

            if (header.Head_Is64Bit)
            {
                Flags = (SegmentFlags)stream.ReadUInt32(header);
            }
            // TODO: some functions?s
            Offset          = stream.ReadUIntPtr(header);
            Address         = stream.ReadUIntPtr(header);
            PhysicalAddress = stream.ReadUIntPtr(header);
            FileSize        = stream.ReadUIntPtr(header);
            Size            = stream.ReadUIntPtr(header);
            if (!header.Head_Is64Bit)
            {
                Flags = (SegmentFlags)stream.ReadUInt32(header);
            }

            Alignment = stream.ReadUIntPtr(header);
        }
예제 #8
0
 public static bool NeedTurn(this ElfDocumentHeader header)
 {
     return(BitConverter.IsLittleEndian != header.Head_IsLittleEndian);
 }