Есть ли библиотека, позволяющая перехватывать вызовы WinAPI? (баян)
Как вариант положить в директорию с программой dll с тем же именем. Изменения в памяти, кстати, может быть не будут замечены dep потому как править надо будет таблицу импорта, которая вроде как данные. Тут другой вопрос - как ты приинъектируешь свой код в память процесса?
http://jacquelin.potier.free.fr/winapioverride32/
Вот еще будет полезно наверно
http://www.codeproject.com/KB/system/hooksys.aspx
Если библиотеки стандартные по типу kernel32.dll и т.п. то никто целостность их в exe не проверяет, поэтому просто измени kernel32 прямо в памяти с отступа куда она реально грузится( тем самым ты не будет менять таблицу импорта, что палево). Гугли трамплин, это вроде даже как официальный способ "расширения" стандартных функций. Суть идеи меняем первые несколько байт функции на джамп в нашу а перед джампом обратно их выполняем(те что изменили).
Есть специальная библиотека от микрософта - Detours. Еще на rsdn - е было 3 статьи про перехват api-функций. Там показывалось как это можно сделать самому и с помощью detours-а.
Тут другой вопрос - как ты приинъектируешь свой код в память процесса?VirtualAllocEx, WriteProcessMemory, CreateRemoteThread. Дальше объяснять? Ещё можно через хуки, но этот вариант более аккуратный, т.к. затрагивает только один процесс.
VirtualAllocEx, WriteProcessMemory, CreateRemoteThread. Дальше объяснять? Ещё можно через хуки, но этот вариант более аккуратный, т.к. затрагивает только один процессДа я не спорю, что способов много, вопрос в том, что из этого с депом будет дружить
Да я не спорю, что способов много, вопрос в том, что из этого с депом будет дружитьЕсли укажешь правильные флаги с помощью VirtyalProtectEx, никаких проблем не должно быть. Тут есть гораздо более неприятная фигня - свистовый Image Base Randomization.
С хуками - вообще никаких проблем..
Кстати, в документации к WriteProcessMemory ничего по поводу DEP'а не сказано.
Да понятно, что не сказано, однако проблемы вылезают. =) А в счем траблы с Image Base Randomization? В любом случае ожидать что библиотеки разлягутся в нужном порядке не приходится
Да понятно, что не сказано, однако проблемы вылезают. =) А в счем траблы с Image Base Randomization? В любом случае ожидать что библиотеки разлягутся в нужном порядке не приходитсяидея с VirtualAllocEx/WriteProcessMemory/CreateRemoteThread состоит в том, чтобы запихать в процесс код, который подгрузит нужную тебе DLL-ку, но для этого надо вызвать хотя-бы LoadLibrary. Без Image Base Randomization можно тупо посмотреть адрес в управляющем процессе, т.к. kernel32.dll грузится по одному и тому-же адресу для всех процессов. Но с этой новой фичей, адрес LoadLibrary придётся определять отдельно.
В Венде как всегда все через жопу.
А в какой ОС можно перехватывать API стандартными средствами?
в линупсе так запросто, пишешь свой kernel модуль.
На Солярисе тоже что-то подобное есть.
в линупсе так запросто, пишешь свой kernel модуль.Не надо ничего писать, все давно написано. Просто люди заранее думали о том, как будут отлаживать программы.
пишешь свой kernel модульэто неправильный подход
Чисто ради интереса. И как же подменить некоторые системные вызовы в какой-либо программе своими функциями без перекомпиляции?
Чисто ради интереса. И как же подменить некоторые системные вызовы в какой-либо программе своими функциями без перекомпиляции?Не знаю, как задача кошерно решается. Можно по-виндовому записать свой код в чужой процесс и перенаправить на него все системные вызовы. Можно перехватывать системный вызов, читать аргументы, выполнять его у себя и потом подсовывать результат назад. В общем, через дебаг АПИ у тебя есть полный контроль, что может дебаггер, то и ты можешь.
это неправильный подходразве?
в этом модуле эты объявляешь именно те функции API, которые желал бы перехватить. Работает надёжно, даже практика такая есть для линупс программистов: поменять пару функций местами.
Подменить в таблице системных вызовов требуемый вызов на свой собственный.
Если же программа собрана статически, или же использует системные вызовы напрямую, не через libc, то нужно через ptrace подменять. http://www.google.ru/search?q=ptrace+syscall+interception сразу же выдаёт примеры, там видно, что нужно регистры и память процесса подменять руками.
В общем, через дебаг АПИ у тебя есть полный контроль, что может дебаггер, то и ты можешь.Тем не менее, ptrace не относится к изящным API, проблем у него дофига. Может, конечно, в винде ещё хуже, но это не оправдание.
Что-то я не понял почему в Linux это проще.
Это всё работает в kernelspace я так понимаю, что нежелательно.
LD_PRELOADЯ правильно понимаю, что это по сути примерно как подмена библиотеки работает?
По-другому перехватить системный вызов не получится, так как программа
для какого-нибудь системного вызова может сама аргументы положить в регистры
и возбудить прерывание (int 0x80 или sysenter для x86)
Ну я не знаю, что ты называешь подменой. Настоящая libc при этом никуда не девается, так что я бы не называл это подменой, скорее дополнением. Реально подменяются при этом несколько точек входа.
По-другому перехватить системный вызов не получитсяman ptrace не согласен с тобой
Сорри, за неверную информацию.
О, прочитал первый пост, и хочу сказать, что все рассматриваемые средства: ptrace, preload, модификация памяти процесса - не годятся для задач, связанных с безопасностью - там нужны хуки в ядре.
в линупсе так запросто, пишешь свой kernel модуль.и что будет, если в твой модуль прокрадётся серьёзная ошибка?
юзер перезагрузит комп и продолжит страдать дальше
как программаимхо, это ущербная практика, по хорошему, такие вызовы должен делать ограниченный набор системных библиотек
для какого-нибудь системного вызова может сама аргументы положить в регистры
и возбудить прерывание (int 0x80 или sysenter для x86)
В случае подмены API-функции в одном-единственном процессе под виндой, при ошибке будет достаточно завершить этот процесс.
злоумышленники, которые собираются обойти файрвол, почитают твой пост и устыдятся
Откуда файрвол появился? В начале темы просто ставилась задача перехватить API-функции, никакие файрволы не упоминались. Проксифаер - это не файрволл, вроде.
думай, бошка, шапку куплю
а, ну тогда там написали, что надо рядом положить dll, это же наверное сработает?
а, ну тогда там написали, что надо рядом положить dll, это же наверное сработает?Можно на уровне загрузчика приложений запретить загружать определённый набор dll не из правильного места и такая фигня не прокатит.
Или если ему админ захочет затруднить жизнь? Тогда уже юзер должен становиться злоумышленником.
А если ты добавил свой собственный системный вызов?
А если ты добавил свой собственный системный вызов?иными словами, если ты хочешь общаться с привилегированным кодом? Ну так интерфейс этого общения вроде-бы как стандартизирован, должно хватать стандартного набора системных вызовов, по идее.
А вообще, драйвера, по идее, тоже могут перехватывать те или иные функции, так что в этом плане возможности должны быть примерно равны.
Оставить комментарий
agaaaa
Есть ли готовые библиотеки для перехвата вызовов функций?Что-нить вроде
Если нет, посоветуйте способ реализации такой библиотеки. Гугл пока предлагает два варианта: модификация exe, которая не катит и не является общим решением, и модификация памяти процесса, в работоспособности которой в системах со включенным DEP я сомневаюсь.
В этот раз хочу написать что-то вроде проксифаера, обобщённый вариант спрашиваю на будущее.