2010-02-10 5 views
13

약간의 함수 트레이서를 쓰고 싶습니다. 나는 ptrace를 사용한다. 우분투 x86_64에 있습니다. 공유 라이브러리 기능 (예 : printf)의 주소를 찾고 싶습니다.엘프 바이너리에서 GOT 항목 읽기

하지만 글로벌 오프셋 테이블에 대한 몇 가지 질문과 질문이 있습니다.

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

추적 된 프로세스의 메모리에 읽기 기능 readMemory : 나는 다음과 같은 코드가 있습니다.

linkList->l_ld을 읽으려고 할 때 동적 섹션을 가리 키지 않는 것 같습니다.

내 코드가 맞는지 잘 모르겠습니다. readelf을 사용하면 GOT 섹션의 주소가 내 프로그램과 동일합니다.

GOT 섹션 이상의 첫 번째 오프셋 만 읽어야합니까? GOT 진입 점에는 struct link_map을 가리키는 절대 주소 만 포함됩니까?

감사합니다.

+0

나는 C의 조금 알고 있지만, C++을 잘 모릅니다. 그러나 어쨌든, 나는이 질문을 이해할 수 없다. 이것은 C++로 재 태그되어야 하는가 ??? – Alphaneo

+0

제공된 소스가 C++이므로 질문의 태그를 다시 지정했습니다. – jschmier

답변

0

아마 _DYNAMIC 엘프 기호를 살펴 봐야 할 것입니다.

2

이미 의문을 제기 포인트는 BFD 라이브러리를 사용하여 수행이 목표
http://binary.nahi.to/hogetrace/

의 구현이있다.

다른 추적 프로그램만큼 유명하지는 않지만이 중 하나가 내가 아는 최고의 파일입니다.

...이 점을 제외하고는 모든 중단 점 주입에 상당한 오버 헤드가 있습니다.

그리고 후회 요점은 항상 같은 MIPS 등의 모든 CPU 아키텍처를 사용할 수 없습니다 PTRACE_SINGLESTEP 기능을 필요로한다는 것입니다 ...

관련 문제