Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь


WinCHM кейген - задача о рюкзаке




Массу крэкерских инструментов, видеоуроков и статей вы сможете найти на видеокурсе от нашего сайта. Подробнее здесь.
Softany - WinCHM, задача «О рюкзаке»

Wyfinger, 2008


введение

Я не то чтобы опытный кракер, в моем послужном списке есть уже порядка 20 кейгенов, собственно я стараюсь делать только кейгены, мне интересно разбирать алгоритмы проверки ключей. Вот теперь время пришло написать свою первую статью, тем более что последняя исследованная мной программа как нельзя лучше подходит на роль препарируемого.

Программа WinCHM от фирмы Softany (http://www.softany.com/winchm/) представляет собой редактор для создания HTML справки. Надо сказать довольно удобная программа и может пригодиться если Вы помимо крекинга иногда занимаетесь и разработкой.


После установки программа работает 15 дней, из ограничений предложение зарегистрироваться при запуске и добавление строки «Created by WinCHM Prov3.xx unregistered version!» в заголовок создаваемого Вами файла справки, а также на каждую страницу. Вам предлагается ввести имя пользователя и ключ.

Ради интереса я заглянул на сайт производителя и выяснил – на момент написания этих строк минимальная стоимость программы (однопользовательская лицензия) стоила $89, а самая дорогая (Site License) - $800.


начальное изучение

Первым делом с помощью PEiD выясняем, что программа написана на Delphi и ничем не упакована. Я люблю такие программы, это говорит либо о том, что программу писал ну совсем полный дилетант, который просто не знает об упаковщиках/протекторах, тогда надо быть готовым встретить в программе какую-нибудь глупость, скажем сравнение ключа с константной строкой. Либо же наоборот, это может говорить о том, что автор позаботился о защите программы и то, что мы можем без помех изучать код нам нисколько не поможет (как это было в VypressChat, который вообще невозможно закейгенить, ну разве что выкрасть секретный RSA ключ у разработчиков).

Продолжим. Вторым делом выясняем где же программа сохраняет временной штамп, ловим все обращения к реестру с помощью RegMon, потом просматриваем подозрительные пути и опытным путем наталкиваемся на ключ:

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer - CloseTime

Удалим этот ключ, и программа опять отсчитывает 15 дней, т.е. бесконечный триал у нас уже есть.

инструмент - отладчик

Я в качестве отладчика использую OllyDbg, а в качестве подспоря – DeDe, программа-то написана на Delphi, а имена библиотечных функций нам могут здорово помочь.

Запускаем программу под отладчиком, вводим в диалог регистрации какие-нибудь имя и ключ, жмем Ok,- видим сообщение «Illegal registration code!», жмем в ольке на паузу, затем на «выполнять до возвращения», несколько раз, пока не перейдем в режим «Run» (отображается в поле внизу справа, т.е. программа работает). Теперь нажимаем на Ok на сообщении в программе и вываливаемся в ольке, мы остановились на выходе из процедуры вывода сообщения, несколько раз еще нажмем на Till Return, пока не окажемся в exe модуле программы.

Теперь просматриваем наверх вызовы и ищем их адреса в том листинге, что дала нам DeDe, если нашлось – записываем имя. Через некоторое время ситуация начинает проясняться.


Softany - WinCHM, задача «О рюкзаке»


Опытным путем доходим до места где проверяется какая-то строка и если она не пуста – выдается сообщение «Thank You», иначе – «Illegal registration code!». Смотрим внутрь функции выше и видим там интересные куски:


Softany - WinCHM, задача «О рюкзаке»


Softany - WinCHM, задача «О рюкзаке»


Сначала проверяется длинна ключа, если длинна равна 20 символам вычисляется какой-то 64 битный хеш и дальше сверяется с константами, в зависимости от того с какой константой совпал результат формируется строка о типе лицензии. Мы видим, что для максимальной Site License при длине ключа 20 символов хеш должен равняться 32ABCC97EB2. Вообще если длинна ключа не равна 20 символам там идет вычленение какого-то куска строки и снова вычисление хеша и проверка, но мы не будем смотреть дальше.

Итак заходим внутрь функции хеширования, попутно идентифицируем имена библиотечных функция по листингу DeDe.


Softany - WinCHM, задача «О рюкзаке»


Внутри цикла мы находим функцию, я назвал ее myPower, возвращающую степень тройки, как выясняется каждый символ ключа умножается на степень тройки начиная с 27 и результат суммируется, это и есть хеш.

Получается что-то вроде:

Softany - WinCHM, задача «О рюкзаке»

Наша задача по имеющемуся D восстановить последовательность иксов.

инструмент – мозг

Как же восстановить эту последовательность? Подкованные в математике крекеры, перелистав пару толстых учебников наверняка предложат пару способов, но т.к. я к сожалению, в математике не очень-то силен, и в отсутствии интернета думал собственной головой. Сразу скажу, что бился я над этой задачей порядка недели (ну тоесть временами задумывался) и особенно горжусь своим вариантом, который конечно десять раз неоптимален и сто раз был предложен до меня, но я дошел до него сам.

Но все-таки поведаю хронологию моих мыслей.

Первое, что пришло мне в голову – полный перебор, через пол минуты я прикинул сколько он может длиться и отказался от него.

Дальше я на бумажке провел несколько опытов с 3-4 числами от 1 до 10, восстановить их было не сложно, но я никак не мог сформулировать это в виде алгоритма.

Потом я попробовал делить число на сумму степеней тройки, как ни странно, но это довольно часто давало правильный результат. Например:


Softany - WinCHM, задача «О рюкзаке»

Softany - WinCHM, задача «О рюкзаке»

Softany - WinCHM, задача «О рюкзаке»

Softany - WinCHM, задача «О рюкзаке»

Softany - WinCHM, задача «О рюкзаке»

Softany - WinCHM, задача «О рюкзаке»

Softany - WinCHM, задача «О рюкзаке»

Softany - WinCHM, задача «О рюкзаке»


Результирующая последовательность

Softany - WinCHM, задача «О рюкзаке»

действительно в результате хеширования даст тот же результат, однако как выяснилось этот способ работает не всегда, а во-вторых у нас есть ограничения: последовательность может состоять только из символов цифр (30h-39h) и заглавных букв латинского алфавита (50h-70h), между этими промежутками есть еще печатные символы вроде «><=» и т.д. но я решил отказаться от них и формировать пароль только из букв и цифр.


В следующий присест я решил попробовать разобрать одно из реальных чисел, спрятанных в программе, допустим 299F90EA65B, которая означает однопользовательскую лицензию, это число должно получиться в результате хеширования 20 символьного ключа. В Excel я задал в первую очередь все возможные коды символов пароля (для упрощения здесь я взял промежуток символов 30h-46h). Потом нашел все возможные произведения соответствующих степеней тройки на множители 30h-46h, получилась таблица следующего вида.


Softany - WinCHM, задача «О рюкзаке»


А потом просто стал вычислять хеш, подбирая символы пароля. Я сверял разницу между тем, что получается у меня и требуемым хешем с нулем.


Softany - WinCHM, задача «О рюкзаке»


Я заметил интересный момент, допустим у нас уже есть какая-то последовательность символов ключа, естественно в результате хеширования она не даст требуемого значения (в примере 2860331738715), но нам нужно изменить некоторые символы пароля так, чтобы оба числа совпали. Так вот, сначала мы подбираем последний символ, т.к. он дает большее число в результирующей сумме, а если менять подбираемые символы так, чтобы каждый раз разница между подбираемым значением и текущим хешем проходила через ноль мы довольно быстро приходим к подходящей последовательности.

То-есть последовательность действий при подборе выглядит так:

  1. Заполняем последовательность какими-нибудь случайными данными;

  2. Вычисляем хеш от текущей последовательности, и разницу между им и подбираемым хешем: X = D – nD (X – разница, D – подбираемое значение, nD – хеш от текущей последовательности);

  3. Начинаем подбор с последнего символа, если X > 0 – уменьшим текущий значащий символ, если X < 0 – увеличим, если X = 0 – выходим, подходящая последовательность найдена. Если текущий значащий символ находится в крае доступного алфавита (т.е. дальше его некуда увеличивать/уменьшать), - перейти на предыдущий, более значимый символ.

  4. Повторяем операцию №3 до тех пор, пока X не сменит знак на противоположный.

  5. Переходим к следующему символу.


Вот собственно суть моего решения, дальше я записал алгоритм на MathCad, потом сделал кейген (пришлось еще добавить пару проверок, дабы алгоритм не заходил в замкнутые циклы (при некоторых обстоятельствах это случалось).

Прилагаю все мои наработки (во всех примерах я изменил «решаемые» числа, дабы соблюсти правило не выкладывать готовые кряки):



Скачать статью "WinCHM кейген - задача о рюкзаке" в авторском оформление + файлы.
пароль архива на картинке



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS