2010-02-10 26 views
13

Tôi muốn viết dấu vết của hàm nhỏ. Tôi sử dụng ptrace. Tôi đang sử dụng ubuntu x86_64. Tôi muốn tìm địa chỉ của hàm thư viện được chia sẻ (như printf).Đọc mục nhập GOT trong Elf Binary

Nhưng tôi có một số vấn đề và một số câu hỏi về Bảng bù đắp toàn cầu. Tôi có đoạn mã sau:

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

Chức năng readMemory đọc trên ký ức về quá trình truy tìm.

Khi tôi cố gắng đọc linkList->l_ld, dường như nó không trỏ đến phần động.

Tôi không chắc chắn mã của mình là chính xác. Khi tôi sử dụng readelf, địa chỉ của phần GOT giống với chương trình của tôi được tìm thấy.

Tôi chỉ được đọc phần bù đầu tiên của phần GOT trở lên? Điểm vào GOT chỉ chứa địa chỉ tuyệt đối trỏ đến struct link_map?

Cảm ơn bạn.

+0

tôi biết một chút về C, nhưng không biết C++. Nhưng dù sao, tôi không thể hiểu Câu hỏi này. Điều này có nên được gắn thẻ lại thành C++ ??? – Alphaneo

+0

Vì nguồn được cung cấp là C++, tôi đã gắn thẻ lại câu hỏi. – jschmier

Trả lời

0

Bạn có thể nên nhìn vào biểu tượng Elf _DYNAMIC, đó là nơi tôi đang ở.

2

Có đã là một thực hiện cho mục tiêu này
http://binary.nahi.to/hogetrace/

Điểm chất vấn được thực hiện sử dụng thư viện BFD.

Không nổi tiếng như các chương trình truy tìm khác, nhưng đây là chương trình tốt nhất mà tôi biết.

... Ngoại trừ điểm này có chi phí khá đáng kể để tiêm tất cả các điểm ngắt.

Và điểm tôi lấy làm tiếc là nó cần chức năng PTRACE_SINGLESTEP, mà không phải lúc nào cũng có sẵn cho tất cả các kiến ​​trúc CPU như MIPS ...