Перехват функции с помощью перезаписи RVA в таблице экспорта

Тема в разделе "WASM.WIN32", создана пользователем Son of God, 17 июн 2006.

  1. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    Если модуль А содержит экспортируемую функцию Func, то ее RVA содержится в таблице экспорта. Чтобы другие модули могли вызывать эту функцию, единственный способ получить ее адрес - пропарсить таблицу экспорта, найти RVA нужной функции и приплюсовать его к базовому адресу. Если есть модуль Б, который загружается по адресу, большему чем базовый адрес модуля А, то из модуля Б можно перехватить функцию Func. Вычитаем базовый адрес модуля А из адреса функции NewFunc (которая находится в модуле Б) и записываем полученное значение на место RVA функции Func в таблицу экспорта модуля А. После этого у функции Func будет новый адрес (адрес функции NewFunc) :)

    Собственно, вопрос. Я хочу применить эту технику в адресном пространстве ядра. Техника имеет единственное ограничение - нужно, чтобы мой перехватывающий модуль был загружен выше системных модулей! У кого есть какая-нибудь инфа о том, по каким адресам винда загружает свои модули, чужие модули и может ли она менять их адрес загрузки? И если может, то при каких обстоятельствах меняет?
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Не понял, с какого потолка ты это взял? Выше или ниже, какая разница? Если руки прямые, то хуки экспортов будут работать в любом случае.
     
  3. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    Что ты имеешь в виду под прямыми руками? Насколько я знаю, PE загрузчик берет базовый адрес образа и прибавляет к нему RVA из таблицы экспорта. Разве RVA может быть отрицательным числом? Или ты предлагаешь изменить базовый адрес на 0x80000000 и потом пересчитать все RVA?
     
  4. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Правильно мыслишь. Теперь давай посчитаем что у нас поулчиться если перехватывающий модуль ниже системных.



    Пусть база системнного модуля равна 01234567h, RVA перехватываемой функции - 00006654h. Адрес нашего обработчика - 0014589h. Считаем новый RVA: 0014589 - 01234567h = FEDE0022

    Теперь пусть загрузчик резолвит экспорты, при этом он прибавляет базу к RVA, тоесть 01234567h + FEDE0022 = 0014589. Если не вериться - посчитай сам.
     
  5. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    01234567h + FEDE0022 = 100014589. Но если первая единица отбрасывается, то должно работать.
     
  6. Solo

    Solo New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2003
    Сообщения:
    131
    Son of God



    Т.е. над тем, что размерности слагаемых и суммы совпадают, ты вообще никогда не задумывался?
     
  7. Son of God

    Son of God New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2005
    Сообщения:
    125
    Solo



    Задумывался, почему нет. Просто эта двоичная арифметика не с первого раза доходит.



    polkan



    Все модули, что были загружены после перехвата, получат себе в IAT новый адрес функции. И также все вызовы GetProcAddress вернут новый адрес.