Перехват EMAIL и анализ POP3 протокола на уровне TCP/IP
От: kIlka Россия  
Дата: 16.10.04 15:01
Оценка:
Здравствуйте.

Заранее хочу оговориться, что в сетевом программирование не особенно силен, так что могу не знать чего-то элементарного. Но я пишу программу, которая должна сидеть "там, где часы" и перехватывать EMAIL сообщения (как входящие, так и исходящие).

Придумал использовать GNUтую библиотеку WINPCAP.

Получается (содрал из исходников) перехватывать пакеты по заданному порту (110 и 25).

В полученном дампе вижу знакомые команды POP3: PASS, USER и т.д. Однако есть много мусора непонятного происхождения. Не могли бы вы пояснить процесс коннекта с EMAIL сервером на уровне TCP/IP. Возможно пересылается некоторая информация типа CRC?

Короткая версия вопроса: почему мой дамп отличается от того, что видно в окошке при "telnet pop.mail.ru" и как добиться соответствия? Возможно пакеты с данными и служебные отличаются по заголовку?

Укажите хотя бы направление, куда копать.

Заранее благодарен за любую помощь.
Re: Перехват EMAIL и анализ POP3 протокола на уровне TCP/IP
От: butcher Россия http://bu7cher.blogspot.com
Дата: 18.10.04 04:13
Оценка:
Здравствуйте, kIlka, Вы писали:

I>Придумал использовать GNUтую библиотеку WINPCAP.

Помоему она не GNU, а BSD-like.

I>В полученном дампе вижу знакомые команды POP3: PASS, USER и т.д. Однако есть много мусора непонятного происхождения. Не могли бы вы пояснить процесс коннекта с EMAIL сервером на уровне TCP/IP. Возможно пересылается некоторая информация типа CRC?

У вас там наверно заголовки пакетов, да и, наверняка, ещё "левых" пакетов наперехватывали..

I>Короткая версия вопроса: почему мой дамп отличается от того, что видно в окошке при "telnet pop.mail.ru" и как добиться соответствия?

Потому что, используя WinPCAP вы работаете не c TCP/IP а с кадрами Ethernet. Добится соответствия можно путём фильтрации и обрезания заголовков.

I>Укажите хотя бы направление, куда копать.

Копай, Нео, копай — летать научишься (С) Шматрица
Может вам проще использовать перехват Winsock2 API? Поищите в гугле на тему Detours.

Нет ничего невозможного..
Re[2]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: postmaster  
Дата: 18.10.04 10:52
Оценка: +1
Здравствуйте, butcher, Вы писали:

B>Может вам проще использовать перехват Winsock2 API? Поищите в гугле на тему Detours.


Лучше LSP (Layered Service Provider).
Re[3]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: IGor_79 Украина  
Дата: 18.10.04 11:41
Оценка:
Здравствуйте, postmaster, Вы писали:

P>Здравствуйте, butcher, Вы писали:


B>>Может вам проще использовать перехват Winsock2 API? Поищите в гугле на тему Detours.


P>Лучше LSP (Layered Service Provider).


А вот этого лучше не надо.
У нас LSP в нескольких проектах используется
и поверьте мне на слово — удовольствие еще то...

Основная проблема в том, что вы становитесь зависимым от
моделей ввода-вывода, используемых клиентом (select, WsaAsyncSelect, etc.),
а если еще в клиенте какой-то недочет, который обнаруживается
в достаточно специфичных условиях... и т.д. и т.п.
Лучше уж сразу дрова...
Re[4]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: TarasCo  
Дата: 18.10.04 12:01
Оценка:
Здравствуйте, IGor_79, Вы писали:

IG_>Здравствуйте, postmaster, Вы писали:


P>>Здравствуйте, butcher, Вы писали:


B>>>Может вам проще использовать перехват Winsock2 API? Поищите в гугле на тему Detours.


P>>Лучше LSP (Layered Service Provider).


IG_>А вот этого лучше не надо.

IG_>У нас LSP в нескольких проектах используется
IG_>и поверьте мне на слово — удовольствие еще то...

