Если модуль А содержит экспортируемую функцию Func, то ее RVA содержится в таблице экспорта. Чтобы другие модули могли вызывать эту функцию, единственный способ получить ее адрес - пропарсить таблицу экспорта, найти RVA нужной функции и приплюсовать его к базовому адресу. Если есть модуль Б, который загружается по адресу, большему чем базовый адрес модуля А, то из модуля Б можно перехватить функцию Func. Вычитаем базовый адрес модуля А из адреса функции NewFunc (которая находится в модуле Б) и записываем полученное значение на место RVA функции Func в таблицу экспорта модуля А. После этого у функции Func будет новый адрес (адрес функции NewFunc) Собственно, вопрос. Я хочу применить эту технику в адресном пространстве ядра. Техника имеет единственное ограничение - нужно, чтобы мой перехватывающий модуль был загружен выше системных модулей! У кого есть какая-нибудь инфа о том, по каким адресам винда загружает свои модули, чужие модули и может ли она менять их адрес загрузки? И если может, то при каких обстоятельствах меняет?
Не понял, с какого потолка ты это взял? Выше или ниже, какая разница? Если руки прямые, то хуки экспортов будут работать в любом случае.
Что ты имеешь в виду под прямыми руками? Насколько я знаю, PE загрузчик берет базовый адрес образа и прибавляет к нему RVA из таблицы экспорта. Разве RVA может быть отрицательным числом? Или ты предлагаешь изменить базовый адрес на 0x80000000 и потом пересчитать все RVA?
Правильно мыслишь. Теперь давай посчитаем что у нас поулчиться если перехватывающий модуль ниже системных. Пусть база системнного модуля равна 01234567h, RVA перехватываемой функции - 00006654h. Адрес нашего обработчика - 0014589h. Считаем новый RVA: 0014589 - 01234567h = FEDE0022 Теперь пусть загрузчик резолвит экспорты, при этом он прибавляет базу к RVA, тоесть 01234567h + FEDE0022 = 0014589. Если не вериться - посчитай сам.
Son of God Т.е. над тем, что размерности слагаемых и суммы совпадают, ты вообще никогда не задумывался?
Solo Задумывался, почему нет. Просто эта двоичная арифметика не с первого раза доходит. polkan Все модули, что были загружены после перехвата, получат себе в IAT новый адрес функции. И также все вызовы GetProcAddress вернут новый адрес.