查找和编辑已加载程序的动态符号表?

时间:2015-04-20 03:47:17

标签: linux linker shared-libraries elf dynamic-linking

我的目标在这个问题中解释HERE

是否可以在加载到程序中的动态符号表中找到符号条目的地址? 如果我们可以找到它,我们可以以某种方式编辑它吗?例如,如果应用程序调用了一个名为original_func的函数,那么控件实际上应该来到我的hook_func,并从那里调用original_func。

更新

根据'雇用俄语'的答案的一些代码:

extern Elf32_Dyn    _DYNAMIC[];

int i=0;
uint32_t DST_base_addr;
Elf32_Dyn *dyn;
for (dyn = _DYNAMIC; dyn->d_tag != DT_NULL; ++dyn)
{

    if(dyn->d_tag==DT_SYMTAB)
    {
        DST_base_addr=dyn->d_un.d_ptr;

        LOGE("Base address of dynamic symbol table is; 0x%x",  DST_base_addr);
        break;
    }

}

输出:0x148

1-不确定0x148的含义。这绝对不是一个绝对的地址。

2-此外,我在哪里可以找到这些有用的预定义变量的良好列表,例如_DYNAMIC [] _GLOBAL_OFFSET_TABLE_等?即使我在这里和那里经历了ELF笔记,我也不太了解这些变量。

1 个答案:

答案 0 :(得分:1)

  

是否可以在加载到程序中的动态符号表中找到符号条目的地址?

是的,它非常简单:迭代_DYNAMIC[]数组的元素,直到找到带有.d_tag == DT_SYMTAB的元素。该条目的.d_un.d_ptr将指向内存中的动态符号表。

要查找特定符号,您还需要参考DT_STRTAB

  

如果我们可以找到它,我们可以以某种方式编辑它吗?

当然:它只是一个记忆位置。您可能需要mprotect它是可写的,但是一旦您这样做,您就可以根据自己的内容对其进行修改。

但是,大多数修改都不起作用,或导致程序稍后崩溃。

  

例如,如果应用程序调用了一个名为original_func的函数,那么控件实际上应该来到我的hook_func,并从那里调用original_func。

使用这种特殊方法很难达到既定目标,并且存在更简单的方法。

也许您正在寻找this