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