2010-10-21 5 views
1

Эй, Сегодня я попытался сделать двоичный анализ NDIS.sys, и я заметил что-то странное. Я взял функцию и начал ее разграничивать. Первые 30 байт были одинаковыми на диске (с использованием IDA) и в памяти (с использованием WinDbg). Затем что-то изменилось. Я видел что-то вроде «jmp _ imp _XXXXX». байты JMP были одинаковыми, но адрес был другим.Что вызывает различия между драйвером на диске и драйвером, сопоставленным с памятью?

Мой вопрос - в чем разница? Я думаю, что это имеет какое-то отношение к переездам. Хотя прыжок предназначен для адресации в одном модуле, это длинный прыжок, что делает его относительно базового адреса модуля. Если произошло перемещение, ему также необходимо переместить этот адрес, даже если он находится на одном модуле.

Я прав или совершенно не так? :-) Спасибо.

ответ

2

Да, цели перехода переписываются во время перемещения, когда модуль не загружается на предпочтительном базовом адресе в памяти. На самом деле разработчикам рекомендуется предоставить базовый адрес для своих модулей, не предназначенный для их модулей, чтобы избежать затрат на переезд, но многие никогда не делают этого, поэтому некоторые модули всегда будут перемещаться, и загрузчик должен перезаписать цели перехода.

+0

Обратите внимание, что для драйверов устройств предпочтительный базовый адрес полностью игнорируется – snoone

+0

Yup, но - зачем прыгать, чтобы получить переустановку? Пункт назначения перехода находится в том же модуле. – MindBlower

+0

Можете ли вы показать, что вы видите в отладчике? – snoone