Получить адрес системного вызова в таблице системных вызовов из / proc / kcore

#linux #debugging #linux-kernel

#linux #отладка #linux-ядро

Вопрос:

Как я мог бы получить адрес системного вызова из /proc/kcore . Я мог бы получить адрес таблицы системных вызовов из System.map файла.

Ответ №1:

Если вы используете компьютер на базе x86, вы можете использовать sidt инструкцию для получения регистра таблицы дескрипторов прерываний и, следовательно, самой таблицы дескрипторов прерываний. Имея это в виду, вы можете получить адрес system_call (или эквивалент ia32 для совместимости с x86-64) функции, вызываемой прерыванием системного вызова 0x80. Разбирая этот обработчик прерываний и просматривая конкретную инструкцию косвенного вызова, вы можете извлечь адрес из инструкции вызова. Этот адрес является вашей таблицей системных вызовов (на x86) или таблицей системных вызовов совместимости IA32 на x86-64.

Получение собственной таблицы системных вызовов x86-64 аналогично: вместо восстановления таблицы прерываний с помощью sidt прочитайте MSR процессора IA32_LSTAR. Адрес в (high << 32 | low) является диспетчером системного вызова. Просканируйте память, как и раньше, извлеките sys_call_table адрес из инструкции вызова, но не забудьте замаскировать старшие 32 бита адреса.

Это скрывает много еще большей технической информации (например, какие байты искать), которую вы должны понять, прежде чем копаться в коде ядра. После быстрого поиска в Google я нашел весь документированный процесс (с примером кода модуля) здесь.

Удачи и постарайтесь не взорвать себя!

Комментарии:

1. К сожалению, ссылка не работает : (