Blog. Just Blog

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

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

Проверка похожести двух слов

11.10.2008 | Категория: Web-мастеру и не только | Автор: ManHunter
Точное сравнение двух символьных строк, даже регистронезависимое, выполнить нетрудно. А как быть, если в одной их них встречаются символы другого алфавита, похожие по написанию? Так, буква "E" в русской и английской раскладке имеет одинаковое написание, или вместо русской "Н(н)" можно написать английскую "H(h)". Этим могут воспользоваться всякие ублюдки, например оставить сообщение на форуме якобы от администрации, зарегистрировав ник, внешне похожий на ник одного из админов. Для проверки похожести двух строк я использую следующую функцию:
  1. // -----------------------------------------------------
  2. // Функция проверки похожести двух слов
  3. // Параметры: $name1 и $name2 - слова для проверки
  4. // $register = TRUE - проверка регистронезависима
  5. //           = FALSE - проверка с учетом регистра
  6. // На выходе: TRUE - слова похожи, FALSE - отличаются
  7. // -----------------------------------------------------
  8. function chk_similarity($word1$word2$register=false) {
  9.   // Очистить слова от служебных символов
  10.   $word1=eregi_replace("[^0-9a-zа-я]","",$word1);
  11.   $word2=eregi_replace("[^0-9a-zа-я]","",$word2);
  12.  
  13.   // Возврат FALSE если длина слов различается
  14.   // или хотя бы одно из них пустое
  15.   if ((strlen($word1)!==strlen($word2)) || strlen($word1)*strlen($word2)==0) {
  16.     return false;
  17.   }
  18.  
  19.   // Заполнить таблицу соответствий
  20.   $pattern1="";
  21.   $pattern2=Array();
  22.  
  23.   $pattern1.="aа";
  24.   $pattern2[]="[аa]";
  25.   $pattern2[]="[аa]";
  26.  
  27.   $pattern1.="AА";
  28.   $pattern2[]="[АA]";
  29.   $pattern2[]="[АA]";
  30.  
  31.   $pattern1.="BВ";
  32.   $pattern2[]="[BВ]";
  33.   $pattern2[]="[BВ]";
  34.  
  35.   $pattern1.="bь";
  36.   $pattern2[]="[bь]";
  37.   $pattern2[]="[bь]";
  38.  
  39.   $pattern1.="cс";
  40.   $pattern2[]="[cс]";
  41.   $pattern2[]="[cс]";
  42.  
  43.   $pattern1.="CС";
  44.   $pattern2[]="[CС]";
  45.   $pattern2[]="[CС]";
  46.  
  47.   $pattern1.="eе";
  48.   $pattern2[]="[eе]";
  49.   $pattern2[]="[eе]";
  50.  
  51.   $pattern1.="EЕ";
  52.   $pattern2[]="[EЕ]";
  53.   $pattern2[]="[EЕ]";
  54.  
  55.   $pattern1.="HН";
  56.   $pattern2[]="[HН]";
  57.   $pattern2[]="[HН]";
  58.  
  59.   $pattern1.="iI1l";
  60.   $pattern2[]="[iI1l]";
  61.   $pattern2[]="[iI1l]";
  62.   $pattern2[]="[iI1l]";
  63.   $pattern2[]="[iI1l]";
  64.  
  65.   $pattern1.="kк";
  66.   $pattern2[]="[kк]";
  67.   $pattern2[]="[kк]";
  68.  
  69.   $pattern1.="KК";
  70.   $pattern2[]="[KК]";
  71.   $pattern2[]="[KК]";
  72.  
  73.   $pattern1.="MМ";
  74.   $pattern2[]="[MМ]";
  75.   $pattern2[]="[MМ]";
  76.  
  77.   $pattern1.="nп";
  78.   $pattern2[]="[nп]";
  79.   $pattern2[]="[nп]";
  80.  
  81.   $pattern1.="oо0";
  82.   $pattern2[]="[oо0]";
  83.   $pattern2[]="[oо0]";
  84.   $pattern2[]="[oо0]";
  85.  
  86.   $pattern1.="OО0";
  87.   $pattern2[]="[OО0]";
  88.   $pattern2[]="[OО0]";
  89.   $pattern2[]="[OО0]";
  90.  
  91.   $pattern1.="pр";
  92.   $pattern2[]="[pр]";
  93.   $pattern2[]="[pр]";
  94.  
  95.   $pattern1.="PР";
  96.   $pattern2[]="[PР]";
  97.   $pattern2[]="[PР]";
  98.  
  99.   $pattern1.="rг";
  100.   $pattern2[]="[rг]";
  101.   $pattern2[]="[rг]";
  102.  
  103.   $pattern1.="TТ";
  104.   $pattern2[]="[TТ]";
  105.   $pattern2[]="[TТ]";
  106.  
  107.   $pattern1.="uи";
  108.   $pattern2[]="[uи]";
  109.   $pattern2[]="[uи]";
  110.  
  111.   $pattern1.="xх";
  112.   $pattern2[]="[xх]";
  113.   $pattern2[]="[xх]";
  114.  
  115.   $pattern1.="XХ";
  116.   $pattern2[]="[XХ]";
  117.   $pattern2[]="[XХ]";
  118.  
  119.   $pattern1.="yу";
  120.   $pattern2[]="[yу]";
  121.   $pattern2[]="[yу]";
  122.  
  123.   $pattern1.="YУ";
  124.   $pattern2[]="[YУ]";
  125.   $pattern2[]="[YУ]";
  126.  
  127.   $pattern1.="З3";
  128.   $pattern2[]="[З3]";
  129.   $pattern2[]="[З3]";
  130.  
  131.   $pattern1.="ч4";
  132.   $pattern2[]="[ч4]";
  133.   $pattern2[]="[ч4]";
  134.  
  135.   $pattern1.="Ч4";
  136.   $pattern2[]="[Ч4]";
  137.   $pattern2[]="[Ч4]";
  138.  
  139.   // Составить регулярное выражение для проверки
  140.   $tmp="^";
  141.   for ($i=0$i<strlen($word1); $i++) {
  142.     $letter=$word1[$i];
  143.     $pos=strpos($pattern1,$letter);
  144.     if ($pos===false) {
  145.       $tmp.=$letter;
  146.     }
  147.     else {
  148.       $tmp.=$pattern2[$pos];
  149.     }
  150.   }
  151.   $tmp.="$";
  152.  
  153.   // Возврат TRUE - слова похожи или равны
  154.   // FALSE - слова отличаются
  155.   return($register?eregi($tmp,$word2):ereg($tmp,$word2));
  156. }
