На этот раз меня интересует глобальный API-Hooking под Ring-0. Как человек, никогда не видевший подобных техник в режиме ядра предположу, что это делается так: Определяется физический адрес ф-ции API(к примеру MessageBoxA в драйвере) Каким-нибудь образом осуществляется запись в ФИЗИЧЕСКУЮ память напрямую(без виртуальной памяти) с целью сплайсинга ф-ции(ИМХО при изменении физ-памяти, изменится и виртуальная память всех процессов, куда спроецирована библиотека с этой ф-цией) Где-нибудь в памяти размещается ф-ция перехватчик Отсюда сразу 2 вопроса: 1)как напрямую писать в физическую память из драйвера и 2) где бы разместить ф-цию перехватчик, чтобы она была видна всем процессам сразу? Честно говоря у меня нет ни необходимых пособий(кроме статей Four-F нет вообще ничего), ни опыта, чтобы докопаться самому, посему и прошу помощи...
1) в физическую память можно писать даже из прикладной программы в Ринг3, через объект ядра-секцию: ФизикалМемору ЗЫ:Но не факт что нужная функция будет в памяти, а не в свопе. 2) В оперативной памяти где ж еще. ЗЗЫ:Но не факт, что проекций ДЛЛ, в физической памяти только одна
1) а разве такие библиотеки как kernel32.dll и user32.dll кидаются в своп? они же одни из самых часто запрашиваемых... 2) Про то, что писать надо в память я понял. Не понял я только, почему будет несколько копий dll? из-за локального API-Hooking'а(пресловутое copy-on-write)? И если так, то как тогда перехватить API глобального не перебирая все процессы и одновременно не выбрасывая из перехватываемых приложений консоли???
да и еще - когда я нахожусь в процедуре DispatchControl драйвера, тогда все происходит в контексте вызвавшего драйвер процесса. Как перебрать другие процессы, переключиться на нужный и, что самое главное, вернуться обратно?
1. Если у тя щас стоит Сайс то проверь бит "презент" всех дескрипторов страниц (возможно есть более объективный способ, может бит "ж" проверить? ) и вопрос отпадет сам собой, но имхо должны кидаться. Я щас проверить не могу. 2. Ну это один из случаев, я знаю еще пару, например если имя ДЛЛ не в формате 8.3 то при указании ДОС имени грузится еще одна копия
Сайс у меня не стоит, точнее не ставится. Ни тот, который под Win2000, ни тот, который под XP. Скачивал туеву хучу патчей - не помогает FreeManCPM Не подскажешь как? Ну или ссылочку на примерчик? Я с таблицами дескрипторов не работал, даже толком int trick для получения Ring-0 в старой винде не разобрал...