c++ - 读取 Elf Binary 中的 GOT 条目

标签 c++ linux elf

我想写一个小函数的跟踪器。我使用 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 的绝对地址?

谢谢。

最佳答案

这个目标已经有了一个实现
http://binary.nahi.to/hogetrace/

疑问点是使用bfd库完成的。

不像其他跟踪程序那样有名,但这是我所知道的最好的一个。

...除了这一点,这对于注入(inject)所有断点有相当大的开销。

而我遗憾的一点是它需要 PTRACE_SINGLESTEP 功能,这并不总是适用于 MIPS 等每个 cpu 架构...

关于c++ - 读取 Elf Binary 中的 GOT 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2233506/

相关文章:

c++ - 来自 testdome 的二叉搜索树

linux - 如何获取与导入库关联的函数名称

android - 如何在没有可写和可执行段的情况下为Android O编译.so?如何设置特定的ELF权限?

c - #define PI_THREAD(X) void *X (void *dummy)

c++ - Linux串口RAW模式

linux - Eclipse 与 powerpc-linux-gcc 可能吗?

linux - GDB 符号从哪里来?

c++ - 传递二维数组 C++

c++ - 当brew安装opencv3时,我得到警告,该公式没有--with-contrib选项

C++ typeid.name() 只返回 char "c"