我的目标在这个问题中解释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笔记,我也不太了解这些变量。
答案 0 :(得分:1)
是否可以在加载到程序中的动态符号表中找到符号条目的地址?
是的,它非常简单:迭代_DYNAMIC[]
数组的元素,直到找到带有.d_tag == DT_SYMTAB
的元素。该条目的.d_un.d_ptr
将指向内存中的动态符号表。
要查找特定符号,您还需要参考DT_STRTAB
。
如果我们可以找到它,我们可以以某种方式编辑它吗?
当然:它只是一个记忆位置。您可能需要mprotect
它是可写的,但是一旦您这样做,您就可以根据自己的内容对其进行修改。
但是,大多数修改都不起作用,或导致程序稍后崩溃。
例如,如果应用程序调用了一个名为original_func的函数,那么控件实际上应该来到我的hook_func,并从那里调用original_func。
使用这种特殊方法很难达到既定目标,并且存在更简单的方法。
也许您正在寻找this?