2010-02-10 12 views
13

Küçük bir işlev izleyicisi yazmak istiyorum. Ben ptrace kullanıyorum. Ben ubuntu x86_64'deyim. Paylaşılan kitaplık işlevinin adresini (printf gibi) bulmak istiyorum.Elf Binary'deki GOT girişini oku

Ancak, Global Ofset Tablosu ile ilgili bir sorunum ve bazı sorularım var.

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

takip sürecinin belleğine okuma işlevi readMemory: Aşağıdaki kod var.

linkList->l_ld'u okumaya çalıştığımda, dinamik bir bölüme işaret etmiyor gibi görünüyor.

Kodumun doğru olduğundan emin değilim. readelf'u kullandığımda, GOT bölümünün adresi programımınkiyle aynı.

GOT bölümünün yalnızca ilk ofsetini mi okumalıyım yoksa daha fazlası mı? GOT giriş noktası sadece struct link_map'a işaret eden mutlak adresi içeriyor mu?

Teşekkür ederiz.

+0

Ben C biraz biliyorum ama C++ bilmiyorum. Ama yine de, bu soruyu anlayamıyorum. Bu C++ olarak yeniden etiketlenir mi ??? – Alphaneo

+0

Sağlanan kaynak C++ olduğu için, soruyu yeniden etiketledim. – jschmier

cevap

0

Muhtemelen _DYNAMIC Elf sembolüne bakmalısınız, işte benim yerim.

2

zaten sorgulandığı nokta bfd kütüphane kullanılarak gerçekleştirilir bu hedefe
http://binary.nahi.to/hogetrace/

için bir uygulama var.

Diğer izleme programları kadar ünlü değil, ancak bildiğim en iyisi bu.

Bu nokta haricinde, tüm kesme noktalarını enjekte etmek için oldukça önemli bir yük vardır.

Ve pişman nokta her zaman böyle MIPS olarak her cpu mimarisi için kullanılamaz PTRACE_SINGLESTEP işlevselliği, gereksinim duymasıdır ...