Каков адрес страницы vsyscall в процессе пользовательского пространства Linux?
-
18-09-2019 - |
Вопрос
Я хотел бы получить адрес страницы vsyscall для собственных нужд.У меня здесь только две идеи:измените компилятор, чтобы он сохранял эту информацию в каком-то известном месте после ее передачи __start, или прочитайте /proc/[pid]/maps.Я действительно не хочу читать /proc/, поскольку это медленно и в этом нет необходимости.Я также не хочу вносить изменения в компилятор.Есть ли у кого-нибудь альтернатива?Есть ли символ, о котором мне следует знать?
В тот момент у меня возникло желание встроить эту функциональность в вызов ioctl в модуле, который я разработал в рамках этой работы!
Решение
Вот удар в темноте:
Если вы сможете определить, по какому адресу начался стек процесса, то, возможно, вы сможете найти параметры, которые были предоставлены __start
.Затем вы можете получить доступ к параметрам через указатели соответствующего типа, установленные на соответствующие смещения от исходного указателя стека.
Согласно статье Как функция main() выполняется в Linux, автор Хёк «Ястреб» Ким., первые несколько инструкций __start
запишет первоначальные аргументы детерминированным способом перед вызовом __libc_start_main
.
Очевидно, что любой подобный подход зависит от платформы и подвержен нестабильности, если реализация __start
были изменены.