IG_>Основная проблема в том, что вы становитесь зависимым от

IG_>моделей ввода-вывода, используемых клиентом (select, WsaAsyncSelect, etc.),
IG_>а если еще в клиенте какой-то недочет, который обнаруживается
IG_>в достаточно специфичных условиях... и т.д. и т.п.
IG_>Лучше уж сразу дрова...

А в дровах все плохо..... Возмите Outpost у него фильтрация высокоуровневых протоколов живет в ядре. Ошибка в реализации (а ведь это обычно самое глюченное и опасное — синтаксический анализ и.т.п. , что в свою очередь рано или поздно приведет к переполнению со всеми вытекающими) приводит к возникновению дыр на уровне ядра. Переполнили буфер — сразу BSOD. Варианты с использованием связок промежуточный драйвер — обработка на 3 кольце, нравиться мне еще меньше. Очень криво идут данные — путешествую то из ядра, то обратно в ядро. Для почты это может и не очень существенно, но вообще — кривой подход. LSP (или как вариант перехват сокетов, что по-сути тоже самое) кажется наилучшим вариантом, хотя согласен, в разработке (и особенно в отладке) наиболее трудоемким.
Да пребудет с тобою сила
Re[5]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: IGor_79 Украина  
Дата: 18.10.04 12:53
Оценка:
Здравствуйте, TarasCo, Вы писали:



TC>А в дровах все плохо..... Возмите Outpost у него фильтрация высокоуровневых протоколов живет в ядре. Ошибка в реализации (а ведь это обычно самое глюченное и опасное — синтаксический анализ и.т.п. , что в свою очередь рано или поздно приведет к переполнению со всеми вытекающими) приводит к возникновению дыр на уровне ядра. Переполнили буфер — сразу BSOD.

Следует заметить, что LSP "вешается" ко всем сетевым процессам (включая системные сервисы),
и следовательно ошибка в самой LSP часто приводит к краху системы...
Наш спор мне напоминает спор, который разгорелся, когда MS перенесла графическую
подсистему в режим ядра. В книге Соломона, Русиновича приводится достаточно смешная
аргументация, что-то типа того, что независимо от того в каком режиме навернется
графическая подсистема — в пользовательском или в режиме ядра, все равно наступят
гайки, просто в первом случае они наступят чуть позже


TC> Варианты с использованием связок промежуточный драйвер — обработка на 3 кольце, нравиться мне еще меньше. Очень криво идут данные — путешествую то из ядра, то обратно в ядро. Для почты это может и не очень существенно, но вообще — кривой подход.


Я согласен, что у этого подхода есть недостатки и основной заключается в том, что данные будут
гоняться из одного режима в другой (и это нужно учитывать при выборе метода).

Перехват трафика — это достаточно низкоуровневая вещь, а здесь редко встретишь идеальные решения —
всегда нужно идти на какой-то компромисс.
Re[4]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: postmaster  
Дата: 18.10.04 14:33
Оценка:
Здравствуйте, IGor_79, Вы писали:

IG_>Здравствуйте, postmaster, Вы писали:


P>>Здравствуйте, butcher, Вы писали:


B>>>Может вам проще использовать перехват Winsock2 API? Поищите в гугле на тему Detours.


P>>Лучше LSP (Layered Service Provider).


IG_>А вот этого лучше не надо.

IG_>У нас LSP в нескольких проектах используется
IG_>и поверьте мне на слово — удовольствие еще то...

IG_>Основная проблема в том, что вы становитесь зависимым от

IG_>моделей ввода-вывода, используемых клиентом (select, WsaAsyncSelect, etc.),

А при использовании Detours не становишься?

IG_>а если еще в клиенте какой-то недочет, который обнаруживается

IG_>в достаточно специфичных условиях... и т.д. и т.п.
IG_>Лучше уж сразу дрова...

Согласен.
Хотя и там проблем хватает.
Re[6]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: TarasCo  
Дата: 18.10.04 15:07
Оценка:
Здравствуйте, IGor_79, Вы писали:

