int GetSectionHeaderEntryNum(FileInterface elf) { if (GetElfBitWidth(elf) == 32) { return(BitConverter.ToUInt16(elf.PeekBytes(0x30, 2).Reverse().ToArray(), 0)); } else //assume it's 64-bit { return(BitConverter.ToUInt16(elf.PeekBytes(0x3C, 2).Reverse().ToArray(), 0)); } }
long GetSectionHeaderTableOffset(FileInterface elf) { if (GetElfBitWidth(elf) == 32) { return(BitConverter.ToUInt32(elf.PeekBytes(0x20, 4).Reverse().ToArray(), 0)); } else //assume it's 64-bit { return((long)BitConverter.ToUInt64(elf.PeekBytes(0x28, 8).Reverse().ToArray(), 0)); } }
long GetSectionSegmentSize(FileInterface elf, int segment) { if (GetElfBitWidth(elf) == 32) { long headeroffset = GetSectionHeaderTableOffset(elf) + (0x28 * Convert.ToInt64(segment)); return(BitConverter.ToUInt32(elf.PeekBytes(Convert.ToInt64(headeroffset) + 0x14, 4).Reverse().ToArray(), 0)); } else { long headeroffset = GetSectionHeaderTableOffset(elf) + (0x40 * Convert.ToInt64(segment)); return((long)BitConverter.ToUInt64(elf.PeekBytes(Convert.ToInt64(headeroffset) + 0x20, 8).Reverse().ToArray(), 0)); } }
long GetShstrOffset(FileInterface elf) { if (GetElfBitWidth(elf) == 32) { int segmentindex = BitConverter.ToUInt16(elf.PeekBytes(0x32, 2).Reverse().ToArray(), 0); return(BitConverter.ToUInt32(elf.PeekBytes(GetSectionHeaderTableOffset(elf) + (0x28 * Convert.ToInt64(segmentindex)) + 10, 4).Reverse().ToArray(), 0)); } else { int segmentindex = BitConverter.ToUInt16(elf.PeekBytes(0x3E, 2).Reverse().ToArray(), 0); return((long)BitConverter.ToUInt64(elf.PeekBytes(GetSectionHeaderTableOffset(elf) + (0x40 * Convert.ToInt64(segmentindex)) + 10, 8).Reverse().ToArray(), 0)); } }
long GetProgramSegmentOffset(FileInterface elf, int segment) { if (GetElfBitWidth(elf) == 32) { long headeroffset = GetProgramHeaderTableOffset(elf) + (0x20 * Convert.ToInt64(segment)); return(BitConverter.ToUInt32(elf.PeekBytes(Convert.ToInt64(headeroffset) + 0x04, 4).Reverse().ToArray(), 0)); } else { long headeroffset = GetProgramHeaderTableOffset(elf) + (0x38 * Convert.ToInt64(segment)); return((long)BitConverter.ToUInt64(elf.PeekBytes(Convert.ToInt64(headeroffset) + 0x08, 8).Reverse().ToArray(), 0)); } }
string GetSectionSegmentName(FileInterface elf, int segment) { if (GetElfBitWidth(elf) == 32) { long headeroffset = GetSectionHeaderTableOffset(elf) + (0x28 * Convert.ToInt64(segment)); long stroffset = BitConverter.ToUInt32(elf.PeekBytes(headeroffset, 4).Reverse().ToArray(), 0); if (GetShstrOffset(elf) == 0) { return(" "); } return(System.Text.Encoding.ASCII.GetString(elf.PeekBytes(GetShstrOffset(elf) + stroffset, 8))); } else { long headeroffset = GetSectionHeaderTableOffset(elf) + (0x40 * Convert.ToInt64(segment)); long stroffset = (long)BitConverter.ToUInt64(elf.PeekBytes(headeroffset, 8).Reverse().ToArray(), 0); if (GetShstrOffset(elf) == 0) { return(" "); } return(System.Text.Encoding.ASCII.GetString(elf.PeekBytes(GetShstrOffset(elf) + stroffset, 8))); } }