/// <summary> /// Find the symbol stubs and add them to the <paramref name="imageSymbols"/> collection. /// </summary> /// <param name="machoSymbols"></param> /// <param name="imageSymbols"></param> private void CollectSymbolStubs( Parser parser, List <MachOSymbol> machoSymbols, SortedList <Address, ImageSymbol> imageSymbols) { var msec = this.sections.FirstOrDefault(s => (s.Flags & SectionFlags.SECTION_TYPE) == SectionFlags.S_SYMBOL_STUBS); if (msec == null) { return; } if (parser.dysymtab == null) { return; } var indirectSymRdr = program !.Architecture.Endianness.CreateImageReader(RawImage, parser.dysymtab.indirectsymoff); var sec = this.imageSections[msec]; trace.Inform("MachO: Found {0} import stubs", sec.Size / msec.Reserved2); for (uint off = 0; off < sec.Size; off += msec.Reserved2) { var addrStub = sec.Address + off; if (!indirectSymRdr.TryReadInt32(out int isym)) { break; } var sym = machoSymbols[isym]; trace.Verbose(" Stub at {0}: {1:X8}", addrStub, sym.Name); var stubSym = ImageSymbol.ExternalProcedure(program.Architecture, addrStub, sym.Name); imageSymbols.Add(addrStub, stubSym); } }
/// <summary> /// Find the symbol stubs and add them to the <paramref name="imageSymbols"/> collection. /// </summary> /// <param name="machoSymbols"></param> /// <param name="imageSymbols"></param> private void CollectSymbolStubs(List<MachOSymbol> machoSymbols, SortedList<Address, ImageSymbol> imageSymbols) { var msec = this.sections.FirstOrDefault(s => (s.Flags & SectionFlags.SECTION_TYPE) == SectionFlags.S_SYMBOL_STUBS); if (msec == null) return; var sec = this.imageSections[msec]; for (uint i = 0; i < sec.Size; i += msec.Reserved2) { var addrStub = sec.Address + i; var addr = parser.specific.ReadStub(addrStub, (ByteMemoryArea)sec.MemoryArea); if (program.ImportReferences.TryGetValue(addr, out var refe)) { var stubSym = ImageSymbol.ExternalProcedure(program.Architecture, addrStub, refe.EntryName); imageSymbols.Add(addrStub, stubSym); } } }
private List <ImageSymbol> ReadPltEntries(DlHeader dlhdr, SOM_Exec_aux_hdr exeAuxHdr, List <string> names, IProcessorArchitecture arch) { var rdr = MakeReader(exeAuxHdr.exec_dfile + dlhdr.plt_loc); var dlts = new List <ImageSymbol>(); for (int i = 0; i < dlhdr.plt_count; ++i) { var addr = Address.Ptr32(exeAuxHdr.exec_dmem + ((uint)rdr.Offset - exeAuxHdr.exec_dfile)); uint n = rdr.ReadUInt32(); uint m = rdr.ReadUInt32(); var name = names[i + dlhdr.dlt_count]; var pltEntry = ImageSymbol.ExternalProcedure(arch, Address.Ptr32(n), name); var pltGotEntry = ImageSymbol.DataObject(arch, addr, name + "@@GOT", PrimitiveType.Ptr32); dlts.Add(pltEntry); dlts.Add(pltGotEntry); } return(dlts); }
public void El32_Symbols_ReconstructPlt_BE() { var syms = new ImageSymbol[] { ImageSymbol.ExternalProcedure(arch.Object, Address.Ptr32(0x04000000), "strcpy"), ImageSymbol.ExternalProcedure(arch.Object, Address.Ptr32(0x04000010), "strcmp"), }.ToSortedList(k => k.Address); Given_ImageHeader(ElfMachine.EM_MIPS); Given_Program(); Given_BE32_GOT(0x0000000, 0x00000000, 0x04000010, 0x04000000); When_CreateLoader32(true); el32.LocateGotPointers(program, syms); Assert.AreEqual("strcmp_GOT", syms[Address.Ptr32(0x10000008)].Name); Assert.AreEqual("strcpy_GOT", syms[Address.Ptr32(0x1000000C)].Name); Assert.AreEqual(2, program.ImportReferences.Count); Assert.AreEqual("strcmp", program.ImportReferences[Address.Ptr32(0x10000008)].EntryName); Assert.AreEqual("strcpy", program.ImportReferences[Address.Ptr32(0x1000000C)].EntryName); }