Есть ли библиотека, позволяющая перехватывать вызовы WinAPI? (баян)

agaaaa

Есть ли готовые библиотеки для перехвата вызовов функций?
Что-нить вроде
void* oldFunc = Intercept(remotePID, "kernel32.dll", "AllocConsole", myFunc);
...
Intercept(remotePID, "kernel32.dll", "AllocConsole", oldFunc);

Если нет, посоветуйте способ реализации такой библиотеки. Гугл пока предлагает два варианта: модификация exe, которая не катит и не является общим решением, и модификация памяти процесса, в работоспособности которой в системах со включенным DEP я сомневаюсь.
В этот раз хочу написать что-то вроде проксифаера, обобщённый вариант спрашиваю на будущее.

geja_03

Как вариант положить в директорию с программой dll с тем же именем. Изменения в памяти, кстати, может быть не будут замечены dep потому как править надо будет таблицу импорта, которая вроде как данные. Тут другой вопрос - как ты приинъектируешь свой код в память процесса?

geja_03

Вот например проект какой-то даже опенсорц.
http://jacquelin.potier.free.fr/winapioverride32/
Вот еще будет полезно наверно
http://www.codeproject.com/KB/system/hooksys.aspx

Gunsleader

Если библиотеки стандартные по типу kernel32.dll и т.п. то никто целостность их в exe не проверяет, поэтому просто измени kernel32 прямо в памяти с отступа куда она реально грузится( тем самым ты не будет менять таблицу импорта, что палево). Гугли трамплин, это вроде даже как официальный способ "расширения" стандартных функций. Суть идеи меняем первые несколько байт функции на джамп в нашу а перед джампом обратно их выполняем(те что изменили).

Sanjaz

Есть специальная библиотека от микрософта - Detours. Еще на rsdn - е было 3 статьи про перехват api-функций. Там показывалось как это можно сделать самому и с помощью detours-а.

Andbar

Тут другой вопрос - как ты приинъектируешь свой код в память процесса?
VirtualAllocEx, WriteProcessMemory, CreateRemoteThread. Дальше объяснять? Ещё можно через хуки, но этот вариант более аккуратный, т.к. затрагивает только один процесс.

geja_03

VirtualAllocEx, WriteProcessMemory, CreateRemoteThread. Дальше объяснять? Ещё можно через хуки, но этот вариант более аккуратный, т.к. затрагивает только один процесс
Да я не спорю, что способов много, вопрос в том, что из этого с депом будет дружить

Andbar

Да я не спорю, что способов много, вопрос в том, что из этого с депом будет дружить
Если укажешь правильные флаги с помощью VirtyalProtectEx, никаких проблем не должно быть. Тут есть гораздо более неприятная фигня - свистовый Image Base Randomization.
С хуками - вообще никаких проблем..
Кстати, в документации к WriteProcessMemory ничего по поводу DEP'а не сказано.

geja_03

Да понятно, что не сказано, однако проблемы вылезают. =) А в счем траблы с Image Base Randomization? В любом случае ожидать что библиотеки разлягутся в нужном порядке не приходится

Andbar

Да понятно, что не сказано, однако проблемы вылезают. =) А в счем траблы с Image Base Randomization? В любом случае ожидать что библиотеки разлягутся в нужном порядке не приходится
идея с VirtualAllocEx/WriteProcessMemory/CreateRemoteThread состоит в том, чтобы запихать в процесс код, который подгрузит нужную тебе DLL-ку, но для этого надо вызвать хотя-бы LoadLibrary. Без Image Base Randomization можно тупо посмотреть адрес в управляющем процессе, т.к. kernel32.dll грузится по одному и тому-же адресу для всех процессов. Но с этой новой фичей, адрес LoadLibrary придётся определять отдельно.

Papazyan

В Венде как всегда все через жопу.

SPARTAK3959

А в какой ОС можно перехватывать API стандартными средствами?

yroslavasako

в линупсе так запросто, пишешь свой kernel модуль.

Papazyan

Ну, например, в Линукс. Средства мониторинга strace и ltrace (этот для стандартных либ) включены в поставку. Поддержка strace сделана на уровне ядра. Это, в общем-то, не столько для трассировки системных вызовов существует, сколько для дебаггера.
На Солярисе тоже что-то подобное есть.

Papazyan

в линупсе так запросто, пишешь свой kernel модуль.
Не надо ничего писать, все давно написано. Просто люди заранее думали о том, как будут отлаживать программы.

agaaaa

пишешь свой kernel модуль
это неправильный подход

agaaaa

Чисто ради интереса. И как же подменить некоторые системные вызовы в какой-либо программе своими функциями без перекомпиляции?