Примеры использования:

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

Защита PHP-скриптов от анализа и модификации

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

Защиты на уровне сервера:

Zend Encoder / Zend SafeGuard Suite - наиболее популярная коммерческая защита, модули для поддержки Zend обычно установлены на всех платных хостингах. Zend предоставляет привязку скриптов к доменам и ip, установку времени триальной работы скриптов и мощную обфускацию. Поддерживаются все операционные системы. В публичном доступе имеется несколько вариантов утилит для снятия Zend'а, все они представляют собой модифицированный PHP 4-й и 5-й версии. Старые версии Zend'а снимаются без проблем, в последних возникают сложности из-за обфускации исходного кода.

NuSphere NuCoder. Новая, активно развивающаяся коммерческая защита. На уровне собственных API предоставляет взаимодействие с защищаемыми скриптами, поддерживаются операционные системы Windows и Linux. Вследствие малой распространенности не устанавливается на обычных виртуальных хостингах, но вполне может быть установлена пользователями на выделенных серверах. Публичных декодеров нет.

SourceGuardian for PHP. Коммерческая защита, практически не встречается, на виртуальных хостингах не устанавливается. Позволяет устанавливать триальный срок работы скриптов с проверкой даты по внешним серверам точного времени, делать привязку защищаемых скриптов к серверам, ip-адресу, MAC-адресу сетевой карты, причем эти данные используются для расшифровки. Поддерживаются все операционные системы. Публичных декодеров нет.

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

Вывод QWORD в виде десятичного числа

