public const short IMAGE_REL_MIPS_PAIR = 0x0025; // This relocation is only valid when it immediately follows a REFHI or SECRELHI relocation. Its SymbolTableIndex contains a displacement and not an index into the symbol table. public override void ApplyRelocation(Address baseOfImage, uint page, ImageReader rdr, RelocationDictionary relocations) { ushort fixup = rdr.ReadUInt16(); Address offset = baseOfImage + page + (fixup & 0x0FFFu); var imgR = program.CreateImageReader(offset); var imgW = program.CreateImageWriter(offset); uint w = imgR.ReadUInt32(); int s; switch (fixup >> 12) { case IMAGE_REL_MIPS_ABSOLUTE: // Used for padding to 4-byte boundary, ignore. break; case IMAGE_REL_MIPS_REFWORD: break; case IMAGE_REL_MIPS_JMPADDR: break; case IMAGE_REL_MIPS_REFHI: w = imgR.ReadUInt32(); //w += (fixup & 0x0FFFu); //imgW.WriteUInt32(w); s = rdr.ReadInt16(); w = (uint)(w + s); // w points to something. break; case IMAGE_REL_MIPS_REFLO: // w points to something. break; default: dcSvc.Warn( dcSvc.CreateAddressNavigator(program, offset), string.Format( "Unsupported MIPS PE fixup type: {0:X}", fixup >> 12)); break; } }
/// <summary> /// Reads the ELF header. /// </summary> /// <returns></returns> private Elf32_Ehdr ReadElfHeaderStart() { var rdr = new ImageReader(RawImage, 0); var h = new Elf32_Ehdr(); h.e_ident = rdr.ReadBeUInt32(); h.e_class = rdr.ReadByte(); h.endianness = rdr.ReadByte(); h.version = rdr.ReadByte(); h.osAbi = rdr.ReadByte(); rdr.Seek(8); // 8 bytes of padding. // Now that we know the endianness, read the remaining fields in endian mode. rdr = CreateImageReader(h.endianness, rdr.Offset); h.e_type = rdr.ReadInt16(); h.e_machine = rdr.ReadInt16(); h.e_version = rdr.ReadInt32(); h.e_entry = rdr.ReadUInt32(); h.e_phoff = rdr.ReadUInt32(); h.e_shoff = rdr.ReadUInt32(); h.e_flags = rdr.ReadInt32(); h.e_ehsize = rdr.ReadInt16(); h.e_phentsize = rdr.ReadInt16(); h.e_phnum = rdr.ReadInt16(); h.e_shentsize = rdr.ReadInt16(); h.e_shnum = rdr.ReadInt16(); h.e_shstrndx = rdr.ReadInt16(); Dump("e_type: {0}", h.e_type); Dump("e_machine: {0}", (MachineType) h.e_machine); Dump("e_version: {0}", h.e_version); Dump("e_entry: {0:X}", h.e_entry); Dump("e_phoff: {0:X}", h.e_phoff); Dump("e_shoff: {0:X}", h.e_shoff); Dump("e_flags: {0:X}", h.e_flags); Dump("e_ehsize: {0}", h.e_ehsize); Dump("e_phentsize: {0}", h.e_phentsize); Dump("e_phnum: {0}", h.e_phnum); Dump("e_shentsize: {0}", h.e_shentsize); Dump("e_shnum: {0}", h.e_shnum); Dump("e_shstrndx: {0}", h.e_shstrndx); return h; }