Linux 定位和编辑加载程序的动态符号表?
这个问题解释了我的目标 是否可以在加载到程序中的动态符号表中找到符号项的地址? 如果我们能找到它,我们能以某种方式编辑它吗?例如,如果应用程序调用了一个名为original_func的函数,那么该控件实际上应该到达我的hook_func,从那里我调用original_func 更新: 根据“雇佣俄罗斯人”的回答,一些代码: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 (
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
部分重叠。谢谢,我更新了我的问题。另外,我认为“节”只属于共享库,而加载的程序只有段?