示例#1
0
        internal ElfProgramHeader(Reader reader, bool is64bit, ulong headerPositon, long loadBias, bool isVirtual = false)
        {
            if (is64bit)
            {
                var header = reader.Read <ElfProgramHeader64>(headerPositon);
                _attributes    = (ElfProgramHeaderAttributes)header.Flags;
                Type           = header.Type;
                VirtualAddress = header.VirtualAddress;
                VirtualSize    = header.VirtualSize;
                FileOffset     = header.FileOffset;
                FileSize       = header.FileSize;
            }
            else
            {
                var header = reader.Read <ElfProgramHeader32>(headerPositon);
                _attributes    = (ElfProgramHeaderAttributes)header.Flags;
                Type           = header.Type;
                VirtualAddress = header.VirtualAddress;
                VirtualSize    = header.VirtualSize;
                FileOffset     = header.FileOffset;
                FileSize       = header.FileSize;
            }

            if (isVirtual)
            {
                ulong offset = (loadBias < 0) ? (ulong)((long)VirtualAddress + loadBias) : VirtualAddress + (ulong)loadBias;
                AddressSpace = new RelativeAddressSpace(reader.DataSource, "ProgramHeader", offset, VirtualSize);
            }
            else
            {
                ulong offset = (loadBias < 0) ? (ulong)((long)FileOffset + loadBias) : FileOffset + (ulong)loadBias;
                AddressSpace = new RelativeAddressSpace(reader.DataSource, "ProgramHeader", offset, FileSize);
            }
        }
示例#2
0
        public ElfProgramHeader(Reader reader, bool is64bit, long headerPositon, long fileOffset, bool isVirtual = false)
        {
            if (is64bit)
            {
                var header = reader.Read <ElfProgramHeader64>(headerPositon);
                _attributes    = (ElfProgramHeaderAttributes)header.Flags;
                Type           = header.Type;
                VirtualAddress = unchecked ((long)header.VirtualAddress);
                VirtualSize    = unchecked ((long)header.VirtualSize);
                FileOffset     = unchecked ((long)header.FileOffset);
                FileSize       = unchecked ((long)header.FileSize);
            }
            else
            {
                var header = reader.Read <ElfProgramHeader32>(headerPositon);
                _attributes    = (ElfProgramHeaderAttributes)header.Flags;
                Type           = header.Type;
                VirtualAddress = header.VirtualAddress;
                VirtualSize    = header.VirtualSize;
                FileOffset     = header.FileOffset;
                FileSize       = header.FileSize;
            }

            if (isVirtual && Type == ElfProgramHeaderType.Load)
            {
                AddressSpace = new RelativeAddressSpace(reader.DataSource, "ProgramHeader", VirtualAddress, VirtualSize);
            }
            else
            {
                AddressSpace = new RelativeAddressSpace(reader.DataSource, "ProgramHeader", fileOffset + FileOffset, FileSize);
            }
        }