Получить адрес системного вызова в таблице системных вызовов из / proc / kcore - PullRequest
4 голосов
/ 22 апреля 2011

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

1 Ответ

9 голосов
/ 03 мая 2011

Если вы используете компьютер на базе 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 я обнаружил, что весь процесс задокументирован (с примером кода модуля) здесь .

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

...