Здравствуйте. Собственно меня интересует, какими путями браузеры получают информацию о html-коде страницы и собственно сам html-код. Хотел приспособить свой драйвер, осуществляющий хук TDI для контроля и коррекции html-кода. С целью удаления из него внедренных объектов, а именно flash. Но почему-то информация, перехватываемая в драйвере, содержит только обрывки html-кода и запросов GET. Цельной картины не наблюдается. Вот такой код: Код (Text): if (irp == NULL) return STATUS_SUCCESS; pStack = IoGetCurrentIrpStackLocation(irp); if (pStack->MajorFunction == IRP_MJ_INTERNAL_DEVICE_CONTROL) { if (pStack->MinorFunction == TDI_SEND){ mdlBuffer = MmGetSystemAddressForMdlSafe (irp->MdlAddress, LowPagePriority); if (mdlBuffer){ data = strstr (mdlBuffer,"ShockwaveFlash"); if (data) { DbgPrint("%s", mdlBuffer); memcpy(data,"FuckwaveFlash", 13); } } } } пропускает "ShockwaveFlash" и он присутствует в html-коде страниц. То же самое, если strstr на предмет наличия тега "<object>". Правда в случае с поиском по расширению запрашиваемого url (.swf) иногда удается вырезать его и флэш не выводится. Где искать следы flash-ей ? Спасибо.
сейчас опять перекомпилировал драйвер на поиск по расширению запрашиваемого ресурса e.eee) - пока ни один флэш не проскочил. Почему раньше проскакивал - уже не вспомню, давно было... Теперь такая штука: перехватываю запросы например: GET /software/flash/about/so_redirece.eee HTTP/1.1 и искажаю таким образом: GET /software/flash/about/so_redirect.eee HTTP/1.1 браузер ждет ответ на свой запрос, естественно не получает положительного ответа и флэш не загружается. Но тут два варианта: либо браузер не дождавшись ресурса, бросает его и начинает выводить остальной контент страницы, либо он его откладывает "на потом", загружает остальное и затем возвращается к флэшу и ждет его. В первом случае просто небольшая задержка на ожидание ответа на запрос, во втором случае приходится смотреть на статусбар браузера, и когда он "упёрся" во флэш, принудительно останавливать загрузку страницы. Что нужно сделать с запросом GET, чтобы браузер не ожидал на него ответа? P.S. Админы, а что за глюк форума такой? - в первом предложении этого поста набирал расширение e.eee), а выводятся четыре буквы "е". Думал опечатался - поправил - ан нет, снова выводит e.eee) P.P.S. Сейчас ещё раз попробую набрать расширение, только через подчеркивание: ._s_w_f P.P.P.S. Ой блин, на свой же драйвер нарвался :-\
cresta Браузер в любом случае будет ждать ответа на свой запрос Если поменять GET на HEAD, то ответа ему долго ждать не придётся, но флеша в нём не будет.
То, что в ответе на GET флеша не будет - это меня не расстраивает, скорее наоборот. А вот GET на HEAD я же не смогу поменять. Вернее поменять смогу, но браузер об этом ничего не знает, и по-прежнему ждёт ответа на GET. Хотя вот сейчас подумал о таком варианте: если GET содержит запрос файла (url) с расширением .swf, то менять этот url на 127.0.0.1 - и пусть там ищет свой флеш Надо будет попробовать, правда возможно, что на месте объекта будет надпись типа "Невозможно отобразить страницу" как обычно бывает, если запрос перенаправляется на локальный ресурс в файле hosts. Но самый лучший способ - это перехватить html-код, получаемый браузером, и там, в зародыше, удалить все флеши. Возможно, этот код можно обнаружить по TDI_RECEIVE, надо попробовать.
вот я о чём и говорю: найти, где передается входящий код. Пробовал смотреть в TDI_RECIEVE - там ничего нет, ни входящего, ни исходящего. А по какому каналу принимается html - не могу найти.
Можно сразу же сказать броузеру HTTP 404 Not found и пытаться отображать флеш он не будет. Форум, не отображающий e.eee - достойно башорга
404 Not found приведет к выводу этого самого 404 Not found на страницу - неэстетично. Пока у меня просто чистое место там, где должен быть флеш, меня это устраивает, вот только время тратится на ожидание, его бы уменьшить.
Ну как - не нашёл место где входящий запрос прячется??? Сам сейчас занимаюсь данной темой - аналогично фильтровать по расширению контент уже получается - но так чтоб перехватить входящий запрос - ещё нет.
Когда приходит запрос на флеш подставляй ему сразу ответ, какую-нибудь заранее заготовленную флешку с шевелящейся надписью "здесь был флеш"...
попробуй отлавливать по mimу типа Код (Text): GET http://bla.bla.bla/bla.bla HTTP/1.0 Accept: */* Referer: http://bla.bla.bla Accept-Language: ru Proxy-Connection: Keep-Alive User-Agent: Mozilla/10.0 Host: bla.bla.bla Pragma: no-cache ответ Код (Text): HTTP/1.0 200 OK Date: Mon, 29 Sep 2996 29:95:58 GMT Server: Apache/9.3.26 (Unix) PHP/9.9.9 rus/PL99.99 Last-Modified: Thu, 20 Nov 2003 22:07:03 GMT ETag: "63b43c-22695-3fbd3b07" Accept-Ranges: bytes Content-Length: 9999999 Connection: close [b]Content-Type: application/x-shockwave-flash[/b] более подробно посмотри исходники SQUID а как перенести на M$ смотри в каком нить Platform SDK скорей всего чёта подобное публиковалось во всяком случае видел тока где не помню в PSDK, MSDN или ищё где
P.S. Порой в направлении SHDOCVW.DLL, IWebBrowser, WebBrowser Control P.P.S. А где кнопка "ПРАВИТЬ" ???
Я видимо не совсем верно выразился. Из первого поста cresta видно что Код (Text): if (pStack->MajorFunction == IRP_MJ_INTERNAL_DEVICE_CONTROL) if (pStack->MinorFunction == TDI_SEND) следовательно мы анализируем mdlBuffer = MmGetSystemAddressForMdlSafe (irp->MdlAddress, LowPagePriority); на наличие в mdlBuffer интересующих нас ключевых слов. В DebugView в этом месте я вижу чтото типа Код (Text): GET /smiles/Main/laugh.gif HTTP/1.1 Accept: */* Referer: http://forum.sources.ru/index.php?s=6936039c0d7a5760044a37e5b3bd0537&showtopic=59470&st=30 Accept-Language: ru Accept-Encoding: gzip, deflate If-Modified-Since: Thu, 30 Sep 2004 20:00:00 GMT If-None-Match: "2d2fa-2b2-1f94f000" User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Host: forum.sources.ru Connection: Keep-Alive Cookie: hotlog=1; session_id=6936039c0d7a5760044a37e5b3bd0537 Я не ориентируюсь в HTTP но понимаю что это запрос браузера на определённый ресурс. А как браузер понимает что именно этот запрос надо отправить серверу? По сей вероятности в какомто запросе сервер известил клиента что именно содержится на запрошенной странице - но в каком именно он это делает?(Это вопрос спецам по HTTP). Кроме того запрос может быть пожат с целью экономии( Код (Text): Accept-Encoding: gzip, deflate - это видно отсюда) - как можно заставить сервак слать всё в непожатом виде?? На сколько я знаю Аутпост делает это какимто образом. А ещё проблема - запросы HTTPS - как можно фильтровать их? только по порту?
Да нет - я подразумевал что возможно можно просто его настроить его собственными средствами. Но в любом случае спасибо за ответ.
что проще - десятком строк кода подменить заголовок (будет работать для _любых_ приложений на данном компе) или пытаться менять настройки в сотнях программ, тащящих контент с инета ?
Вопрос конечно больше риторический - потому и ответ будет гдето в таком же духе - Всё зависит от того, чего вы хотите добиться. Чтоб было более понятно опишу полнее задачу - необходимо фильтровать HTTP & HTTPS трафик для 4ёх видов броузеров - IE, Firefox, Netscape & Opera. Мне вообще предлагали плагины на каждый из этих браузеров написать .