2008-11-04 7 views
1

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

Если я заменил CALLL на IOLog (соответствующее число) NOP внутри драйвера устройства (kext), ядро ​​сработает с тем, что выглядит как разбитый стек («Backtrace terminated-invalid frame pointer 0»).

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

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

ответ

2

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

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

+0

Я занимаюсь исправлением на диске. Если мои NOP были заменены как побочный эффект перемещения, не будет ли тогда драйвер функционировать так же, как и до исправления? Перемещение может сыграть определенную роль, но я еще не понял, как это работает. otool перечисляет 390 записей перемещения в изображении машинного механизма. – diciu 2008-11-04 10:02:55