IG_>Здравствуйте, TarasCo, Вы писали:




TC>>А в дровах все плохо..... Возмите Outpost у него фильтрация высокоуровневых протоколов живет в ядре. Ошибка в реализации (а ведь это обычно самое глюченное и опасное — синтаксический анализ и.т.п. , что в свою очередь рано или поздно приведет к переполнению со всеми вытекающими) приводит к возникновению дыр на уровне ядра. Переполнили буфер — сразу BSOD.

IG_>Следует заметить, что LSP "вешается" ко всем сетевым процессам (включая системные сервисы),
IG_>и следовательно ошибка в самой LSP часто приводит к краху системы...

Никто Вас не заставляет делать это — перехватывать все соединения подряд. Определить процесс, куда Вас занесло, вполне возможно. Если это "не тот" процесс, просто при вызове WSPStartup передайте вниз все параметры без изменений и в этом процессе Вас уже не тронут . Вопрос о том, что кто то может "подделаться" под неприкасаемые процессы (напрмер, запустить свою служьу в svchost где нибудь рядом c lsa) из другой плоскости... если программа может себя регистрировать как SYSTEM или LOACL SERVICE, она может снести любой супервизор к чертовой матери, или даже его обмануть....
Да пребудет с тобою сила
Re[7]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: TarasCo  
Дата: 19.10.04 06:41
Оценка: 3 (1)
Здравствуйте, TarasCo, Вы писали:

TC>Здравствуйте, IGor_79, Вы писали:


IG_>>Здравствуйте, TarasCo, Вы писали:




TC>>>А в дровах все плохо..... Возмите Outpost у него фильтрация высокоуровневых протоколов живет в ядре. Ошибка в реализации (а ведь это обычно самое глюченное и опасное — синтаксический анализ и.т.п. , что в свою очередь рано или поздно приведет к переполнению со всеми вытекающими) приводит к возникновению дыр на уровне ядра. Переполнили буфер — сразу BSOD.

IG_>>Следует заметить, что LSP "вешается" ко всем сетевым процессам (включая системные сервисы),
IG_>>и следовательно ошибка в самой LSP часто приводит к краху системы...

TC>Никто Вас не заставляет делать это — перехватывать все соединения подряд. Определить процесс, куда Вас занесло, вполне возможно. Если это "не тот" процесс, просто при вызове WSPStartup передайте вниз все параметры без изменений и в этом процессе Вас уже не тронут . Вопрос о том, что кто то может "подделаться" под неприкасаемые процессы (напрмер, запустить свою служьу в svchost где нибудь рядом c lsa) из другой плоскости... если программа может себя регистрировать как SYSTEM или LOACL SERVICE, она может снести любой супервизор к чертовой матери, или даже его обмануть....



Еще добавлю...
Если Вам по каким то причинам не хочется перехватывать конкретное соединение, то из WSPSocket достаточно вернуть оригинальный идентификатор сокета — все дальнейшие вызовы пойдут к провайдеру его создавшему и минуют Вас
Да пребудет с тобою сила
Re[7]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: IGor_79 Украина  
Дата: 19.10.04 09:25
Оценка:
Здравствуйте, TarasCo, Вы писали:

TC>Никто Вас не заставляет делать это — перехватывать все соединения подряд. Определить процесс, куда Вас занесло, вполне возможно. Если это "не тот" процесс, просто при вызове WSPStartup передайте вниз все параметры без изменений и в этом процессе Вас уже не тронут . Вопрос о том, что кто то может "подделаться" под неприкасаемые процессы (напрмер, запустить свою служьу в svchost где нибудь рядом c lsa) из другой плоскости... если программа может себя регистрировать как SYSTEM или LOACL SERVICE, она может снести любой супервизор к чертовой матери, или даже его обмануть....


