Нокаут WHATHTML: Взлом нестандартной защиты на серийном ключеАбсолютное большинство защит на серийных ключах построено по одному и тому же принципу. Их даже ломать становится неинтересно. Но вот crackme WhatHTML, написанный программистом c ником Chiwaka, представляет собой пример хорошей защиты на серийном ключе. Именно ее мы сегодня и разберем.
Для регистрации программ, защищенных с помощью серийных ключей, пользователю предлагается ввести уникальное имя и серийный номер (они, как правило, поставляются в закрытом конверте вместе с лицензионной копией программы). Программа как-то проверяет их и выдает свой вердикт: данная копия либо зарегистрирована, либо нет. В абсолютном большинстве случаев алгоритм проверки следующий: на основе введенного имени пользователя генерируется последовательность символов, которая сверяется с введенным серийным номером. Если они совпадают, то пользователь признается легальным правообладателем, если же они различны, то этому же пользователю в вежливой форме предлагается погулять. Взлом таких защит сводится к простому «выдиранию» алгоритма генерирования серийного номера на основе имени пользователя. Причем мне встречались такие crackme'сы, в которых для написания keygen'а не требовалось даже разбираться в этом самом алгоритме: все решалось тупым копированием процедур, ответственных за генерацию валидного серийного номера. Понятно, что это достаточно скучное дело, даже не требующее серьезного напряжения извилин. Что мы будем ломатьCrackme WhatHTML — это тоже пример защиты на регистрационном ключе. Но построенный по совершенно иному принципу. Написан он программистом, известным под ником Chiwaka. Скачать сам crackme можно бесплатно по ссылке cracklab.ru/crackme/whathtml.zip. Именно это я и предлагаю тебе сделать, закрыв эту статью. Ведь ломать самому всегда намного интереснее, чем читать инструкции по взлому. Главное окно программы представлено на одноименном рисунке. Значение в поле «Machinecode» у тебя будет другим. Откуда оно берется, узнаем позже. Как нетрудно догадаться, нужно найти валидные комбинации значений полей «Name» и «Serial», а также по возможности написать keygen. Ну что ж, со знакомством, думаю, закончили. Теперь переходим к самому интересному. Первый взглядИтак, приступим. Начинается программа с получения адреса функции ShowHTMLDialog из библиотеки mshtml.dll (делается это с помощью стандартных функций LoadLibraryA и GetProcAddress). После этого вызывается несколько процедур, которые и выполняют основную работу. Ниже приводится дизассемблерный листинг этой части программы, полученный с помощью IDA Pro,а также мои комментарии к нему:
Из листинга видно, что программа последовательно вызывает три процедуры (sub_4010B2, sub_401298, sub_401169); в том случае, если пользователь нажал на кнопку «Register», то еще раз вызывается процедура sub_401060. Что ж, пока вроде ничего сложного. Теперь познакомимся с нашими процедурами поближе. Таинственное поле MachinecodeПервой на очереди стоит процедура sub_4010B2. В этой процедуре вызывается функция GetSystemInfo, и на основе возвращенных ей данных по определенному алгоритму формируется значение, которое и идет в поле «Machinecode». Не ассемблером единымПроцедура sub_401298 ответственна за формирование и отображение окна на экране. В ней происходит вызов найденной ранее функции ShowHTMLDialog. В качестве параметра она принимает строку с html-кодом окна. В целях экономии места демонстрировать весь html-код окна я не буду, приведу лишь код обработчика нажатия на кнопку «Register», написанный на JavaScript.
Вот он:
Если ты знаком с языком JavaScript, то легко увидишь, что здесь происходит суммирование кодов символов, составляющих имя, серийный номер и код машины (поле «Machinecode»). Причем очередной символ серийного номера добавляется только в том случае, если он отличается от предыдущего символа серийного номера. Полученные значения оформляются в строку, символомразделителем служит знак «?». Эта строка возвращается приложению, создавшему окно. ЗащитаСледом за вызовом процедуры sub_401298, создающей окно, идет вызов процедуры sub_401169, которая представляет для нас особый интерес, поскольку именно в ней сосредоточен защитный механизм. Данная процедура осуществляет разбор полученной на прошлом этапе строки и формирует три числа на основе имени пользователя, серийного номера и информации о машине. Числа формируются по следующему принципу: если у нас в качестве строкового выражения было передано «725», то после преобразований будет получено значение 725h. Полученные таким нехитрым образом числа складываются друг с другом, образуя ключ, которым расшифровывается внутренний буфер. Дизассемблерный код расшифровщика приводится ниже:
Подытожив все вышесказанное, можно описать работу программы так:
Теперь, когда мы разобрались с устройством защиты, давай перейдем к ее взлому. ВзломВот тут-то начинается самый настоящий простор для фантазии: дело в том, что взломать программу можно не одним и даже не двумя способами. Самое простое, что приходит на ум, это исправить условные переходы в проверке правильности расшифровки так, чтобы они никогда не срабатывали. Или вообще забить эту проверку nop'ами. Но при таком подходе мы не увидим поздравительного сообщения (да-да, в расшифровываемом буфере находится именно оно). Давай думать, что нам известно об используемом шифре.
Во-первых, алгоритм шифрования — xor, а значит, имея пару «зашифрованная строка и расшифрованная строка», а затем выполнив операцию xor между ними, мы найдем ключ расшифровки. Во-вторых, ключ расшифровки находился в регистре cx, а значит, длина ключа — два байта. Помимо всего прочего, у нас есть три пары значений «зашифрованный символ и расшифрованный символ» (эталон, по которому программа определяет правильность расшифровки). Все это позволяет нам без труда определить требуемый ключ расшифровки: 04E6h. Зная требуемый ключ, мы можем перед циклом расшифровки воткнуть либо команду «mov cx, 04E6h», либо написанный полноценный keygen. А что, в написании keygenа для этой программы нет ничего сверхсложного. Работать keygen будет приблизительно по следующей схеме:
Вот и весь keygen. ЗаключениеМы рассмотрели пример неплохой защиты, основанной на серийном номере. Как видишь, даже здесь, во вроде бы давно избитой методике защиты приложений, есть место воображению. Так что, если ты программист и хакер, то проявляй фантазию даже в тривиальных, казалось бы, вещах, и всем станет жить намного интереснее. |