Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Как перехватить HTTP - запрос?


Автор: Guest 9.12.2005, 17:34
Здравствуйте. Мне нужно написать программу, которая будет постоянно висеть в памяти и регистрировать на какие сайты пользователь заходит (независимо от браузера). Интересует именно как перехватить это событие, когда пользователь загружает страницу, ну и URL этой страницы.

Автор: Snowy 9.12.2005, 17:39
Это слишком сложно.
Обычно такие вещи делают на уровне прокси сервера.

Автор: Guest 9.12.2005, 17:40
Цитата(Snowy @ 9.12.2005, 17:39)
Это слишком сложно.
Обычно такие вещи делают на уровне прокси сервера.

Ну можно же как-то контролировать исходящий траффик?

Автор: Snowy 9.12.2005, 17:48
Цитата(Guest @ 9.12.2005, 17:40)
Ну можно же как-то контролировать исходящий траффик?

Траффик да. Но собирать пакеты, вытаскивать из них данные, соединять их, отбрасывая лишнее... Это специализированный сниффер должен быть.
Добавлено @ 17:49
Кстати, можешь спросить у гугля или т.п. на тему HTTP снифера.

Автор: Teran 9.12.2005, 17:58
Guest когда раскопаеш что-то скинь сюда пожалуйста меня тоже эта тема интересует

Автор: Guest 9.12.2005, 19:29
А если определять к каким айпишникам коннектится юзер и по ним получать урлы?

Автор: Darhazer 9.12.2005, 19:40
Зачем так сложно.
Программа регестрируеть себя как обработчика http ( HKEY_CLASSES_ROOT\HTTP\Sheel\open\command ) записиваеть адрес, а потом запускает браузер на этого адреса ;)

Автор: Guest 9.12.2005, 19:45
Цитата(Darhazer @ 9.12.2005, 19:40)
Зачем так сложно.
Программа регестрируеть себя как обработчика http ( HKEY_CLASSES_ROOT\HTTP\Sheel\open\command ) записиваеть адрес, а потом запускает браузер на этого адреса ;)

А поподробней можно? Лучше если на примере покажешь smile

Автор: Darhazer 9.12.2005, 19:52
К стате, можеть быт так не получеться когда браузер уже запущен и пользватель пишет адрес в аддресной строке... ;) Но все таки - эта алтернатива -> копаться в реестре smile
Добавлено @ 19:53
Цитата(Guest @ 9.12.2005, 19:29)
А если определять к каким айпишникам коннектится юзер и по ним получать урлы?

Можно по URL получить IP, но по IP->URL - нет, так как на одном сервере (одном IP) могут быть много сайтов (URL)

Автор: Snowy 9.12.2005, 20:34
Цитата(Darhazer @ 9.12.2005, 19:40)
Программа регестрируеть себя как обработчика http

Это вообще не вариант.
Запускаем браузер и все. Программа вообще ничего не видит.

Цитата(Guest @ 9.12.2005, 19:29)
А если определять к каким айпишникам коннектится юзер и по ним получать урлы?

Не серъезно. Как полумера пойдет, но результат ниже среднего.
Так мы только домен определим.
А если человек пошел на тот же narod.ru.
Он может читать анекдоты, религиозную страничку или искать проф информацию.
Мы этого по IP не определим - там тонны сайтов, а IPшников в сотни раз меньше (а может вообще один).
Кроме того, всякого рода банеры тоже создают запросы, а реально мы получим информацию, что пользователь и туда ходил.

Автор: Guest 10.12.2005, 16:32
Ну существуют же HTTP-снифферы и там это как-то реализовано ведь?

Автор: RA 10.12.2005, 17:40
не хотел говрить но скажу smile , проще было бы получать по таймеру (или по событию) информацию из браузера, типа GetIEurl ....

Пища для размышления:
у каждого браузера сущесвует журнал где хранится информация о посещаемых, и посещённых сайтах ...

Можно перехватывать функции вызова из WinInet но имхо, это только для IE, а раз только для ИЕ, то проще иначе.

ЗЫ: Для тех кто собрался писать сниффер http://forum.vingrad.ru/index.php?showtopic=70701


Автор: Teran 27.12.2005, 11:40
На самом деле всё это сделать очень легко и просто smile smile

Кто заинтересуется могу рассказать подробно smile

Автор: Snowy 27.12.2005, 12:21
Цитата(RAdmin @ 10.12.2005, 17:40)
нформацию из браузера, типа GetIEurl ....