Если процесс "ms-овский" (вроде svchost), то да, я с вами согласен, ну а если сторонний разработчик? Основная проблема как раз и заключается в конфликте с другими приложениями... Хотя и у драйверов есть та же проблема...
Или вы предлагаете составить целую таблицу процессов, к которым не стоит аттачится? Тоже не самое лучшее решение...
Плюс возникает неприятная ситуация, когда в системе не только наша LSP.

Ну и еще раз повторюсь: главная проблема заключается в том, что в LSP приходится поддерживать различные модели ввода-вывода, плюс в LSP вы сильно зависимы от клиента. А если еще должна осуществляться достаточно сложная логика
по подмене, отсылке/приему данных, то это труба.
Re[8]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: IGor_79 Украина  
Дата: 19.10.04 09:28
Оценка:
Здравствуйте, TarasCo, Вы писали:


TC>Еще добавлю...

TC>Если Вам по каким то причинам не хочется перехватывать конкретное соединение, то из WSPSocket достаточно вернуть оригинальный идентификатор сокета — все дальнейшие вызовы пойдут к провайдеру его создавшему и минуют Вас

А вот это я не понял...
Во-первых при вызове WSPSocket соединение еще не создано (и не факт, что будет создано — например создание слушающего сокета).
А во-вторых это каким макаром все вызовы пойдут не через меня?
Re[5]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: IGor_79 Украина  
Дата: 19.10.04 09:30
Оценка:
Здравствуйте, postmaster, Вы писали:


P>А при использовании Detours не становишься?

Я про Detours ничего не говорил
Re[8]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: TarasCo  
Дата: 19.10.04 10:33
Оценка: :))) :)
Здравствуйте, IGor_79, Вы писали:

IG_>Здравствуйте, TarasCo, Вы писали:


TC>>Никто Вас не заставляет делать это — перехватывать все соединения подряд. Определить процесс, куда Вас занесло, вполне возможно. Если это "не тот" процесс, просто при вызове WSPStartup передайте вниз все параметры без изменений и в этом процессе Вас уже не тронут . Вопрос о том, что кто то может "подделаться" под неприкасаемые процессы (напрмер, запустить свою служьу в svchost где нибудь рядом c lsa) из другой плоскости... если программа может себя регистрировать как SYSTEM или LOACL SERVICE, она может снести любой супервизор к чертовой матери, или даже его обмануть....


IG_>Если процесс "ms-овский" (вроде svchost), то да, я с вами согласен, ну а если сторонний разработчик? Основная проблема как раз и заключается в конфликте с другими приложениями... Хотя и у драйверов есть та же проблема...

IG_>Или вы предлагаете составить целую таблицу процессов, к которым не стоит аттачится? Тоже не самое лучшее решение...
IG_>Плюс возникает неприятная ситуация, когда в системе не только наша LSP.

IG_>Ну и еще раз повторюсь: главная проблема заключается в том, что в LSP приходится поддерживать различные модели ввода-вывода, плюс в LSP вы сильно зависимы от клиента. А если еще должна осуществляться достаточно сложная логика

IG_>по подмене, отсылке/приему данных, то это труба.

Все равно в коде будет баг. Когда упадет IE из за Вашей (или моей ) ошибки, пользователь скажет "е...й IE и MS", а когда упадет ваш драйвер и вся система из-за ошибки и похерит еще какой нибудь рабочий файл, который пользователь должен был редактировать а в место чего сидел в инете, угадайте, что он скажет?
Да пребудет с тобою сила
Re[9]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: TarasCo  
Дата: 19.10.04 11:43
Оценка:
Здравствуйте, IGor_79, Вы писали:

IG_>Здравствуйте, TarasCo, Вы писали:



TC>>Еще добавлю...

TC>>Если Вам по каким то причинам не хочется перехватывать конкретное соединение, то из WSPSocket достаточно вернуть оригинальный идентификатор сокета — все дальнейшие вызовы пойдут к провайдеру его создавшему и минуют Вас

IG_>А вот это я не понял...

IG_>Во-первых при вызове WSPSocket соединение еще не создано (и не факт, что будет создано — например создание слушающего сокета).
IG_>А во-вторых это каким макаром все вызовы пойдут не через меня?

