Ich möchte eine kleine Funktion Tracer schreiben. Ich benutze ptrace. Ich bin auf Ubuntu x86_64. Ich möchte die Adresse der Shared-Library-Funktion (wie printf
) finden.Read GOT Eintrag in Elf Binary
Aber ich habe ein Problem und eine Frage über die Global Offset Tabelle. Ich habe den folgenden Code:
size_t baseAddress = this->getBaseAddress();
Elf_Ehdr const * headerElf = static_cast<Elf_Ehdr const *> (this->_manager.readMemory((void*) baseAddress, sizeof (Elf_Ehdr)));
Elf_Phdr const * headerProgram = static_cast<Elf_Phdr const *> (this->_manager.readMemory((void*) (baseAddress + headerElf->e_phoff), headerElf->e_phentsize * headerElf->e_phnum));
unsigned int i = 0;
while (headerProgram[i].p_type != PT_DYNAMIC)
{
++i;
}
size_t addrToRead = headerProgram[i].p_vaddr;
Elf_Dyn const * dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn)));
while (dynSection->d_tag != DT_PLTGOT)
{
addrToRead += sizeof (Elf_Dyn);
dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn)));
}
size_t addrGot = dynSection->d_un.d_ptr/* + (4 * sizeof (Elf64_Word))*/;
std::cout << "addr got = " << std::hex << "0x" << dynSection->d_un.d_ptr << " 0x" << addrGot << std::endl;
Elf64_Word const * temp = (Elf64_Word const *) this->_manager.readMemory((void*) addrGot, sizeof (Elf64_Word));
struct link_map * linkList = (struct link_map *) this->_manager.readMemory((void*) *temp, sizeof (struct link_map));
Die Funktion readMemory
auf dem Speicher des verfolgten Prozesses lesen.
Wenn ich versuche, die linkList->l_ld
zu lesen, scheint es nicht auf einen dynamischen Abschnitt zu zeigen.
Ich bin mir nicht sicher, ob mein Code korrekt ist. Wenn ich readelf
verwende, ist die Adresse des GOT-Abschnitts die gleiche wie mein Programm.
Ich muss nur den ersten Offset des GOT-Abschnitts oder mehr lesen? Der GOT-Einstiegspunkt enthält nur die absolute Adresse, die auf struct link_map
zeigt?
Vielen Dank.
weiß, dass ich ein bisschen von C, aber C++ weiß nicht. Aber ich kann diese Frage nicht verstehen. Soll das als C++ ??? – Alphaneo
Da die Quelle C++ ist, habe ich die Frage neu geschrieben. – jschmier