2010-02-10 4 views
13

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.

+0

weiß, dass ich ein bisschen von C, aber C++ weiß nicht. Aber ich kann diese Frage nicht verstehen. Soll das als C++ ??? – Alphaneo

+0

Da die Quelle C++ ist, habe ich die Frage neu geschrieben. – jschmier

Antwort

0

Sie sollten wahrscheinlich in das _DYNAMIC Elf Symbol schauen, das ist, wo ich bin.

2

Es gibt bereits eine Implementierung für dieses Ziel
http://binary.nahi.to/hogetrace/

Der in Frage gestellt Punkt BFD-Bibliothek erfolgt über.

Nicht so berühmt wie andere Tracing-Programme, aber dieses ist das beste, das ich kenne.

... Abgesehen von dem Punkt hat dies ziemlich viel Aufwand für die Injektion aller Haltepunkte.

Und der Punkt, den ich bedauere, ist, dass es PTRACE_SINGLESTEP Funktionalität benötigt, die für jede CPU-Architektur wie MIPS nicht immer verfügbar ist ...