2010-02-10 18 views
13

Quiero escribir el pequeño trazador de una función. Yo uso ptrace. Estoy en ubuntu x86_64. Quiero encontrar la dirección de la función de biblioteca compartida (como printf).Leer la entrada GOT en Elf Binary

Pero tengo algunos problemas y algunas preguntas sobre la tabla de compensación global. Tengo el siguiente código:

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 función readMemory leer en la memoria del proceso de trazado.

Cuando intento leer el linkList->l_ld, no parece apuntar en una sección dinámica.

No estoy seguro de que mi código sea correcto. Cuando uso readelf, la dirección de la sección GOT es la misma que la encontrada en mi programa.

Debo leer solo el primer desplazamiento de la sección GOT o más? El punto de entrada GOT contiene solo la dirección absoluta que apunta a struct link_map?

Gracias.

+0

Conozco un poco de C, pero no saben C++. Pero de todos modos, no puedo entender esta pregunta. ¿Debería repasarse como C++? – Alphaneo

+0

Dado que la fuente proporcionada es C++, he resuelto la pregunta. – jschmier

Respuesta

0

Probablemente deberías mirar el símbolo _DYNAMIC Elf, ahí es donde estoy.

2

Ya hay una implementación para este objetivo
http://binary.nahi.to/hogetrace/

El punto cuestionado se hace usando la biblioteca BFD.

No es tan famoso como otros programas de rastreo, pero este es el mejor que conozco.

... Excepto por el hecho de que esto tiene una sobrecarga bastante significativa para inyectar todos los puntos de interrupción.

Y el punto que lamento es que necesita funcionalidad PTRACE_SINGLESTEP, que no siempre está disponible para todas las arquitecturas de CPU tales como MIPS ...

Cuestiones relacionadas