С каждым сокетом ассоциирован провайдер. Когда Вы создаете сокет через WPUCreateSocketHandle Вы же указываете его номер. Если Вы в своей ф. WSPSocket не подмените дескриптор, а вернете оригинальный, все дальнейшие вызовые пойдут тому провайдеру, который создал этот дескриптор.

На мой взгляд, это дурацкая концепция. По сути паралелльно могут работать два провайдера, хотя всем ново созданным сокетам и будут подсовывать самого верхнего. И это приводит к одному неприятному багу во время "горячей" инсталляции и деинсталяции. Если без всякого "хакерства", то LSP фильтр сразу после инсталяции работает с некоторыми приложениями (в т.ч. и системными, такими как winlogon) некорректно и блокирует соединения.
Да пребудет с тобою сила
Re[9]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: postmaster  
Дата: 20.10.04 12:28
Оценка: :)
Здравствуйте, TarasCo, Вы писали:

TC>Все равно в коде будет баг. Когда упадет IE из за Вашей (или моей ) ошибки, пользователь скажет "е...й IE и MS", а когда упадет ваш драйвер и вся система из-за ошибки и похерит еще какой нибудь рабочий файл, который пользователь должен был редактировать а в место чего сидел в инете, угадайте, что он скажет?


"е...й Windows и MS"
Тем более, что источник ошибки без отладчика иногда понять просто нельзя.
Re[10]: Перехват EMAIL и анализ POP3 протокола на уровне TCP
От: TarasCo  
Дата: 20.10.04 13:16
Оценка:
Здравствуйте, postmaster, Вы писали:

P>Здравствуйте, TarasCo, Вы писали:


TC>>Все равно в коде будет баг. Когда упадет IE из за Вашей (или моей ) ошибки, пользователь скажет "е...й IE и MS", а когда упадет ваш драйвер и вся система из-за ошибки и похерит еще какой нибудь рабочий файл, который пользователь должен был редактировать а в место чего сидел в инете, угадайте, что он скажет?


P>"е...й Windows и MS"

P>Тем более, что источник ошибки без отладчика иногда понять просто нельзя.

Более того, его можно тщательно укрыть, наставив подобных вещей:
try {
}
catch(...)
{
throw 0; //к примеру.
}
Этак можно даже при установленном отладчике скрыться от возмездия
Да пребудет с тобою сила
Re[11]: Перехват EMAIL и анализ POP3 протокола на уровне TCP
От: postmaster  
Дата: 20.10.04 14:56
Оценка: :)))
Здравствуйте, TarasCo, Вы писали:

P>>Тем более, что источник ошибки без отладчика иногда понять просто нельзя.


TC>Более того, его можно тщательно укрыть, наставив подобных вещей:

TC>try {
TC>}
TC>catch(...)
TC>{
TC> throw 0; //к примеру.
TC>}
TC>Этак можно даже при установленном отладчике скрыться от возмездия

Лучше сделать jmp куда-нить в недра ядра.
Пускай само разбирается с проблемой.
Re[6]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: postmaster  
Дата: 20.10.04 16:04
Оценка:
Здравствуйте, IGor_79, Вы писали:

IG_>Здравствуйте, postmaster, Вы писали:



P>>А при использовании Detours не становишься?

IG_>Я про Detours ничего не говорил

Тогда что предлагалось взамен?
Re[5]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: postmaster  
Дата: 20.10.04 16:05
Оценка:
Здравствуйте, postmaster, Вы писали:

IG_>>Основная проблема в том, что вы становитесь зависимым от

IG_>>моделей ввода-вывода, используемых клиентом (select, WsaAsyncSelect, etc.),

P>А при использовании Detours не становишься?


Вдогонку.
Сегодня наблюдал работу двух программ, которые одновременно пытались захучить одну и ту же системную функцию (через Detours и каким-то своим методом).

Чтотораздирающее зрелище.
Re[7]: Перехват EMAIL и анализ POP3 протокола на уровне TCP/
От: IGor_79 Украина  
Дата: 21.10.04 09:49
Оценка: 7 (1)
Здравствуйте, postmaster, Вы писали:

