Быстрый поиск
Введите фрагмент названия статьи для поиска
Защита 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-адресу сетевой карты, причем эти данные используются для расшифровки. Поддерживаются все операционные системы. Публичных декодеров нет.
Читать статью целиком »
Просмотров: 41298 | Комментариев: 36
Вывод QWORD в виде десятичного числа
05.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для преобразования и форматированного вывода 32-битных значений в ассемблере используется стандартная API-функция wsprintf, но она бесполезна при работе с большими числами, например QWORD (64 бита). Значит обойдемся совсем без использования API.Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------
- ; Преобразование QWORD в десятичное число
- ; Параметры вызова:
- ; dwHigh - Старшее двойное слово
- ; dwLow - Младшее двойное слово
- ; lpBuff - указатель на буфер-приемник
- ;---------------------------------------------------
- proc bignum dwHigh:DWORD, dwLow:DWORD, lpBuff:DWORD
- pushad ; Сохранить все регистры
- mov eax,[dwLow] ; Младшее двойное слово
- mov edx,[dwHigh] ; Старшее двойное слово
- mov edi,[lpBuff] ; Указатель на буфер-приемник
- xchg esi,edx ; Сохранить старший dword
- mov ebx,10 ; Основание системы счисления
- xor ecx,ecx ; Счетчик десятичных цифр
- .bignum_1:
- xchg eax,esi ; Расчитать десятичную цифру
- xor edx,edx
- div ebx
- xchg esi,eax
- div ebx
- or dl,'0' ; Преобразовать результат в символ цифры
- push edx ; Сохранить цифру в стеке
- inc ecx ; Увеличить счетчик цифр
- or eax,eax ; Все преобразовали?
- jnz .bignum_1
- .bignum_2:
- pop eax ; Записать все цифры из стека в буфер
- stosb
- loop .bignum_2
- xor eax,eax ; Признак окончания строки
- stosb
- popad ; Восстановить все регистры
- ret ; Ворзврат из процедуры
- endp
Читать статью целиком »
Просмотров: 10048 | Комментариев: 4
Готовим хреновину
03.10.2008 | Категория: А еще я туда ем! | Автор: ManHunter
Готовим хреновину
Сегодня я расскажу рецепт замечательной острой закуски. Тем более скоро зима, и организму обязательно нужны дополнительные витамины. В каждой семье эта закуска называется по-своему - "огонек", "горлодер" и даже "аджика". Я не буду оспаривать правильность названия, в моей семье это блюдо называется "хреновина".
Читать статью целиком »
Просмотров: 59400 | Комментариев: 50
Время непрерывной работы (Uptime) Windows
01.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для получения времени непрерывной работы системы обычно используется функция API GetTickCount. Она возвращает количество миллисекунд, прошедших с момента последнего старта системы. Проблема в том, что счетчик имеет тип dword, и по прошествии примерно 50 дней (49,7 если быть точным) достигает предельного значения и обнуляется. Конечно, продержать систему без перезагрузки почти два месяца трудно, но не значит что невозможно. Поэтому для получения гарантированно точного времени работы системы воспользуемся функцией NtQuerySystemInformation. Достаточно долго эта функция относилась к разряду недокументированных, теперь же на MSDN по ней имеется описание с примечанием, что ее использование в прикладных программах все равно нежелательно.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ; По умолчанию структура в FASM не определена, сделаем это самостоятельно
- ; Для получения необходимой информации нужны только два первых значения
- struct SYSTEM_TIME_INFORMATION
- liKeBootTime dq ? ; Время старта системы
- liKeSystemTime dq ? ; Текущее время
- liExpTimeZoneBias dq ?
- uCurrentTimeZoneId dd ?
- dwReserved dw ?
- ends
- SystemTime SYSTEM_TIME_INFORMATION ; Наша структура с данными
- ; Константа нужного класса информации тоже не определена, сделаем это сами
- GET_SYSTEM_TIME_INFORMATION = 3
- ; Сегмент кода
- section '.code' code readable executable
- ...
- invoke NtQuerySystemInformation, GET_SYSTEM_TIME_INFORMATION,\
- SystemTime, sizeof.SYSTEM_TIME_INFORMATION, 0
- ; Записать в регистры EDX:EAX текущее время в миллисекундах
- mov eax, dword [SystemTime.liKeSystemTime]
- mov edx, dword [SystemTime.liKeSystemTime+4]
- ; Вычесть время старта системы
- sub eax, dword [SystemTime.liKeBootTime]
- sbb edx, dword [SystemTime.liKeBootTime+4]
- ; Теперь в регистры EDX:EAX записано реальное количество миллисекунд,
- ; прошедшее с момента старта системы
- ...
Читать статью целиком »
Просмотров: 6225 | Комментариев: 1
Поиск строки в памяти с использованием маски
29.09.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для поиска произвольной строки в блоке памяти с использованием бинарной маски я написал следующую процедуру:Code (Assembler) : Убрать нумерацию
- ; ---------------------------------------------
- ; Процедура поиска строки в блоке памяти
- ; (C) ManHunter / PCL
- ; ---------------------------------------------
- ; SRCdata - блок памяти в котором выполняется поиск
- ; SRCsize - размер блока в котором выполняется поиск
- ; PTRdata - строка для поиска
- ; PTRsize - длина строки для поиска
- ; MSKdata - бинарная маска для поиска или 0 если не используется
- ;
- ; Возврат: EAX = offset найденной строки
- ; EAX = -1 если ничего не найдено
- ; ---------------------------------------------
- proc scanmem SRCdata:dword, SRCsize:dword, PTRdata:dword,\
- PTRsize:dword, MSKdata:dword
- push esi edi ebx ecx edx
- ; Длина паттерна больше длины данных?
- mov eax,[PTRsize]
- cmp eax,[SRCsize]
- ; Да, возврат -1
- ja .scanmem_not_found
- mov esi,[SRCdata]
- mov edi,[PTRdata]
- mov edx,[MSKdata]
- mov ebx,esi
- add ebx,[SRCsize]
- sub ebx,[PTRsize]
- .scanmem_loop:
- xor ecx,ecx
- .scanmem_test_char:
- or edx,edx
- jz .scanmem_no_mask
- cmp byte [edx+ecx],0
- jz .scanmem_char_equal
- .scanmem_no_mask:
- mov al,[esi+ecx]
- cmp al,[edi+ecx]
- jne .scanmem_next_pattern
- .scanmem_char_equal:
- inc ecx
- cmp ecx,[PTRsize]
- jb .scanmem_test_char
- jmp .scanmem_found
- .scanmem_next_pattern:
- inc esi
- cmp esi,ebx
- jbe .scanmem_loop
- .scanmem_not_found:
- ; Строка не найдена
- mov eax,-1
- jmp .scanmem_ret
- .scanmem_found:
- ; Строка найдена
- mov eax,esi
- .scanmem_ret:
- pop edx ecx ebx edi esi
- ret
- endp
Читать статью целиком »
Просмотров: 7182 | Комментариев: 5