2010-02-10 9 views
13

Desidero scrivere il tracciante di una piccola funzione. Io uso ptrace. Sono su ubuntu x86_64. Voglio trovare l'indirizzo della funzione di libreria condivisa (come printf).Leggere la voce GOT in Elf Binary

Ma ho qualche problema e qualche domanda sul Global Offset Table. Ho il codice seguente:

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)); 

La funzione readMemory letto sulla memoria del processo tracciato.

Quando provo a leggere linkList->l_ld, sembra che non punti su una sezione dinamica.

Non sono sicuro che il mio codice sia corretto. Quando uso readelf, l'indirizzo della sezione GOT è lo stesso del mio programma trovato.

Devo leggere solo il primo offset della sezione GOT o più? Il punto di ingresso GOT contiene solo l'indirizzo assoluto che punta a struct link_map?

Grazie.

+0

Conosco un po 'di C, ma non so C++. Ma comunque, non sono in grado di capire questa domanda. Dovrebbe essere ritradotto come C++ ??? – Alphaneo

+0

Poiché la fonte fornita è C++, ho riadattato la domanda. – jschmier

risposta

0

Probabilmente dovresti esaminare il simbolo _DYNAMIC Elf, che è dove sono.

2

C'è già un'implementazione di questo obiettivo
http://binary.nahi.to/hogetrace/

Il punto in discussione è fatto usando libreria BFD.

Non così famoso come altri programmi di tracciamento, ma questo è il migliore che conosco.

... Tranne il punto questo ha un overhead piuttosto significativo per l'iniezione di tutti i breakpoint.

E il punto che mi dispiace è che ha bisogno di funzionalità PTRACE_SINGLESTEP, che non è sempre disponibile per ogni architettura della CPU, come MIPS ...