P>Тогда что предлагалось взамен?


Смотрю тема еще жива... почему-то всем хочется что-то похакать, поснифеть, поперехватывать...

Просто человек сказал, что он не очень силен в сетевом программировании, а без хорошего знания winsock LSP не напишешь... Ну и вторя вам я предложил дрова...


Так как вопрос об LSP остался открытым, выскажу свою точку зрения, в каких случаях следует использовать LSP, а в каких нет.
Перефразировав известное высказывание замечу, что цель определяет средства. В первую очередь следует определиться с целями, которые ставятся. LSP следует использовать в случае фильтрации сетевого трафика (да и то, далеко не всегда), но не для осуществления политики сетевой безопасности (Firewall, NIDS(Network Intrusion Detection System), etc.) – для этих целей следует использовать драйвера!

Итак, если нужна фильтрация трафика , то нужно определиться с целями:

1. Просто в образовательных целях — можно, а для лучшего понимания Windows specific sockets очень даже желательно
(так сказать, достаточное условие понимания )
2. Если проект некоммерческий, то наверное не стоит, так как есть достаточно средств с подходящими лицензионными соглашениями.
3. Проект коммерческий и ни одно из фриварных средств не подходит.
На первый взгляд, LSP самое подходящее решение, но это не всегда так. О сложностях с которыми приходится сталкиваться при реализации LSP я говорил здесь
Автор: IGor_79
Дата: 19.10.04
. Тут все зависит от самого проекта – если проект короткосрочный и многое делается в режиме “quick hack’a”, либо же заранее известно клиентское приложение, трафик которого нужно мониторить, тогда LSP – то что доктор прописал. Достаточно взять ms-овский готовый шаблон и “прикрутить” к нему необходимую функциональность. Если имя процесса известно, то это сильно упрощает жизнь, так как нет необходимости аттачиться к остальным процессам и можно “забить” на различные модели ввода-вывода и сконцентрироваться только на одной – используемой данным приложением. Но если проект долгосрочный, если в дальнейшем он будет требовать сопровождения, будет развиваться, будет добавляться новая функциональность, заранее неизвестны поддерживаемые клиенты, тогда про LSP стоит забыть и обратить взгляд в сторону драйверов.
Возможен и такой вариант – сначала пишется функционал и прикручивается к LSP, но с таким учетом, чтобы в дальнейшем перейти на драйвера. Можно пойти дальше – отделить движок, от транспортного канала(LSP, драйвер), введя еще один уровень абстракции, скрывающий низкоуровневые детали, таким образом при переходе с LSP на драйвер в движке даже ничего не нужно будет менять. Но это имеет смысл в случае, если движок достаточно тяжеловесный и не имеет смысла тянуть его в режим ядра, либо если он выполняет и другие функции несвязанные с мониторингом трафика.

ЗЫ
Еще отмечу, что проводилось маленькое исследование на тему использования LSP различными компаниями
Так вот, используют LSP единицы, большинство — драйвера

ЗЫЗЫ
Сори что так длинно получилось – сам не ожидал
Re[10]: Перехват EMAIL и анализ POP3 протокола на уровне TCP
От: IGor_79 Украина  
Дата: 21.10.04 09:58
Оценка:
Здравствуйте, postmaster, Вы писали:

P>Здравствуйте, TarasCo, Вы писали:


TC>>Все равно в коде будет баг. Когда упадет IE из за Вашей (или моей ) ошибки, пользователь скажет "е...й IE и MS", а когда упадет ваш драйвер и вся система из-за ошибки и похерит еще какой нибудь рабочий файл, который пользователь должен был редактировать а в место чего сидел в инете, угадайте, что он скажет?


P>"е...й Windows и MS"

P>Тем более, что источник ошибки без отладчика иногда понять просто нельзя.

Боюсь, что если даже упадет где-то сервер под unix, то юзер все равно скажет
"е..й IE, Windows и MS"...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.