Исправление CALLL путем замены на NOP работает в пространстве пользователя, но не в пространстве ядра - PullRequest
1 голос
/ 04 ноября 2008

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

Если я заменю CALLL на IOLog на (соответствующее количество) NOP внутри драйвера устройства (kext), ядро ​​аварийно завершает работу с тем, что выглядит как разбитый стек («Указатель фрейма недействительной прерванной обратной трассировки 0»). *

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

Что мне здесь не хватает?

1 Ответ

2 голосов
/ 04 ноября 2008

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

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

...