Поиск и редактирование динамической таблицы символов загруженной программы?
Моя цель объясняется в этом вопросе ЗДЕСЬ
Можно ли найти адрес записи символа в динамической таблице символов, загруженной в программу? Если мы можем найти это, мы можем редактировать это как-нибудь? Например, если приложение вызвало функцию с именем 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 ответ
Можно ли найти адрес записи символа в динамической таблице символов, загруженной в программу?
Да, это довольно легко: перебрать элементы _DYNAMIC[]
массив, пока вы не найдете элемент с .d_tag == DT_SYMTAB
, .d_un.d_ptr
этой записи будет указывать на динамическую таблицу символов в памяти.
Чтобы найти конкретный символ, вам также необходимо обратиться к DT_STRTAB
,
Если мы можем найти это, мы можем редактировать это как-нибудь?
Конечно, это просто место в памяти. Вам может понадобиться mprotect
это может быть доступно для записи, но как только вы это сделаете, вы можете изменить его по своему усмотрению.
Однако большинство модификаций либо не будут иметь эффекта, либо приведут к сбою вашей программы позже.
Например, если приложение вызвало функцию с именем original_func, тогда элемент управления должен фактически прийти к моему hook_func, и оттуда я вызываю original_func.
С помощью этого конкретного метода довольно сложно достичь поставленной цели, и существуют гораздо более простые методы.
Возможно, вы ищете это?