Из какого браузера? Из фиревокса или из оперы? А может из нетшкафа?
А, если я вообще досовским арахном пользуюсь...

Цитата(Teran @ 27.12.2005, 11:40)
На самом деле всё это сделать очень легко и просто

Действительно. И как мы все сразу не догадались, как это просто...
Только результата нет...

Цитата(Teran @ 27.12.2005, 11:40)
Кто заинтересуется могу рассказать подробно

Ну так расскажи.

Автор: Teran 27.12.2005, 12:42
необходимо просто напросто поставить хуки на:

функции Send (WSOCK32.DLL) и SendTo (WSOCK32.DLL)

Затем в обработчике отлавливать приходящий буфер, а именно http запрос

структура у него приблизительно такая (Iexplore):
Код

GET http://forum.vingrad.ru/html/translit_only.js HTTP/1.0
Accept: */*
Referer: http://forum.vingrad.ru/index.php?showtopic=73775
Accept-Language: ru
Cookie: proforumforum_read=a%3A1%3A%7Bi%3A85%3Bi%3A1135668044%3B%7D; proforummember_id=13023; proforumpass_hash=1efa643c0b56892ad056737dd9299bd3; proforumsession_id=5b9df56ccf5748242307a8f1de82eab1; CookieIp=80.84.179.174
If-Modified-Since: Sat, 23 Jul 2005 09:40:01 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: forum.vingrad.ru
Proxy-Connection: Keep-Alive

или такая(Opera):
Код

GET http://www.umc.ua/ HTTP/1.0
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 6.01  [ru]
Host: www.umc.ua
Accept: text/html, image/png, image/jpeg, image/gif, image/x-xbitmap, */*
Accept-Language: ru, en
Accept-Charset: windows-1251;q=1.0, utf-8;q=1.0, utf-16;q=1.0, iso-8859-1;q=0.6, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Proxy-Connection: Keep-Alive


т.е. просто необходимо витягивать первую строку, проверять на "Содержание GET, OPTIONS, POST, ...... смотри структуру HTTP запросов http://ru.wikipedia.org/wiki/HTTP"

и все дела причем можно даже при совпадении какого нибудь Урла закрывать данный открытый сокет

ЧЕМ ТЕБЕ НИ СНИФЕР?????
(Работает в любой винде)
Добавлено @ 12:49
Точно также если перехватывать
recv (WSOCK32.DLL) и recvfrom (WSOCK32.DLL)

можно фильтровать приходящие пакеты

(напрмер я себе фильтрую приходящие ActiveX
просто в приходящем пакете ищу совпадение с <object и (</object>) и делаю с ним ... smile ... все что захочу)

Автор: Teran 27.12.2005, 13:41
Кстате здесь упоминалось про разнообразие браузеров

smile Работает на в Любом браузере

Автор: Teran 27.12.2005, 14:28
И того получился полный джентельменский наборчик:

мы знаем имя файла, который лезит в нет,
IP адрес и порт по которому законектился сокет и
ко всему прочиму URL (причем можно запрещать или пропускать)
при необходимости можно еще просматривать что к нам пришло (фильтровать приходящие пакеты)


Просто чудеса какие-то!

Автор: RA 27.12.2005, 14:29
Цитата(Snowy @ 27.12.2005, 12:21)
Из какого браузера? Из фиревокса или из оперы? А может из нетшкафа?
А, если я вообще досовским арахном пользуюсь...


Это для IE (что следует из названия функции) причём уверен в Com/ActiveX есть пример.

Автор: Teran 27.12.2005, 14:48
Если нужно только для IE то можно просто перехватывать

InternetOpenUrlA
InternetOpenUrlW
InternetCreateUrlA
InternetCreateUrlW
InternetCombineUrlA
InternetCombineUrlW

из wininet.dll

Автор: Гость_this 28.12.2005, 13:36
Цитата(Teran @ 27.12.2005, 14:28)
И того получился полный джентельменский наборчик:

мы знаем имя файла, который лезит в нет,
IP адрес и порт по которому законектился сокет и
ко всему прочиму URL (причем можно запрещать или пропускать)
при необходимости можно еще просматривать что к нам пришло (фильтровать приходящие пакеты)


Просто чудеса какие-то!

Действительно, чудеса smile. Спасибо Teran - это то что нужно.

Автор: Guest 29.12.2005, 12:54
Teran
Цитата

