【发布时间】:2011-01-15 01:34:48
【问题描述】:
我想写一个小函数的跟踪器。我使用 ptrace。
我在 ubuntu x86_64 上。我想找到共享库函数的地址(比如printf)。
但是我有一些关于全局偏移表的问题和疑问。 我有以下代码:
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的绝对地址?
谢谢。
【问题讨论】:
-
我懂一点C,但不懂C++。但无论如何,我无法理解这个问题。这应该重新标记为 c++ 吗???
-
由于提供的源代码是 c++,我重新标记了这个问题。