Внимание!!!
Эта статья написана ИСКЛЮЧИТЕЛЬНО в помощь программистам и по сути своей представляет экспертную оценку защиты.
Заметьте - бесплатную оценку :)
Пациент
{KiXscripts Editor v1.х}, (2.2мб)
Инструменты
* Numega SmartCheck любой версии
* DAMN Hash Calculator v1.5.0
* Hiew или любой дизассемблер
Запускаем программу вместе со SmartCheck. Пишем чего-нибудь в диалоге
регистрации. Я вводил "Corbio" и "1234567". Естественно получаем
сообщение, что наш серийник неверен.
-Click
| OnError
| Len returns LONG:7 // Это размер моего серийника
| MsgBox returns Integer:1 // "Registration is invalid!"
Интересно, а зачем нужен размер серийника? Смотрим в правом окошке
SmartCheck offset для строки - Len returns LONG. У меня 11С608, для
других версий этой программы будет другой offset. Смотрим в Hiew по
адресу 11С607.
call _куда-то
xor ecx,ecx
cmp eax,20h
....Ну и так далее.
Логично предположить, что раз длина серийника сравнивается с 32, то он
должен быть именно 32 символа. Проверяем это и видим что я, как всегда,
был прав :). Посмотрим на получившийся листинг. Теперь, когда размер
правилен, мы вышли на саму проверку валидности. Интересный кусок:
Rtrim$ "sHa50WFaXaND6LaMdr1n65Te3l"
String$
CryptCreateHash returns BOOL:1
Len retorns LONG:32 "CorbiosHa50WFaXaND6LaMdr1n65Te3l"
CryptHashData returns BOOL:1
Space$
CryptGetHashParam returns BOOL:1
Строка "sHa50WFaXaND6LaMdr1n65Te3l" статична, ее можно найти в
екзешнике. Похоже на то, что эта строка добавляется к имени юзера и от
результата считается какой-то хеш. Так как строка начинается с "sHa",
то я и подумал, что это алгоритм SHA.
Но посмотрим на листинг дальше. 128 битный хеш "плавно превращается" в строку. Вот она:
RTrim$ "8165591BD4EFB8B67C94925210D388AE"
CryptDestroyHash BOOL:1
Strings$
Strings$
Strings$
MsgBox returns Integer:1 // "Registration is invalid!"
Вот. А так как вводить надо было 32х символьный серийник и полученная
строка тоже 32 символа, то скорее всего, это и есть правильный
серийник. Проверяем. Так и есть.
Почти все понятно. Остался единственный вопрос - а какой все таки это
алгоритм? Тут нам поможет тулзень от Ivanopulo - DAMN Hash Calculator.
Вводим "CorbiosHa50WFaXaND6LaMdr1n65Te3l". Оказывается, это никакой не SHA а MD5.
P.S. - Конечно далеко не все программы защищенные MD5 так бесполезно
его используют. Но подавляющее большинство. Стойкость криптоалгоритмов
обесценивается неумением их применять.
Линки
Весь софт для RE - {http://www.protools.cjb.net}
Applied Cryptography - {http://www.cacr.math.uwaterloo.ca/hac/}