ЧЕМ ТЕБЕ НИ СНИФЕР?????
(Работает в любой винде)

Одна проблемма, есть еще https...

Автор: Guest 30.12.2005, 14:09
Цитата(Guest @ 29.12.2005, 12:54)
Одна проблемма, есть еще https...


Защел на: https://addons.mozilla.org/extensions/moreinfo.php?id=655

и вот что находится в отправляемом пакете(opera):
CONNECT addons.mozilla.org:443 HTTP/1.0
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 6.01 [ru]
Host: addons.mozilla.org
Proxy-Connection: close
Connection: close


я думаю что если искать на совпадение какой-то URL чтобы затем закрыть сокет, то все равно на какой сайт лезть: хоть http хоть https

Автор: Teran 30.12.2005, 14:15
ведь не зависимо что набираеш в URL все равно формируется какойто пакет отправки, который можно прочесть и использовать "под себя"

Автор: Guest 3.1.2006, 10:26
Цитата

и вот что находится в отправляемом пакете(opera):
CONNECT addons.mozilla.org:443 HTTP/1.0
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows XP) Opera 6.01 [ru]
Host: addons.mozilla.org
Proxy-Connection: close
Connection: close

Это если сидишь за прокси...

Автор: this 9.1.2006, 18:14
Цитата(Teran @ 27.12.2005, 14:48)
Если нужно только для IE то можно просто перехватывать

InternetOpenUrlA
InternetOpenUrlW
InternetCreateUrlA
InternetCreateUrlW
InternetCombineUrlA
InternetCombineUrlW

из wininet.dll

А не подскажешь как правильно перехватывать эти функции?

Автор: djmix777 18.7.2006, 08:13
привет всем!
тоже интересно как сделать, у кого есть исходники?
помогите чем можете. Спасибо заранее! 

Автор: YoriKim 18.3.2008, 13:45
Цитата(Teran @  27.12.2005,  12:42 Найти цитируемый пост)
Затем в обработчике отлавливать приходящий буфер, а именно http запрос 

Teran, а как получить этот самый буфер??? пробывал следующим образом сделать хук на функцию send:

Код

function NewSend(s: TSocket; var Buf; len, flags: Integer): Integer; stdcall;
begin
  result:=Send(s,Buf,len,flags);
  ShowMessage(PAnsiChar(Buf));
end;


После чего, все приложения вызывающие эту функцию падают.

Автор: RA 18.3.2008, 14:22


Прмер с исходником:
http://madshi.net/appsniff.rar

Необходимы: madshiCodeHook, VirtualTreeView, DelphiFundamentals.

Автор: dedal73rus 21.5.2009, 18:19
разобрался с dll в которой пишутся функции перехвата.не пойму упорно что делать с этой длл (как вызывать из проекта) и как из получать буфер из этой длл ,а точнее из функции Send и SendTo. Просьба на статьи ms rem'а не отсылать,не могу понять((помогите люди 

Автор: RA 24.5.2009, 04:45
Цитата(dedal73rus @  21.5.2009,  18:19 Найти цитируемый пост)
не пойму упорно что делать с этой длл (как вызывать из проекта) и как из получать буфер из этой длл ,а точнее из функции Send и SendTo.


Если ты про Appsniff то:
Длл внедряется в процесс интересующего приложения, в котором длл принимает все Send-ы и Receiv-ы на себя а потом возвращает их процессу у которого она их перехватила, а также передаёт их копию твоему приложению. В примере всё есть . 

Автор: malor 20.8.2009, 18:37
Цитата(RA @ 10.12.2005,  17:40)
Можно перехватывать функции вызова из WinInet но имхо, это только для IE, а раз только для ИЕ, то проще иначе.

Кроме древней статьи http://www.sources.ru/cpp/cpp_ie_under_the_hood.shtml есть еще какие-нить руководства по перехвату "вызовов из WinInet" ? smile 

Автор: hhhhhhhhhhhh 24.9.2011, 17:05
Подскажите. 
Вот перехватил я функции send, wsasend, sendto. 
Проверяю буфер и в GET заголовке нахожу URL который хочу заблокировать. Возвращаю результат INVALID_SOCKET или SOCKET_ERROR.
Все нормально, запрос обламывается, но начинает через определенные промежутки времени опять ломится по этому же адресу, видать по таймауту...
Тут сказали что можно закрыть сокет, а как это правильно сделать?
Как мертво обломить запрос, чтобы не ломился повторно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)