Linux 定位和编辑加载程序的动态符号表?

Linux 定位和编辑加载程序的动态符号表?,linux,linker,shared-libraries,elf,dynamic-linking,Linux,Linker,Shared Libraries,Elf,Dynamic Linking,这个问题解释了我的目标 是否可以在加载到程序中的动态符号表中找到符号项的地址? 如果我们能找到它,我们能以某种方式编辑它吗?例如,如果应用程序调用了一个名为original_func的函数,那么该控件实际上应该到达我的hook_func,从那里我调用original_func 更新: 根据“雇佣俄罗斯人”的回答,一些代码: extern Elf32_Dyn _DYNAMIC[]; int i=0; uint32_t DST_base_addr; Elf32_Dyn *dyn; for (

这个问题解释了我的目标

是否可以在加载到程序中的动态符号表中找到符号项的地址? 如果我们能找到它,我们能以某种方式编辑它吗?例如,如果应用程序调用了一个名为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笔记的时候,我也不太清楚这些变量

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

是的,这非常简单:迭代
\u DYNAMIC[]
数组的元素,直到找到一个
.d\u tag==DT\u SYMTAB
的元素。该条目的
.d_un.d_ptr
将指向内存中的动态符号表

要查找特定符号,还需要参考
DT\u STRTAB

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

当然,它只是一个内存位置。您可能需要
m保护它,使其可写,但一旦这样做,您就可以随心所欲地修改它

但是,大多数修改要么没有效果,要么导致程序稍后崩溃

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

使用这种特殊的方法很难实现您的既定目标,而且存在更简单的方法


也许你在寻找?

那么你为什么要创造新的问题呢?这个问题更具体,而我之前的问题涵盖的范围更广。我在这个问题上所问的,如果那不可能,那么我之前的问题仍然有效;i、 e.在不编辑动态符号表的情况下找到解决方案。谢谢。_DYNAMIC[]数组是否已在C程序中定义?或者我必须通过ELF header?@Usman.3D解析将数据读入其中,它已经定义,并初始化为与可执行文件的
.dynamic
部分重叠。谢谢,我更新了我的问题。另外,我认为“节”只属于共享库,而加载的程序只有段?