05.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для преобразования и форматированного вывода 32-битных значений в ассемблере используется стандартная API-функция wsprintf, но она бесполезна при работе с большими числами, например QWORD (64 бита). Значит обойдемся совсем без использования API.
  1. ;---------------------------------------------------
  2. ; Преобразование QWORD в десятичное число
  3. ; Параметры вызова:
  4. ; dwHigh - Старшее двойное слово
  5. ; dwLow  - Младшее двойное слово
  6. ; lpBuff - указатель на буфер-приемник
  7. ;---------------------------------------------------
  8. proc    bignum dwHigh:DWORD, dwLow:DWORD, lpBuff:DWORD
  9.         pushad                   ; Сохранить все регистры
  10.         mov     eax,[dwLow]      ; Младшее двойное слово
  11.         mov     edx,[dwHigh]     ; Старшее двойное слово
  12.         mov     edi,[lpBuff]     ; Указатель на буфер-приемник
  13.  
  14.         xchg    esi,edx          ; Сохранить старший dword
  15.         mov     ebx,10           ; Основание системы счисления
  16.         xor     ecx,ecx          ; Счетчик десятичных цифр
  17. .bignum_1:
  18.         xchg    eax,esi          ; Расчитать десятичную цифру
  19.         xor     edx,edx
  20.         div     ebx
  21.         xchg    esi,eax
  22.         div     ebx
  23.         or      dl,'0'           ; Преобразовать результат в символ цифры
  24.         push    edx              ; Сохранить цифру в стеке
  25.         inc     ecx              ; Увеличить счетчик цифр
  26.         or      eax,eax          ; Все преобразовали?
  27.         jnz     .bignum_1
  28.  
  29. .bignum_2:
  30.         pop     eax              ; Записать все цифры из стека в буфер
  31.         stosb
  32.         loop    .bignum_2
  33.         xor     eax,eax          ; Признак окончания строки
  34.         stosb
  35.         popad                    ; Восстановить все регистры
  36.         ret                      ; Ворзврат из процедуры
  37. endp
Пример использования:

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

Готовим хреновину

03.10.2008 | Категория: А еще я туда ем! | Автор: ManHunter

Готовим хреновину

Сегодня я расскажу рецепт замечательной острой закуски. Тем более скоро зима, и организму обязательно нужны дополнительные витамины. В каждой семье эта закуска называется по-своему - "огонек", "горлодер" и даже "аджика". Я не буду оспаривать правильность названия, в моей семье это блюдо называется "хреновина".

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

Время непрерывной работы (Uptime) Windows

01.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для получения времени непрерывной работы системы обычно используется функция API GetTickCount. Она возвращает количество миллисекунд, прошедших с момента последнего старта системы. Проблема в том, что счетчик имеет тип dword, и по прошествии примерно 50 дней (49,7 если быть точным) достигает предельного значения и обнуляется. Конечно, продержать систему без перезагрузки почти два месяца трудно, но не значит что невозможно. Поэтому для получения гарантированно точного времени работы системы воспользуемся функцией NtQuerySystemInformation. Достаточно долго эта функция относилась к разряду недокументированных, теперь же на MSDN по ней имеется описание с примечанием, что ее использование в прикладных программах все равно нежелательно.
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. ; По умолчанию структура в FASM не определена, сделаем это самостоятельно
  5. ; Для получения необходимой информации нужны только два первых значения
  6. struct SYSTEM_TIME_INFORMATION
  7.        liKeBootTime       dq ?  ; Время старта системы
  8.        liKeSystemTime     dq ?  ; Текущее время
  9.        liExpTimeZoneBias  dq ?
  10.        uCurrentTimeZoneId dd ?
  11.        dwReserved         dw ?
  12. ends
  13.  
  14. SystemTime   SYSTEM_TIME_INFORMATION  ; Наша структура с данными
  15.  
  16. ; Константа нужного класса информации тоже не определена, сделаем это сами
  17. GET_SYSTEM_TIME_INFORMATION = 3 
  18.  
  19. ; Сегмент кода
  20. section '.code' code readable executable
  21. ...
  22.         invoke  NtQuerySystemInformation, GET_SYSTEM_TIME_INFORMATION,\
  23.                 SystemTime, sizeof.SYSTEM_TIME_INFORMATION, 0
  24.         ; Записать в регистры EDX:EAX текущее время в миллисекундах
  25.         mov     eax, dword [SystemTime.liKeSystemTime]
  26.         mov     edx, dword [SystemTime.liKeSystemTime+4]
  27.         ; Вычесть время старта системы
  28.         sub     eax, dword [SystemTime.liKeBootTime]
  29.         sbb     edx, dword [SystemTime.liKeBootTime+4]
  30.         ; Теперь в регистры EDX:EAX записано реальное количество миллисекунд,
  31.         ; прошедшее с момента старта системы
  32. ...
Преобразовать миллисекунды в обычный вид даты и времени можно при помощи пары стандартных функций FileTimeToLocalFileTime и FileTimeToSystemTime.

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

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