Пример взлома программ защищеных с помощью криптоалгоритма MD5

Внимание!!!

Эта статья написана ИСКЛЮЧИТЕЛЬНО в помощь программистам и по сути своей представляет экспертную оценку защиты.
Заметьте - бесплатную оценку :)

Пациент: 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/

C пионерским приветом, Сorbio.
uinC Member
[c]uinC