Исправление CALLL путем замены на NOPs работает в пространстве пользователя, но не в пространстве ядра

StackOverflow https://stackoverflow.com/questions/261021

Вопрос

У меня есть драйвер устройства, который я хочу исправить.Этот драйвер устройства вызывает IOLog, и я хочу избавиться от ведения журнала.

Если я заменю CALLL на IOLog на (соответствующее количество) NOPs внутри драйвера устройства (kext), ядро завершит работу с тем, что выглядит как разбитый стек ("Трассировка назад завершена - недопустимый указатель кадра 0").

Однако тот же метод прекрасно работает в пользовательском пространстве (напримерОтключение NSLogs внутри двоичного файла OS X).

Чего я здесь не понимаю?

Это было полезно?

Решение

Вы не объяснили, выполняете ли вы холодное исправление (драйвер на диске) или горячее (драйвер в памяти).При исправлении в памяти могут возникать всевозможные проблемы, такие как запуск драйвера при его исправлении, кэширование ЦП частей кода и т.д.Смотрите раздел руководства Intel по самоизменяющемуся коду.

Для исправления на диске может оказаться, что у вас есть запись о перемещении для целевого адреса.Таким образом, когда драйвер загружен, загрузчик динамического модуля исправит адрес IOLog в коде, заменив его реальным адресом.Это перезапишет ваши инструкции nop.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top