Papazyan

Чисто ради интереса. И как же подменить некоторые системные вызовы в какой-либо программе своими функциями без перекомпиляции?
Не знаю, как задача кошерно решается. Можно по-виндовому записать свой код в чужой процесс и перенаправить на него все системные вызовы. Можно перехватывать системный вызов, читать аргументы, выполнять его у себя и потом подсовывать результат назад. В общем, через дебаг АПИ у тебя есть полный контроль, что может дебаггер, то и ты можешь.

yroslavasako

это неправильный подход
разве?
в этом модуле эты объявляешь именно те функции API, которые желал бы перехватить. Работает надёжно, даже практика такая есть для линупс программистов: поменять пару функций местами.

kataich

Можно ядерным модулем.
Подменить в таблице системных вызовов требуемый вызов на свой собственный.

Marinavo_0507

Библиотечные вызовы перехватывают через LD_PRELOAD, это делается без знания системы команд процессора и вообще просто.
Если же программа собрана статически, или же использует системные вызовы напрямую, не через libc, то нужно через ptrace подменять. http://www.google.ru/search?q=ptrace+syscall+interception сразу же выдаёт примеры, там видно, что нужно регистры и память процесса подменять руками.

Marinavo_0507

В общем, через дебаг АПИ у тебя есть полный контроль, что может дебаггер, то и ты можешь.
Тем не менее, ptrace не относится к изящным API, проблем у него дофига. Может, конечно, в винде ещё хуже, но это не оправдание.

agaaaa

Если в Windows стать отладчиком процесса, ты всё тоже самое сможешь делать. Только это накладно, поэтому никто так не делает на практике.
Что-то я не понял почему в Linux это проще.

agaaaa

Это всё работает в kernelspace я так понимаю, что нежелательно.

agaaaa

LD_PRELOAD
Я правильно понимаю, что это по сути примерно как подмена библиотеки работает?

kataich

Да, в ядре.
По-другому перехватить системный вызов не получится, так как программа
для какого-нибудь системного вызова может сама аргументы положить в регистры
и возбудить прерывание (int 0x80 или sysenter для x86)

Marinavo_0507

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

Marinavo_0507

По-другому перехватить системный вызов не получится
man ptrace не согласен с тобой

kataich

Да, согласен. Подпорки в system_call и в sysenter_entry есть.
Сорри, за неверную информацию.

Marinavo_0507

О, прочитал первый пост, и хочу сказать, что все рассматриваемые средства: ptrace, preload, модификация памяти процесса - не годятся для задач, связанных с безопасностью - там нужны хуки в ядре.

Andbar

в линупсе так запросто, пишешь свой kernel модуль.
и что будет, если в твой модуль прокрадётся серьёзная ошибка?

Marinavo_0507

что будет, если в "файрвол" прокрадётся серьёзная ошибка?
юзер перезагрузит комп и продолжит страдать дальше

Andbar

как программа
для какого-нибудь системного вызова может сама аргументы положить в регистры
и возбудить прерывание (int 0x80 или sysenter для x86)
имхо, это ущербная практика, по хорошему, такие вызовы должен делать ограниченный набор системных библиотек

Andbar

В случае подмены API-функции в одном-единственном процессе под виндой, при ошибке будет достаточно завершить этот процесс.

Marinavo_0507

злоумышленники, которые собираются обойти файрвол, почитают твой пост и устыдятся

Andbar

Откуда файрвол появился? В начале темы просто ставилась задача перехватить API-функции, никакие файрволы не упоминались. Проксифаер - это не файрволл, вроде.

klyv

думай, бошка, шапку куплю

Marinavo_0507

а, ну тогда там написали, что надо рядом положить dll, это же наверное сработает?

Andbar

а, ну тогда там написали, что надо рядом положить dll, это же наверное сработает?
Можно на уровне загрузчика приложений запретить загружать определённый набор dll не из правильного места и такая фигня не прокатит.

Marinavo_0507

В смысле если автор приложения захочет затруднить жизнь юзеру? Тогда возвращаемся к ситуации со злоумышленником.
Или если ему админ захочет затруднить жизнь? Тогда уже юзер должен становиться злоумышленником.

kataich

А если ты добавил свой собственный системный вызов?

Andbar

А если ты добавил свой собственный системный вызов?
иными словами, если ты хочешь общаться с привилегированным кодом? Ну так интерфейс этого общения вроде-бы как стандартизирован, должно хватать стандартного набора системных вызовов, по идее.
А вообще, драйвера, по идее, тоже могут перехватывать те или иные функции, так что в этом плане возможности должны быть примерно равны.
Оставить комментарий
Имя или ник:
Комментарий: