Для моей задачи нужно перехватить часть функций API для определенного процесса, причем нужно чтобы этот процесс не смог вызвать оригинальные функции API в обход моей заглушки. Можно ли такого добиться?
Давайте поспорим, что напишу вызов функции которая обходит любой Ваш хук
На практике, *примерный* рейтинг "устойчивость" хуков по можно представить в виде следующего (неполного) списка:
— Модификация таблиц импорта/экспорта
— Патч на начало функции
— Патч не на начало функции (требует хорошее знакомство с устройством функции)
--- далее идут только системные вызовы ---
— Патч на диспатчер системных вызовов.
--- уровень ядра ---
— Хук через SSDT
— Хук на обработчик sysenter, патч обработчика sysenter
— Патч на функцию в ядре
Если нужна дополнительная инфа — оставтеь координаты. Есть море опыта в этой области.
VPS>Для моей задачи нужно перехватить часть функций API для определенного процесса, причем нужно чтобы этот процесс не смог вызвать оригинальные функции API в обход моей заглушки. Можно ли такого добиться?
Re[2]: гарантированный перехват API - возможен ли?
VPS>Для моей задачи нужно перехватить часть функций API для определенного процесса, причем нужно чтобы этот процесс не смог вызвать оригинальные функции API в обход моей заглушки. Можно ли такого добиться?
Если юзер (и потенциальные программы) не админ, то гарантированно можно захукать нужный функционад в ядре, т.к. код грузить в ядро не-админ не может.
Если юзер админ — никаких гарантий.
Как много веселых ребят, и все делают велосипед...
Re[2]: гарантированный перехват API - возможен ли?
Здравствуйте, ononim, Вы писали:
O>Если юзер (и потенциальные программы) не админ, то гарантированно можно захукать нужный функционад в ядре, т.к. код грузить в ядро не-админ не может.
А можно подробнее, в чем состоит метод?
Re[3]: гарантированный перехват API - возможен ли?
Хук делают на уровне ядра. Но практически все пользователь XP является администратором, значит программа сможет загрузить свой собственнюй драйвер для обхода хуков. В Висте и 7 при инсталяции программа попросит установить сервис, и если пользователь разрешит, опять таки можно загрузить драйвер.
Re[3]: гарантированный перехват API - возможен ли?
Здравствуйте, VasyaPS, Вы писали:
VPS>Здравствуйте, ononim, Вы писали:
O>>Если юзер (и потенциальные программы) не админ, то гарантированно можно захукать нужный функционад в ядре, т.к. код грузить в ядро не-админ не может.
VPS>А можно подробнее, в чем состоит метод?
Я делал так
писал DLL которая имела функцию с таким же прототипом как и перехватываемая функция.
Далее в режиме ядра получал указатель на физический адре памяти где хранится код функции (к примеру в kernel32.dll)
в режиме ядра копировал себе в память целое количество команд, для этого использовался простенький дизасамблер (более совершенное решение для этого есть в google-perftools)
а в памяти на месте функции делал что-то типа
загрузить мою либу, и вызвать мою функцию.
все
т.е. грубо говоря мы перехватываем MessageBox
я нахажу ее адрес физический, копирю некоторое количество байт к себе в библиотеку шаред память, а на место начала фунции пишу свой перехватчик.
все — хук готов.
Из вкусностей — метод можно отлаживать и не в режиме ядра, тогда при попытке записи в память занимаюмую библиотекой к примеру kernel32.dll операцинка делает копию этой либы специально для вашего процесса.
недеюсь понятно описал )))
Re[4]: гарантированный перехват API - возможен ли?
Здравствуйте, 8086, Вы писали:
8>Хук делают на уровне ядра. Но практически все пользователь XP является администратором, значит программа сможет загрузить свой собственнюй драйвер для обхода хуков. В Висте и 7 при инсталяции программа попросит установить сервис, и если пользователь разрешит, опять таки можно загрузить драйвер.
ononim имел ввиду, что если на компьютере настроена грамотно политика безопасности или, более того, компьютер входит в домен, который грамотно администрируется, то тут врядли чего путного получится, только если через дырку в ОС.
С уважением,
Евгений
Re[4]: гарантированный перехват API - возможен ли?
Dez>Я делал так Dez>писал DLL которая имела функцию с таким же прототипом как и перехватываемая функция. Dez>Далее в режиме ядра получал указатель на физический адре памяти где хранится код функции (к примеру в kernel32.dll) Dez>в режиме ядра копировал себе в память целое количество команд, для этого использовался простенький дизасамблер (более совершенное решение для этого есть в google-perftools) Dez>а в памяти на месте функции делал что-то типа Dez>загрузить мою либу, и вызвать мою функцию.
ээ нет. Я не это имел ввиду.
Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx.
А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами.
Как много веселых ребят, и все делают велосипед...
Re[4]: гарантированный перехват API - возможен ли?
VPS>>А можно подробнее, в чем состоит метод? 8>Хук делают на уровне ядра. Но практически все пользователь XP является администратором
Это только домашние пользователи. В серъезных энтерпрайзах под админами пользователей не пускают даже в ХР.
Как много веселых ребят, и все делают велосипед...
Re[5]: гарантированный перехват API - возможен ли?
Здравствуйте, ononim, Вы писали:
Dez>>Я делал так Dez>>писал DLL которая имела функцию с таким же прототипом как и перехватываемая функция. Dez>>Далее в режиме ядра получал указатель на физический адре памяти где хранится код функции (к примеру в kernel32.dll) Dez>>в режиме ядра копировал себе в память целое количество команд, для этого использовался простенький дизасамблер (более совершенное решение для этого есть в google-perftools) Dez>>а в памяти на месте функции делал что-то типа Dez>>загрузить мою либу, и вызвать мою функцию. O>ээ нет. Я не это имел ввиду. O>Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx. O>А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами.
Ээээ нет — вы не правы, читай выше — если это делать в режиме ядра — то фиг ты его обойдешь.
Re[5]: гарантированный перехват API - возможен ли?
Здравствуйте, ononim, Вы писали:
O>ээ нет. Я не это имел ввиду. O>Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx. O>А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами.
тут дело в том что если ты патчишь либу в кернел моде — то все твои изменения сразуже отображаются на все процессы.
Так уж устроена винда
Re[6]: гарантированный перехват API - возможен ли?
Здравствуйте, Dez, Вы писали:
Dez>тут дело в том что если ты патчишь либу в кернел моде — то все твои изменения сразуже отображаются на все процессы. Dez>Так уж устроена винда
А разве нельзя снять такой хук тоже из ядра?
С уважением,
Евгений
Re[6]: гарантированный перехват API - возможен ли?
O>>ээ нет. Я не это имел ввиду. O>>Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx. O>>А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами. Dez>тут дело в том что если ты патчишь либу в кернел моде — то все твои изменения сразуже отображаются на все процессы. Dez>Так уж устроена винда
Вы плохо знаете как устроена винды. Если я возьму свою копию user32.dll назову ее user33.dll загружу и буду использовать функции из нее — user32.dll не будет вызвана как и не будет вызван код ваших хуков.
Точно так же как ничего не мешает мне написать в своем коде sysenter и вызвать системных сервис напрямую в обход всех юзермодных длл и всех хуков в них тоже
Как много веселых ребят, и все делают велосипед...
Re[7]: гарантированный перехват API - возможен ли?
Здравствуйте, ononim, Вы писали:
O>>>ээ нет. Я не это имел ввиду. O>>>Если уж перехватывать в ядре MessageBox — то перехватывать соответствующий win32k.sys сервис, скорее всего NtUserCreateWindowEx. O>>>А метод что вы описали — это просто юзермодный хук с подвыподвертом. Обходится на раз-два прямым вызовом в ядро или загрузкой копии user32.dll если впадла возится с системными вызовами. Dez>>тут дело в том что если ты патчишь либу в кернел моде — то все твои изменения сразуже отображаются на все процессы. Dez>>Так уж устроена винда O>Вы плохо знаете как устроена винды. Если я возьму свою копию user32.dll назову ее user33.dll загружу и буду использовать функции из нее — user32.dll не будет вызвана как и не будет вызван код ваших хуков. O>Точно так же как ничего не мешает мне написать в своем коде sysenter и вызвать системных сервис напрямую в обход всех юзермодных длл и всех хуков в них тоже
если больше конкретики, вот код который под ХР SP3 создает окно в обход всех юзермодных длл:
код очень специфичен к системе, я его сделал для XP SP3 — на других ОС и сервиспаках а то и хотфиксах номера сервисов отличаются и он не сработает без изменения 1157h на правильный номер в данной ОС.
Как много веселых ребят, и все делают велосипед...
Re[4]: гарантированный перехват API - возможен ли?
Здравствуйте, Dez,
Dez>Я делал так Dez>писал DLL которая имела функцию с таким же прототипом как и перехватываемая функция. Dez>Далее в режиме ядра получал указатель на физический адре памяти где хранится код функции (к примеру в kernel32.dll) Dez>в режиме ядра копировал себе в память целое количество команд, для этого использовался простенький дизасамблер (более совершенное решение для этого есть в google-perftools) Dez>а в памяти на месте функции делал что-то типа Dez>загрузить мою либу, и вызвать мою функцию.
--
Что произойдет, если некоторый поток в системе был остановлен где-то в середине копируемого участка, а затем получит управлеие после того, как на месте этого копируемого участка окажется новый код?