Example #1
0
        /// <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);
            }
        }
Example #2
0
 /// <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);
         }
     }
 }
Example #3
0
        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);
        }
Example #4
0
        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);
        }