Перемещение VDSO на лету
Я пытаюсь выделить новый VDSO внутри моей программы из дампа памяти. Я нахожусь на "Linux user1-vbox 3.2.0-55-generic-pae #85-Ubuntu SMP Ср 2 октября 14:03:15 UTC 2013 i686 i686 i386 GNU/Linux"
Проблема в:
- Замена памяти работает отлично
- вызов *%gs:0x10, который обычно вызывает __kernel_vsyscall, полностью потерян
Дело в том, что каждый раз, когда я запускаю свою программу, %gs одинаков (0x33), но должно быть что-то, что постоянно говорит процессу "VDSO здесь", и что я хотел бы изменить, чтобы сказать "эй, нет теперь ВДСО есть ".
Я немного искал в Google и обнаружил, что адрес VDSO хранится в памяти процесса с помощью двух переменных: AT_SYSINFO и AT_SYSINFO_EHDR. Оба принадлежат массиву с именем "auxv", который находится в стеке сразу после argc, argv и envp.
Но даже когда я изменяю это значение, мой процесс все равно находит способ узнать, где находится его VDSO. Какой способ?