Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Обход эвристики Avira AntiVir в JavaScript

08.01.2009 | Категория: Web-мастеру и не только | Автор: ManHunter
Последние несколько дней посетители сайта стали жаловаться, что их антивирус эвристически определяет в HTML-коде страниц сайта вредоносный код. Их объединяло одно: они все пользовались "антивирусом" (в кавычках) под гордым названием Avira AntiVir. После недолгого расследования и тестирования было выяснено, что эта недоделка ругается на скрипт добавления страницы в закладки, а конкретно на его часть, отвечающую за работу в Internet Explorer:
  1. // Internet Explorer
  2. window.external.AddFavorite(urltitle);
Не знаю что надо курить, чтобы додуматься распознавать это действие как опасное, однако факт остается фактом: абсолютно безопасный код распознается этим "антивирусом" как вредоносный. Эвристика ругается на добавление страницы в закладки официально документированными средствами! Отличный пример как НЕ надо писать программы. Чтобы заткнуть Avira достаточно в скрипте чуть-чуть изменить сигнатуру "AddFavorite", а при выполнении привести ее в первоначальный вид:
  1. // Internet Explorer
  2. eval("window.external.AddFa-vorite(url, title)".replace(/-/g,''));
Приношу извинения пользователям за доставленные неудобства. А тупым дрочерам из младших классов, которые писали этот "антивирус", могу только порекомендовать поменьше лазать по порносайтам, тогда и в закладки ничего ставиться не будет. Ну и напоследок: реально вредоносный код на HTML-страницах можно спрятать от Avira AntiVir точно таким же примитивнейшим способом. Выводы о надежности этой поделки, думаю, сделаете сами.

Просмотров: 8486 | Комментариев: 16

Запрет запуска нескольких копий программы

25.12.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Запрет запуска нескольких копий программы бывает полезен если может возникнуть конфликт из-за занятых системных ресурсов, монопольно открытых файлов или если задачи приложения подразумевают наличие только одного его экземпляра. Проверка наличия работающей копии программы реализуется несколькими способами в зависимости от поставленной задачи.

Первый способ основан на том, что в приложении можно определить расшаренную секцию, данные из которой будут доступны для всех его запущенных экземпляров. Достаточно прописать в ней некоторую переменную и присвоить ей уникальное значение. При старте выполняется проверка, и если значение переменной равно начальному, то считается что это старт первой копии, иначе приложение является второй копией и должно завершить свою работу. Поэтому первая копия приложения сразу после запуска и проверки должна заменить значение переменной на другое.
  1. ; Расшаренная секция, общая для всех копий данного приложения
  2. section '.shared' data readable writeable shareable
  3. started  dd  1       ; Флаг первого запуска
  4.  
  5. ; Сегмент кода
  6. section '.code' code readable executable
  7.         cmp     [started],1       ; Уже запущен экземпляр программы?
  8.         jne     already_started   ; Да, на выход
  9.         xor     eax,eax
  10.         ; Префикс LOCK и команда XCHG используются для предотвращения
  11.         ; возможных конфликтов на многопроцессорных машинах
  12.         lock xchg eax,[started]   ; Сбросить флаг
  13.         ; Нормальный запуск программы 
  14.         ...
  15. already_started:
  16.         ; Выход из программы
  17.         ...
Этот способ будет работать только если приложение запускается из одной и той же папки. Если скопировать его в другую папку, то система будет считать что это совершенно другое приложение и разрешит запуск его второй копии. Впрочем, способ с расшаренной секцией вполне имеет место быть, если требуется запретить именно запуск второй копии приложения из одной и той же папки. Для глобального запрета этот способ не подходит.

Читать статью целиком »
Просмотров: 12809 | Комментариев: 6

Защита от спама на сайтах и форумах

14.12.2008 | Категория: Web-мастеру и не только | Автор: ManHunter
Проблема спама в комментариях, гостевых книгах, сообщениях на форумах в настоящее время стоит очень остро. Раньше даже простенькая капча или подтверждение регистрации на форуме по e-mail были практически непреодолимым препятствием для спамботов и автосабмиттеров. Теперь появились достаточно мощные программы для авторегистрации и рассылки спама, способные реально обходить эти защиты. Никаких названий и ссылок на сайты указывать не буду, чтобы не делать рекламы этим ублюдкам. В описании одного из спамботов его аффтар хвалится:


Эксклюзивная возможность - программа обходит ЛЮБЫЕ виды защиты от автоматической регистрации и автосабмита! Такие, как:
- Защита при помощи пиктокода (тикетов) типа "Введите число, которое видите".
- Защита при помощи активации по e-mail.
- Защита при помощи некоторых Java-скриптов.
- Возможность распознавания защиты в виде арифметических операций и логических вопросов


а на следующей же страничке расписывается в своей беспомощности:


Изредка на некоторых форумах встречается защита от автосабмита в виде java- или VB-скрипта.
Как показала практика, чтобы научить программу обходить такого рода защиту, совсем необязательно писать полнофункциональный обработчик скрипта. Главное, чтобы такой вид защиты был достаточно распространён: нецелесообразно создавать обработчик, если такая защита используется только на одном-двух форумах.


Значит наш удар будет нанесен в самое слабое место спамботов - невозможность обрабатывать формы, защищенные при помощи скриптов JavaScript. Лично я противник использования на сайтах различных навороченных капчей, которые не то что робот, а и не каждый здоровый человек разберет. После первого же неправильного ввода желание оставлять комментарий, да и вообще посещать подобный ресурс, очень резко уменьшается. Туда же идут всякие "сколько будет 2+3", "что нарисовано на картинке" и прочие лишние телодвижения, не связанные непосредственно с комментированием.

Читать статью целиком »
Просмотров: 29339 | Комментариев: 64

Расчет хеша MD5 на Ассемблере

23.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Функция расчета хеша MD5 на Ассемблере. Готовых решений на FASM как всегда не было, пришлось портировать из MASM. Для работы процедуры в сегменте .data надо подготовить следующие данные:
  1. ; Сегмент данных
  2. section '.data' data readable writeable  
  3. ...
  4. ; Шаблоны функции wsprintf для перевода хеша в строковый вид,
  5. ; при необходимости можно оставить только какой-нибудь один
  6. szMD5Format1 db '%.8X%.8X%.8X%.8X',0  ; Для получения заглавных букв
  7. szMD5Format2 db '%.8x%.8x%.8x%.8x',0  ; Для маленьких букв в строке хеша
  8.  
  9. stMD5Result:
  10.   stdtA      dd ?   ; Переменные для получения и хранения
  11.   stdtB      dd ?   ; результата хеширования
  12.   stdtC      dd ?
  13.   stdtD      dd ?
  14.  
  15. stMD5Hash    rb 33  ; Буфер для строки хеша в формате ASCIIZ
А вот собственно сама процедура хеширования и пример использования:

Читать статью целиком »
Просмотров: 7452 | Комментариев: 5

Проверка принадлежности IP-адреса заданному диапазону

19.11.2008 | Категория: Web-мастеру и не только | Автор: ManHunter
Проверка вхождения IP в заданный диапазон может применяться во многих ситуациях. Например бан всей подсетки злоумышленника, принудительное ограничение скорости для зарубежного трафика, переадресация на различные разделы сайта в зависимости от провайдера пользователя и т.д. Я использую такие функции:
  1. // ------------------------------------------------------------
  2. // Проверка вхождения IP в заданный диапазон
  3. // На входе:
  4. // $ip - массив октетов проверяемого IP
  5. // $ip_start - массив октетов начала интервала
  6. // $ip_end - массив октетов конца интервала
  7. // В интервалах допускаются маски '*'
  8. // На выходе: TRUE или FALSE, входит IP или нет в диапазон
  9. // ------------------------------------------------------------
  10. function chk_ips($ip,$ip_start,$ip_end) {
  11.   for ($i=0$i<4$i++) {
  12.     if ($ip_start[$i]=='*') { $ip_start[$i]='0'; }
  13.     if ($ip_end[$i]=='*') { $ip_end[$i]='255'; }
  14.   }
  15.   $ip_num=ip2long(join('.',$ip));
  16.   if ($ip_num>=ip2long(join('.',$ip_start)) 
  17.       && $ip_num<=ip2long(join('.',$ip_end))) {
  18.     // IP входит в интервал
  19.     return true;
  20.   }
  21.   else {
  22.     // IP не входит в интервал
  23.     return false;
  24.   }
  25. }
Функция универсальная, позволяет обрабатывать одиночные IP-адреса, точно заданные диапазоны и диапазоны с маской "*" в любом октете. Дополнительных проверок на корректность диапазонов не производится.

Читать статью целиком »
Просмотров: 15462 | Комментариев: 1

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2019
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.13 сек. / MySQL: 3 (0.0512 сек.) / Память: 5 Mb
Наверх