На днях промелькнула в форумах ссылка, которая удивительным образом пересеклась с моими текущими потребностями, а именно — перехват вызовов функций WinSock. Сама ссылка (вдруг кого заинтересует) — wepmetering.
Вопрос собственно не в этом... Он (вопрос) скорее философского характера (не спешите переносить топик в форум "За жисть" ). Стоит четко очерченная задача:
1. Вести учет всех http-запросов (GET, HEAD, POST), которые посылаются IE, Netscape и пр. популярными браузерами.
2. Это дело должно работать, начиная от Win98 и выше.
Собственно, указанная ссылка помогла, даже очень. Но терзают смутные сомнения — так ли уж чист этот хак? Сделал пока на примере wepmetering, но хочется узнать о существовании альтернативных путей в части отлова HTTP-запросов от клиента к серверу... Может, кто работал над подобной проблемой?
З.Ы. Все бросать и юзать WinPcap не хочется (задача-то гораздо уже, чем возможности, предоставляемые WinPcap)...
Ну, а если написать маленький http прокси сервер и заставить всех использовать именно его в настройках броузера?
А методы типа установки хука подобным образом... даже не знаю, есть же библиотека от майкрософт, которая делает это корректнее. Далее есть статья http://www.ntndis.com/articles/firewall.htm — ее тоже стоит почитать, там немного описаны методы. Обратить, наверное, стоит внимание на Winsock Layered Service Provider (LSP).
Успехов.
F>1. Вести учет всех http-запросов (GET, HEAD, POST), которые посылаются IE, Netscape и пр. популярными браузерами.
F>2. Это дело должно работать, начиная от Win98 и выше.
Здравствуйте, Andrew S, Вы писали:
AS>Ну, а если написать маленький http прокси сервер и заставить всех использовать именно его в настройках броузера?
Гм. А вот в условиях задачи еще такая весчь — все должно быть незаметно... То есть, чтобы вне зависимости от настроек прокси в браузерах статистика собиралась и все работало... И чтобы юзер до поры до времени не подозревал. Этакая система учета того, куда и кто лазит по HTTP в рабочее время... И не спрашивайте меня, зачем все это...
AS>А методы типа установки хука подобным образом... даже не знаю, есть же библиотека от майкрософт, которая делает это корректнее.
А чего за библиотека — не ткнете пальцем?
AS>Обратить, наверное, стоит внимание на Winsock Layered Service Provider (LSP).
F> И не спрашивайте меня, зачем все это...
И не думал.
AS>>А методы типа установки хука подобным образом... даже не знаю, есть же библиотека от майкрософт, которая делает это корректнее.
F>А чего за библиотека — не ткнете пальцем?
Ткнул. Называется это чудо Detours и по заверениям приспешников Великого Билли позволяет устанавливать хуки на функции практически 100% safe.
AS>>Обратить, наверное, стоит внимание на Winsock Layered Service Provider (LSP).
F>Спасибо, почитаю и ознакомлюсь.
BTW — в SDK есть прекраснейший пример SPI. Аж 150 кил кода, правда, большинство из него наверное не понадобится, а также есть инсталлер/деинсталлер LSP.
F>[]
F>Спасибо за ответ.
[]
AS>BTW — в SDK есть прекраснейший пример SPI. Аж 150 кил кода, правда, большинство из него наверное не понадобится, а также есть инсталлер/деинсталлер LSP.
Премного благодарен. Я не навязываюсь, но вот проблема — нет у меня CD с примерами (Студию для установки брал у друга)... Может, вы пойдете навстречу и вышлите мне эти аж 150 Кил кода? Интересно же...
З.Ы. И расплата (в виде благодарности) найдет героя
Вышлю, конечно, без проблем. Только вот куда? Адрес, указанный в профайле, не похож на правду.
F>Премного благодарен. Я не навязываюсь, но вот проблема — нет у меня CD с примерами (Студию для установки брал у друга)... Может, вы пойдете навстречу и вышлите мне эти аж 150 Кил кода? Интересно же...
[]
AS>Ткнул. Называется это чудо Detours и по заверениям приспешников Великого Билли позволяет устанавливать хуки на функции практически 100% safe.
В общем, действительно чудо, вот только, если я все правильно понял, есть одно но (из README цитирую):
The DLL injection functions are not compatible with either Windows 95,
Windows 98, or Windows ME as the Win9x platforms do not supports the
CreateRemoteThread API.
А эта вещь (внедрение dll) как раз самая нужная... Надо, чтобы работало под Win98... В любом случае — спасибо за интересный материал. Я пока вижу один выход для использования Detours под любой Win-операционкой — постановка глобального хука (типа WH_GETMESSAGE) и уже из HookProc патчить функции... Будем разбираться...
Ну да, но это ограничение OS. Смысл в том, что в той статье, которую ты(вы) сначала указал(и), функции патчятся на предположении о том, что имеют стандартные команды на entry (и, кстати, тоже из хука). А вдруг другая версия winsock — и все. А Detours делают это аккуратно, дизассемблируя часть кода и выбирая метод патча.
Что и требуется. А вообще, стоило только немного копнуть "вглубь" win9x и мое мнение об этой системе резко изменилось.. И все таки она 16-ти битная Как говорится, "ищите в недрах".
F>А эта вещь (внедрение dll) как раз самая нужная... Надо, чтобы работало под Win98... В любом случае — спасибо за интересный материал. Я пока вижу один выход для использования Detours под любой Win-операционкой — постановка глобального хука (типа WH_GETMESSAGE) и уже из HookProc патчить функции... Будем разбираться...
Здравствуйте, Flamer, Вы писали:
F>Здравствуйте, zozan, Вы писали:
Z>>Интересно — а с помощью этого метода можно модифицировать исходящие/входящие пакеты?
F>Можно
Нельзя! В юзермоде ПАКЕТОВ не существует! Даже в TDI транспортах сетевые данные это всё ещё данные, просто отправляемый/принимаемый буфер. но никак не пакеты. Данные начинают превращаться в пакеты, спускаясь вних по TDI и окончательно превращаются в них, когда достигают NDIS
Ещё одна деталь — пример SPI от Microsoft (по крайней мере в MSDN 2001 Jul) глюкавый )) Может позже ситуация улучшилась (я не проверял) — будьте бдительны!
И в заключение — действительно, LSP в данном случае лучшее решение. Драйвер — круто. Detours — хак так и остаётся хаком.
Удачи!
Да, чуть не забыл — вы будете удивлены, попробовав запустить пример LSP от Microsoft в Win98. Дело в том, что набор ф-ий ws2_32.dll в NT и в 98-ой отличаются. (напр.WSCWriteProviderOrder в ws2_32.dll для 9х ОТСУТСТВУЕТ!). Проблема решается поиском sporder.dll в PSDK (она содержит отсутсвующий функции) и LoadLibrary + GetProcAddress в зависимости от версии ОС. Отладка LSP дело тоже не самое лёгкое.
Здравствуйте, screw_cms, Вы писали:
_>Здравствуйте, Flamer, Вы писали:
F>>Здравствуйте, zozan, Вы писали:
Z>>>Интересно — а с помощью этого метода можно модифицировать исходящие/входящие пакеты?
F>>Можно
_>Нельзя! В юзермоде ПАКЕТОВ не существует!
Это да, точно. Я немножко другое имел в виду под термином "пакеты", поэтому и навлек на себя праведный гнев Я имел в виду уже сами данные, поступающие в юзер-мод. Естественно, что это далеко не пакет (заголовки уже обрезаны уровнями ниже и пр. мелочи)... Так что позвольте извиниться за недосказанность
F>В общем, действительно чудо, вот только, если я все правильно понял, есть одно но (из README цитирую):
F>
F>The DLL injection functions are not compatible with either Windows 95,
F>Windows 98, or Windows ME as the Win9x platforms do not supports the
F>CreateRemoteThread API.
F>А эта вещь (внедрение dll) как раз самая нужная... Надо, чтобы работало под Win98... В любом случае — спасибо за интересный
Чтобы перехватывать вызовы send и recv, не понадобится CreateRemoteThread, нужно лишь пропатчить свой код по соответствующим адресам в контексте того процесса, который ты собираешься перехватывать. Как я понял, тебе нужно будет контролировать все процессы, поэтому для перехвата и внедрения в семействе NT придется для каждого процесса внедрять свой код и отслеживать запуск новых процессов. Внедрять код нужно в контекст процесса, предварительно выделив память функцией VirtualAlloc в этом контексте. Таким образом тебе нужно сделать позиционно-независимый код. Можно написать, например, на ассемблере.
Не рекомендую юзать detours для этой задачи, используй отечественную разработку hooklib товарища z0mbie. Можно найти в 7 журнале 29a (29a.host.sk). Также там можешь найти движок, чтобы создать позиционно-независимый код на си.
Есть второй вариант — юзать winpkfilter (ntkernel.com). Примитивный user-friendly интерфейс и будешь знать кто куда ходит