Read ПОЛУЧИЛ запись в Двоичном файле Эльфа

Я хочу записать трассировщик небольшой функции. Я использую ptrace. Я нахожусь на человечности x86_64. Я хочу к найденному адрес общей библиотечной функции (как printf).

Но у меня есть некоторая проблема и некоторый вопрос о Глобальной Таблице Смещения. У меня есть следующий код:

size_t baseAddress = this->getBaseAddress();
Elf_Ehdr const * headerElf = static_cast<Elf_Ehdr const *> (this->_manager.readMemory((void*) baseAddress, sizeof (Elf_Ehdr)));
Elf_Phdr const * headerProgram = static_cast<Elf_Phdr const *> (this->_manager.readMemory((void*) (baseAddress + headerElf->e_phoff), headerElf->e_phentsize * headerElf->e_phnum));
unsigned int i = 0;
while (headerProgram[i].p_type != PT_DYNAMIC)
{
    ++i;
}
size_t addrToRead = headerProgram[i].p_vaddr;
Elf_Dyn const * dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn)));
while (dynSection->d_tag != DT_PLTGOT)
{
    addrToRead += sizeof (Elf_Dyn);
    dynSection = static_cast<Elf_Dyn const *> (this->_manager.readMemory((void*) addrToRead, sizeof (Elf_Dyn)));
}

size_t addrGot = dynSection->d_un.d_ptr/* + (4 * sizeof (Elf64_Word))*/;
std::cout << "addr got = " << std::hex << "0x" << dynSection->d_un.d_ptr << " 0x" << addrGot << std::endl;

Elf64_Word const * temp = (Elf64_Word const *) this->_manager.readMemory((void*) addrGot, sizeof (Elf64_Word));
struct link_map * linkList = (struct link_map *) this->_manager.readMemory((void*) *temp, sizeof (struct link_map));

Функция readMemory читайте на памяти прослеженного процесса.

Когда я пытаюсь читать linkList->l_ld, это, кажется, не указывает на динамическом разделе.

Я не уверен, что мой код является правильным. Когда я использую readelf, адрес раздела GOT является тем же, чем моя найденная программа.

Я должен только для чтения первое смещение раздела GOT или больше? ПОЛУЧЕННАЯ точка входа содержит только абсолютный адрес та точка к struct link_map?

Спасибо.

13
задан jschmier 10 February 2010 в 15:05
поделиться

2 ответа

Вы, наверное, должны посмотреть на символ _DYNAMIC Elf, вот где я.

0
ответ дан 2 December 2019 в 02:23
поделиться

Для этой задачи уже есть реализация
http://binary.nahi.to/hogetrace/

Опрошенный пункт выполнен с использованием библиотеки bfd.

Не так известна, как другие программы трассировки, но эта - лучшая из тех, что я знаю.

...За исключением того, что она имеет довольно значительные накладные расходы на установку всех точек останова.

И еще один момент, о котором я сожалею, это то, что ей нужна функциональность PTRACE_SINGLESTEP, которая не всегда доступна для всех архитектур процессоров, таких как MIPS...

2
ответ дан 2 December 2019 в 02:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: