Как написать кряк для программы

Как пользоваться keygen, crack, patch

Ни для кого не секрет, что в нашей стране 90% установленных программ на компьютерах не являются лицензионными. Программы уже взломаны, но чтобы их установить требуются некоторые навыки. В статье рассмотрены самые распространенные способы установки пиратских программ. Как пользоваться keygen? Как пользоваться crack? Что такое request code? Как пользоваться patch?

1. Инструкция по установке в текстовом файле

Первое, на что надо обратить внимание, есть ли в этой папке файл «readme.txt» или «прочти меня.txt» (могут быть и другие названия). Очень часто в нем написана инструкция по правильной установке программы. Если файл с инструкцией есть, то, смело, открываем его и следуем инструкции. Если файла нет, то ситуация немного усложняется.

2. Серийный номер в текстовом файле

Для подтверждения прав на программу иногда требуется серийный номер. Имея его, вы сможете установить программу бесплатно.

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

Пример серийного номера: ADE-R119-F196-k9BA-17CD

В папке с программой (в той же папке что и установочный файл) может находиться файл с серийным номером. Чаще всего он называется «Серийный номер», «Serial number», «Ключ», «key», «crack». Открываем этот файл, копируем серийный номер и вставляем его в нужное место.

  1. Начать установку программы, пока не потребует серийный номер
  2. Открыть текстовый файл, скопировать серийный номер (Cntr+C)
  3. Вставить его в то место, где требуется (Cntr+V)
  4. Все

3. Как пользоваться keygen

В папке с программой может находиться файл-программа (keygen, crack, . ).

Вот пример такой программы, если ее запустить (рис.2):

Нажимаем на кнопку «Generate» (рис.3)

Копируем серийный номер, вставляем в нужное место и все готово. Продолжаем установку, либо нажимаем «Ок» (возможно «Готово», «далее» . ), если установка уже завершена.

  1. Начать установку программы, пока не потребует серийный номер
  2. Открыть файл Keygen
  3. Сгенерировать серийный номер и скопировать (Cntr+С)
  4. Вставить его в то место, где требуется (Cntr+V)
  5. Все

4.Получение доступа при помощи «Request code»

Еще один вариант. Во время установки программы или после запуска установленной программы, на экране появляется окно с регистрацией. В папке с установочным файлом должен быть keygen.exe, crack.exe или что-то еще.
Пример окна регистрации (рис.4):

Иногда нужно выбрать режим регистрации, например, выбрать «ввести серийный номер». На экране появляется окно для ввода серийного номера. (рис.5)

В данном случае:
— Get an activation code – получить код активации
— Enter an activation code – ввести код активации (нужный нам вариант)

Открываем из папки с установкой программы файл keygen.exe (crack.exe, . ) (рис.6).

Теперь нам нужно скопировать «Request code» из окна на рис.4 (рис.5) и вставить в окно на рис.6. Выделяем Request code и нажимаем Cntr+C (горячая клавиша копировать).
Вставляем в последнее окно скопированный код (Cntr+V).

Обратите внимание.
Код скопировался не полностью, а только первая строчка. Вторую строчку кода нужно скопировать отдельно, в окне на рис.6 нужно поставить пробел, скопировать и вставить оставшуюся часть «Request code». Должно получиться так (рис.7):

После этого в программе на рис.7 нажимаем кнопку «Calculate» (иногда называется Generate). Должно получиться так (рис.8):

Копируем «Auth code» из программы рис.7 в окно на рис.5 и получаем так (рис.9):

Нажимаем Next или Ok. Нам должны сообщить, что регистрация прошла успешно. Теперь программой можно пользоваться бесплатно.

Такая ситуация встречается довольно часто. Главное не забывайте, что Request code состоит из двух строчек.

  1. Установить программу
  2. Запустить программу
  3. Выбрать режим ввода серийного номера (Enter …)
  4. Открыть keygen
  5. Скопировать «Request code» из программы в «keygen» (обе строчки)
  6. В «keygen» нажать кнопку сгенерировать
  7. Скопировать код, полученный в «keygen»
  8. Вставить его в требуемое место в программе (Cntr+V)
  9. Нажать готово
  10. Все

5. Как пользоваться patch

Иногда для бесплатной установки программы нельзя просто сгенерировать серийный номер. В таких случаях используют специальные программы, которые изменяют файлы так, чтобы программа не требовала денег. В папке с установщиком программы должен находиться файл «Patch» (он может называться — patch, keygen, crack, . ). Это и есть программа, которую еще называют патч.

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

Дальше, надо переписать patch (или другой файл-патч) в папку, в которую мы установили программу. Скорее всего это диск С, папка Program files, папка с название программы (C:/Program files/«название программы»).

Дальше открываем файл patch (или другой файл-патч)

Вот пример файла patch.exe (рис.10):

Чаще всего в этом файле только одна кнопка. В данном случае это кнопка Apply patch. В некоторых случаях она может называться Crack. Нажимаем на эту кнопку и программой можно пользоваться бесплатно.

  1. Установить программу
  2. Скопировать Patch.exe в папку, куда установили программу
  3. Открыть Patch.exe
  4. Нажать единственную кнопку в программе «Patch»
  5. Запустить программу
  6. Все

6. Файлы, для установки программы бесплатно, отсутствуют

Может быть и такое, что программу вы скачали без пиратского «лекарства». То есть, без готовых серийных номеров, кейгенов или патчей. Тогда задача усложняется. Лучше конечно скачивать программы с готовыми «лекарствами». Но что если все-таки такая проблема встала?

Набор для взлома программ. Выбираем инструменты для реверса.

У каждого реверс-инженера, вирусного аналитика и просто исследователя со временем появляется устоявшийся набор утилит, которыми он постоянно пользуется для анализа, распаковки или кряка. В этом обзоре я поделюсь своей версией. Это будет полезно всем, кто еще не обзавелся своим набором и только приступает к изучению этой темы. Впрочем, и опытному реверсеру должно быть любопытно, что используют коллеги по цеху.

Detect it Easy (DiE)

Это отличная программа для определения упаковщиков, которая имеет весьма широкий набор полезных функций. Например, она позволяет просматривать энтропию секций файлов, что помогает визуально определять наличие шифрования.

ExeInfoPE

Это еще один детектор пакеров и протекторов. У него довольно своеобразный интерфейс, который придется по вкусу не всем. Зато программа часто обновляется, в ней полно интересных функций и есть дружелюбные подсказки по распаковке.

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

Ну и конечно, здесь присутствует весь стандартный набор возможностей: просмотрщик заголовков файлов, просмотр секций, hex-просмотрщик и даже некоторое количество маленьких встроенных утилит, типа TerminateProcess и прочего. Плюс есть поддержка плагинов.

Зачастую возникает необходимость обратиться к жесткому диску, памяти или приложению в бинарном режиме. Здесь на помощь приходят шестнадцатеричные редакторы, ярким представителем которых и является программа HxD. Она бесплатна, постоянно обновляется, поддерживает популярные форматы, хорошо ищет и обладает приятным интерфейсом. Есть и другие удачные фичи — например, возможность надежного удаления файлов (то есть затирания нулями). А еще у HxD есть портативная версия, чтобы было удобно держать на флешке.

Hex-редактор с давней историей, но до сих пор поддерживаемый разработчиками. У него есть платная и бесплатная версия (20 долларов без возможности обновлений, 200 долларов с пожизненными апдейтами). Интерфейс в стиле Norton Commander может немного испугать молодежь, но с ним быстро свыкаешься. Отдельно радует возможность работать только с клавиатуры, вызывая все функции по горячим клавишам.

Pestudio

Это полезная программа, заточенная под анализ малвари. Она автоматически сканирует загруженный образец файла на VirusTotal, интересно отображает используемые в подопытном приложении функции таблицы импорта, показывает вирусные признаки приложения, используемые библиотеки и информацию заголовка PE-файла. Здесь же можно работать с ресурсами. Другими словами, это многофункциональный антивирусный комбайн начального анализа семплов.

PE-bear

Еще один интересный просмотрщик и редактор файлов формата PE и PE+. Содержит анализатор пакеров и протекторов, отображает информацию о файловых заголовках, ресурсах и секциях. При желании можно посмотреть hex-представление данных секций и дизассемблировать их в обычные мнемоники ассемблера.

У PE-bear приятный интерфейс и приятная утилита для сравнения файлов. Единственный недостаток — программа редко обновляется, хотя и имеет открытый исходный код. Так что, если найдешь в ней баг, всегда можешь поправить сам.

Fakenet-NG

Эта программа необходима для того, чтобы эмулировать работу с сетью. При изучении семплов малвари часто нужно просматривать все сетевые обращения: следить за запросами к DNS и HTTP, снифать трафик и определять IP-адреса управляющих серверов (если это, например, бот-вымогатель). Виртуальная машина по понятным причинам должна быть отключена от сети, и, если вирус это заметит, он не будет делать все то, что обычно делает.

Fakenet-NG постоянно обновляется и поддерживается, так что эту утилиту можно использовать на самых современных ОС.

ProcessExplorer

Обойтись без программ Sysinternals, которые мониторят обращения к файловой системе и процессам, было бы непросто. ProcessExplorer покажет все процессы в системе в форме иерархического дерева, чтобы легко можно было видеть, в каком порядке они порождаются. Кроме этого, можно узнать, какие динамические библиотеки подгружены в процессы, приоритеты, цифровые подписи, использование процессора и многое другое.

RegShot

Удобная программа для мониторинга изменений в реестре. RegShot делает снимки до и после работы интересующего тебя приложения, а потом показывает, где были изменения.

TCPView

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

Resource Hacker

Популярная программа для редактирования ресурсов. Позволяет редактировать манифест, иконки, текстовые диалоговые строки, информацию о курсоре и многое другое. Редактировать ресурсы приложения приходится не так часто, но, если все же возникнет такая нужда, приятно иметь под рукой подходящий инструмент.

По итогу

Мы рассмотрели основной набор утилит, которые используются для решения большинства задач, связанных с реверсом. Я думаю, что на первых порах для начинающего реверсера этих приложений будет достаточно. А вместе с опытом будет расти и твой собственный список. Многие реверсеры постепенно приходят к тому, что создают нужные узкоспециализированные программы, плагины и скрипты сами. Далеко не для всех задач есть готовые средства, облегчающие жизнь.

Программа для взлома программ

Программа для взлома программ

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

Описание и возможности

Начнем с короткого вступления. Как известно, любые приложения, работающие в среде операционных систем от Microsoft, состоят из так называемых исполняемых библиотек (DLL). Так вот, при помощи программы, о которой сегодня идет речь, вы сможете открыть любой такой файл и не просто открыть, а изменить его и в таком виде сохранить.

Программный интерфейс приложения для взлома ПО

Данная тема заслуживает более длинного пояснения. Если вы хотите тщательно разобраться с приложением, просто перейдите в самый конец этой инструкции и просмотрите видео, в котором автор все показывает на собственном компьютере.

Как пользоваться

Теперь переходим к самому интересному. Дальше вас ждет практика.

Загрузка и установка

Сначала давайте разберемся, как бесплатно скачать приложение для взлома других приложений:

  1. Перейдите в конец этой статьи и нажмите там кнопку, при помощи которой загрузите на свой компьютер архив с приложением. Распаковываем установочный файл и запускаем его.

Запуск установки программы для взлома приложений

  1. Второй шаг предусматривает изменение пути установки. Если каталог по умолчанию вас не устраивает, просто перейдите дальше, нажав на обозначенную кнопку.

Путь установки программы для взлома программ

  1. На следующем этапе нам предложат настроить ярлык в меню «Пуск». Оставляем все как есть и переходим к следующему шагу, кликнув по «Next».

Настройка ярлыков программы для взлома программ

  1. Теперь запускаем установку. Для этого жмем по обозначенной кнопке.

Запуск инсталляции ПО для взлома программ

  1. Уже через несколько секунд инсталляция завершится, и мы сможем закрыть установщик, нажав на отмеченной элемент.

Завершение установки программы для взлома программ

Что ж, как видите, все очень просто.

Инструкция по работе

Можно переходить непосредственно к работе с программой и рассматривать, как с ее помощью взломать другие приложения. Тут все очень просто. Сначала при помощи иконки в виде папки мы находим любой Dll и открываем его. В результате в левой части приложения вы увидите список каталогов, которые находятся внутри данного файла. В правой половине, наоборот, будет появляться содержимое этих каталогов. Соответственно, это содержимое можно менять.

Работа с программой для взлома программ

Когда все нужные изменения будут внесены, вы просто сохраняете Dll, нажав на кнопку с изображением дискеты.

Достоинства и недостатки

Давайте рассмотрим положительные и отрицательные особенности использования данного инструмента.

  • Программа не нуждается в мощном компьютере.
  • Приложение очень просто и подойдет даже новичкам.
  • Масса положительных отзывов от довольных пользователей.
  • К сожалению, тут нет русского языка.

Похожие приложения

Давайте рассмотрим еще несколько программ, способных взламывать другие приложения:

  • PE Explorer.
  • Free Resource Extractor.
  • ResEdit.
  • Anolis Resourcer.
  • Resource Hacker FX.
  • XN Resource Editor.

Системные требования

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

  • Центральный процессор: от 1 ГГц.
  • Оперативная память: от 2 Гб ОЗУ.
  • Пространство на жестком диске: от 5 Мб.
  • Платформа: Microsoft Windows 32 или 64 бит.

Скачать

Скачать программу можно по кнопке, которая находится сразу под таблицей.

КРазработчик: Angus Johnson
Информация обновлена и актуальна: 2022 год
Название: Resource Hacker
Платформа: Windows XP, 7, 8, 10
Язык: Английский
Лицензия: Бесплатно
Пароль к архиву: bestsoft.club

Видеообзор

Данное видео поможет разобраться с приложением.

Вопросы и ответы

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

Исследование PPPWorld 6.3.0.2: пишем KeyGen.

Дата публикации 25 июн 2022

| Редактировалось 28 июн 2022

Данный материал публикуется исключительно в ознакомительных целях. Автор не несёт никакой ответственности за его применение в корыстных целях.

ЦЕЛЬ : PPPWorld 6.3.0.2
Инструменты : OllyDbg + PEExplorer + MASM32

Я думаю, многие из вас знают о довольно популярном способе проведения досуга, таком как решение японских кроссвордов. Зачастую, печатные версии этих головоломок можно видеть на полках газетных киосков, магазинов. Помимо печатных изданий сегодня существует огромное множество различных программ, предназначенных как для создания, так и для решения их электронных версий. Одной из таких программ является Pic-a-Pix Puzzle World (PPPWorld) версии 6.3.0.2. Эта версия программы была выпущена в далеком 2007 году, а первая ее версия появилась ещё в 2002 г.
Как заявляет автор, в программе поддерживается несколько популярных форматов файлов японских кроссвордов. Удобный менеджер позволяет выбирать желаемый кроссворд по размеру, количеству цветов, а так же отсортировать уже решенные вами кроссворды. Присутствуют возможности распечатывания изображения кроссворда на принтере и сохранения в трёх различных графических форматах на диске.
Помимо этого PPPWorld v6.3.0.2 позволяет:

— решать японские кроссворды (черно-белые и цветные).

— импортировать и экспортировать изображения кроссвордов.

— редактировать японские кроссворды.

— устанавливать стили изображений кроссвордов.

— вставлять японский кроссворд в другие документы.

Однако, у этой программы есть один большой недостаток — она условно-бесплатная (Shareware). Стоимость программы — 129 рублей, а срок пробного использования — 10 дней.
В настоящее время сайт разработчика уже недоступен. Поэтому, если вдруг кто-то, как я, захочет её использовать, то на это будет всего 10 дней. По истечении 10 дней программа сообщит, что ознакомительный период закончился и использование программы станет невозможным. А ввиду отсутствия возможности приобретения — её можно будет удалять или искать какие-либо способы обхода этого ограничения.
В связи с этим, ниже я опишу последовательность действий, которые позволят найти верный регистрационный код для введенных нами данных и снять все внутриигровые ограничения, тем самым еще раз подчеркнув небезопасность такого способа защиты программ. Сведения, полученные в процессе исследования, лягут в основу генератора таких кодов для любых других вводимых данных.
Эта статья рассчитана на читателя, в первую очередь, знакомого с языком ассемблера, PE-формата исполняемых файлов, немного знающего математику и имеющего небольшое представление о разработке программного обеспечения.

P.S. Полный текст статьи c картинками в аттаче.
P.S.S.: Собранный кейген (exe) выкладываю ЗДЕСЬ. (pwd: cracklab.team)
P.S.S.S.: Кейген залит на временное хранение. Если у кого-то есть возможность залить его на постоянку, прошу посодействовать в этом вопросе.

Вложения:


HESH

HESH
Active Member

Регистрация:
20 мар 2008
Публикаций:
2

Комментарии


    WASM

    Инструментарий

    SoftIce v4.xx

    IDA v4.xx

    мозги

    ИССЛЕДОВАНИЕ

    Итак, рассмотрим этот простой кpякмис, сделанный специально для

    начинающих. Запустим его и посмотрим: программа просит ввести

    Имя/Name и Код/Registration. Введем что-либо, например Hacker и

    99999999 и нажмем ОК. Wrong number — говорит нам она. То есть

    «неправильно набран номер» Жмем снова ОК, и мы снова в стартовой

    позиции.

    Ладно, запустим SoftIce (Ctrl-D) и поставим бpяк:

    bpx getdlgitemtexta

    Почему этот? Ну, просто потому, что getwindowtexta не срабатывает ;)

    Жмем ‘Ok’ снова и выпадаем в отладчик, F12 для выхода в вызывающую

    процедуру:

    …….

    …….

    0040107B push 32h ; max длина имени 49 символов:

    0040107D push edx ; 31h 1

    0040107E push 3E8h

    00401083 push ebx

    Вот как pаз наша пpоцедypа:

    >00401084 call ds:GetDlgItemTextA ; Считываем имя

    А попадаем мы вот сюда:

    >0040108A test eax, eax ; Проверяем, введено ли хоть что-то.

    0040108C jnz short loc_4010AA ; Введено

    0040108E push eax

    Если бы мы не ввели имя, то перешли бы на нижеследующий код, где y

    нас спросили бы, а есть ли y нас, вообще, имя-то? ;))

    0040108F push offset aNoName ; «No name!»

    00401094 push offset aDonTYouHaveANa ; «Don’t you have a name?!»

    00401099 push ebx

    0040109A call ds:MessageBoxA

    Поскольку имя введено, мы переходим на следующий участок кода:

    004010AA loc_4010AA: ; CODE XREF: sub_401000 8Cj

    Вот сюда:

    >004010AA xor esi, esi ; esi=0

    004010AC push edi

    004010AD xor edx, edx ; edi=0

    Здесь производится суммирование hex — значений символов имени и

    вычисляется его длина:

    004010AF Name: ; CODE XREF: sub_401000 C6j

    004010AF movsx eax, byte ptr [ebp edx-40h] ; символ имени

    004010B4 add esi, eax ;суммируем символы имени

    004010B6 lea edi, [ebp var_40] ; edi=offset ‘cr0AKer’

    004010B9 or ecx, 0FFFFFFFFh

    004010BC xor eax, eax

    004010BE inc edx ; N символов

    004010BF repne scasb ; ищем конец строки ‘cr0AKer’

    004010C1 not ecx

    004010C3 dec ecx ; N символов

    004010C4 cmp edx, ecx ;Все ли символы?

    004010C6 jbe short Name ; Не все

    004010C8 mov [ebp arg_0], esi ; Сохраним сумму

    В нашем случае сумма равна esi=268h

    Далее производится операция сдвига над посчитанной суммой:

    004010CB shl [ebp arg_0], 7 ;

    В нашем случае получим shl 268h, 7h = 13400h

    Теперь производится считывание введенного нами кода:

    004010CF lea ecx, [ebp var_C] ; подготовка к

    004010D2 push 0Ah ; считыванию

    004010D4 push ecx ; введенного

    004010D5 push 3E9h ; кода (max= 0Ah — 1 символов)

    004010DA push ebx

    004010DB call ds:GetDlgItemTextA ; считываем

    004010E1 test eax, eax ; Есть код?

    004010E3 pop edi

    004010E4 jnz short loc_401102 ; Есть

    Если бы программа не обнаружила бы введенный код, то она бы перешла

    на следующий участок кода и сказала бы все, что она дyмает. ;)

    004010E6 push eax

    004010E7 push offset aNoSerial ; «No serial!»

    004010EC push offset aNoSerialNumber ; «No serial number entered!»

    004010F1 push ebx

    004010F2 call ds:MessageBoxA

    Но поскольку мы, не будь дураки, ввели код, то нас препроводят в

    другое место, а именно сюда:

    00401102 loc_401102: ; CODE XREF: sub_401000 E4j

    Что же мы здесь видим? А видим мы следующее: наш введенный код

    преобразовывается при помощи стандартной С’шной функции _atoi

    (ASCII—>int) в целое число, которое возвращается в eax:

    00401102 lea edx, [ebp var_C] ; edx=offset ‘99999999’

    00401105 push edx

    00401106 call _atoi ; ‘Code’ ASCII —> int

    В eax сейчас преобразованный код, который в нашем случае равен

    05F5E0FFh.

    А далее мы подходим к финальной части — сравнению. Hо сначала еще

    надо подготовить одно из сравниваемых значений:

    Берется значение, полученное после операции сдвига над суммой

    hex-значений символов нашего имени и складывается с самой суммой,

    которое y нас до сих пор хранится в esi. Во как.

    0040110B mov ecx, [ebp arg_0] ; преобразованное ‘cr0AKer’

    0040110E add esp, 4

    00401111 add ecx, esi ; складываем

    В нашем случае оно будет равно ecx = 13668h

    Вот и все! Теперь сравниваем и видим, что, естественно, значения не

    совпадают ;)

    00401113 cmp ecx, eax ; Сравнение

    00401115 push 0

    00401117 jnz short loc_401134 ; Если равно, то Ок!

    00401119 push offset aGood ; «Good!»

    0040111E push offset aCongratulation ; «Congratulations!!»

    00401123 push ebx

    00401124 call ds:MessageBoxA

    В нашем слyчае 13668h, конечно, не равно 05F5E0FFh.

    ПИШЕМ КЕЙГЕН

    Итак, приступим к решению. Что мы знаем?

    Что из символов введенного имени высчитывается определенное число,

    которое равно результату сдвига влево hex-сyммы каждого hex-значения

    символа нашего имени. Что это определенное число должно быть равно

    значению, полученному путем преобразования введенного кода из

    ASCII-стpоки в целое.

    Вот и все! Все, что нам нужно — это взять наше имя, произвести над

    ним операцию, описанную в пункте 1) и преобразовать его из

    _целого_в_ASCII_. Таким образом мы и получим код, соответствующий

    нашему имени. В общем, на нормальном языке это называется

    pевеpснyть (от слова reverse) алгоритм.

    Статья взята с www.cyberinfo.ru

    Дня 3 назад заглянул на сайт crackmes.one попробовать силы во взломе защит. Просто наугад взялся за «hitTman’s Kolay One!»: просто по оценке Difficulty: 2.0 и Quality: 4.0. Не примитивно, но и не слишком сложно.

    Оказалось, форма ввода пароля с подсказкой: текст кнопки «submit password» после нажатия меняется на число. Если попробовать разные символы пароля, заметно, что для одних и тех же символов число не меняется. Очевидно, пароль подается в хеш-функцию, а ее результат попадает на кнопку. Пробуя пары символов, легко узнать что число на кнопке — сумма чисел для символов пароля.

    Логично, что программа сравнивает хеш с эталоном прежде чем выдает сообщение «Try harder!». Ищем в сообщение строках бинарника. Повезло: оно даже не зашифровано и на него единственная ссылка в коде.

    Очевидно, рядом же и эталон хеша: 12Eh. Легко проверить: из известных хешей символов составить пароль, например «AaAaAaAaAaAaAaAaAaAaAaAaAaAaAa//» и предложить программе, на что она выдает «Great Job».

    Автор просил: «find a Valid pass!», но это оказалось просто, да и верный пароль — не один. Куда интересней написать генератор ключей. Пригодится таблица хеш-значений для всего алфавита. Руками вводить символы пароля и записывать на бумаге их хеши долго и скучно, ведь можно заставить программу саму перебрать алфавит.

    У OllyDbg есть коллега — Immunity Debugger, он умеет выполнять скрипты на Python. Отыщем хеш-функцию и заставим ее обработать алфавит.

    В обработчике ButtonClick (sub_45385C) прямо перед сравнением хеша с эталоном находится вызов sub_4537C4. Похоже, это и есть хеш-функция: она принимает строку пароля и возвращает хеш в EAX. Привычных push для передачи параметров не видно, вероятно, они передаются через регистры. Если так, то var_C содержит указатель на строку-пароль.

    Выше вызов sub_432A4C принимает два аргумента: адрес var_C и еще какой-то указатель по смещению от EBX. Ищем что записано в EBX: выше по коду ButtonClick в него записывается содержимое EAX, но прежде нет записей в EAX, значит там тоже находится параметр процедуры. Заглянув в документацию по Delphi видим, что обработчику ButtonClick передается адрес TObject sender. Можно догадаться, что второй аргумент sub_432A4C — это адрес поля ввода на форме, с которого она читает пароль.

    Таких вызовов в ButtonClick два: если запустить программу в отладчике, увидим, что sub_00432A4C действительно записывает указатель на строку-пароль в переменную-аргумент.

    Если дальше выполнять ButtonClick пошагово в отладчике, можно заметить, что в переменной на стеке появится и текст кнопки — число. Легко догадаться, что sub_407CE0 — это int to string, [ebx+2FCh] — это указатель на кнопку, а sub_00432A7C — это setButtonText.

    Теперь подменим пароль перед хешированием: ставим breakpoint по адресу 0x004538B3 — прямо перед вызовом hashFn она же sub_4537C4. Вводим пароль 1234 и средствами отладчика отредактируем содержимое памяти var_C — введем букву A и символ конца строки . Сейчас хеш-функция должна вернуть в EAX значение 0x13 (19). Шагаем вперед и… Первая неудача: в EAX — 0x56 (86). Долго думал, пробовал, грешил на Юникод или еще какие скрытые хитрости программы. Оказалось, программа где-то запоминает длину строки и Вместо хеша «A» вычисляет хеш «A34». Хеш равен 0, поэтому если ввести пароль A34 получим хеш 0x56. Значит введем один символ пароля и повторим правки в отладчике — теперь получилось!

    Теперь нужно повторить действия для всего алфавита:

    • остановиться перед вызовом hashFn

    • сменить символ пароля на следующий по алфавиту

    • остановиться после вызова hashFn и запомнить хеш символа

    • вернуть программу к вызову hashFn

    Вот скрипт на Python, который это сделает:

    import immlib
    
    imm = immlib.Debugger()
    
    def main(args):
        table = {}
    	# break после hashFn
        imm.setBreakpoint(0x004538B8)
        mem_password = imm.getRegs()["EAX"]
    	# цикл по печатным символам ASCII 
        for c in range(0x20, 0x7F):
            b = bytearray()
            b.append(c)
            b.append(b'x00')
            if imm.writeMemory(mem_password, bytes(b)) <= 0:
                imm.log("Failed to write password '{0}'".format(chr(c)))
                return "ERROR"
            
            imm.run()
    		# запоминаем хеш
            table[c] = imm.getRegs()["EAX"]
            
    		# Возвращаемся к вызову hashFn
            imm.setReg("EIP", 0x004538B3)
    		# снова передали указатель на строку-пароль в EAX
            imm.setReg("EAX", mem_password)
            imm.run()
        
    	# запишем результаты в файл
        with open("C:/a.csv", "w") as out:
            for c in table:
                out.write("{0} ".format(chr(c)))
                out.write("0x{:02X}n".format(table[c]))
            
        return "Kolay done"

    Как вариант можно вводить пароль 1234 и вызывать imm.writeLong(mem_password, с), чтобы записать байт символа и три нуля следом.

    Алфавитом овладели, правило хеширования пароля знаем. Как генерировать пароли?

    Наивное решение: перебор всех ключей и проверка каждого. Вот код, что найдет все ключи длины 2:

    const string alphabet = //...
    const unordered_map<char, int> weights = //...
    const int N = 2;
    const int S = 0x12E;
    string key;
    
    void generateKeys(ostream& out) {
        if (N <= key.length()) {
            if (S == sum) {
                out << key << "n";
            }
        } else {
            for (char c : alphabet) {
                const int w = weights.at(c);
                if (sum + w <= S) {
                    key.push_back(c);
                    sum += w;
                    generateKeys(out);
                    key.pop_back();
                    sum -= w;
                }
            }
        }
    }

    Работает, но захлебывается уже на ключах длиной больше 5.

    От перестановки мест слагаемых сумма не меняется, так что код можно улучшить: пусть он перебирает сочетания.

    bool nextCombination(vector<int>& nums, int n) {
        const int k = nums.size();
        for (int i = k - 1; 0 <= i; --i) {
            if (nums[i] < n - k + i) {
                ++nums[i];
                for (int j = i + 1; j < k; ++j) {
                    nums[j] = nums[j - 1] + 1;
                }
                return true;
            }
        }
        return false;
    }
    
    bool TestKey(const vector<int>& nums) {
        int sum = 0;
        for (int i : nums) {
            sum += weights.at(alphabet[i]);
        }
        return S == sum;
    }
    
    string MakeKey(const vector<int>& nums) {
        string key;
        for (int i : nums) {
            key.push_back(alphabet[i]);
        }
        return key;
    }
    
    void generateKeys(ostream& out) {
        vector<int> nums(N);
        for (int i = 0; i < N; ++i) {
            nums[i] = i;
        }
    
        do {
            if (TestKey(nums)) {
                ++cnt;
                out << MakeKey(nums) << 'n';
            }
        } while (nextCombination(nums, alphabet.size()));
    }

    Теперь можно дождаться, пока он найдет все сочетания длины 7.

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

    Можно ли найти лучшее решение, чем перебор всех сочетаний? Например, если известен один верный ключ, как перейти к следующему?
    vx -> ?

    Аналогия: чтобы получить следующее число, добавляем 1 к младшему разряду и, если необходимо, выполняем перенос:
    18, 19, 20, …

    Можно заменять символы пароля так, чтобы его хеш не менялся. Беда в том, что для ‘x’ нет равноценной замены.

    0x01 001: %)+/5;=CGIOSYaegkmq
    0x08 008: 1
    0x0c 00c: y
    0x0d 00d: #
    0x0f 00f: !
    0x11 011: '7
    0x13 013: AM
    0x14 014: "
    0x15 015: 3[
    0x16 016: &
    0x17 017: 9U
    0x19 019: _w
    0x1a 01a: .
    0x1b 01b: E
    0x1d 01d: s
    0x1f 01f:  }
    0x20 020: :
    0x21 021: -W
    0x22 022: >
    0x23 023: ]
    0x28 028: ,JQ
    0x29 029: ?o
    0x2b 02b: 2
    0x2c 02c: R
    0x2d 02d: {
    0x2e 02e: 4V
    0x31 031: K
    0x32 032: (^
    0x36 036: *
    0x37 037: $
    0x38 038: j
    0x39 039: c
    0x3a 03a: D
    0x3e 03e: v
    0x3f 03f: @
    0x40 040: 8Lz
    0x41 041: u
    0x42 042: 6
    0x49 049: b
    0x4a 04a: F
    0x4c 04c: 0
    0x4e 04e: B
    0x57 057: i
    0x5a 05a: N
    0x5c 05c: X
    0x5e 05e: t
    0x64 064: |
    0x6a 06a: Phn
    0x6c 06c: <
    0x72 072: f
    0x75 075: d
    0x7b 07b: H
    0x7e 07e: r
    0x88 088: p
    0x8c 08c: T
    0x90 090: Z
    0x9c 09c: `
    0xac 0ac: l
    0xba 0ba: ~
    0xf0 0f0: x

    Возьмем другой ключ из 3х символов: Zr%. Заменяя % можно пройтись по нескольким ключам:
    Zr% -> Zr) -> Zr+ -> ... -> Zrq
    Попробуем найти замену для rq. Пришлось обойти все пары символов алфавита и вычислить их хеши.
    Zrq -> Zt- -> ZtW -> Zuv

    Что делать дальше — непонятно. Сменить Z на другой символ? У Z нет равноценных замен, придется перебором снова найти первый подходящий ключ.

    Так и не придумал алгоритм перехода от одного известного ключа к следующему: если есть идеи, пишите в комментариях.

    Что если вместо перебора всех сочетаний склеивать пары ключей и складывать их хеши? По сложности алгоритм оказался не лучше перебора: время работы быстро растет с увеличением алфавита и длины ключа, к тому же программа падает из-за нехватки памяти. Можно ее чуть сэкономить, но количество пар на каждом шаге все равно растет слишком быстро при алфавите в 95 букв.

    // Длина ключа N - степень двойки
    void generateKeys(ostream& out) {
        for (int n = 1; n < N; n <<= 1) {
            unordered_map<string, int> next_weights;
            for (auto i = weights.begin(); i != weights.end(); ++i) {
                for (auto j = next(i); j != weights.end(); ++j) {
                    const string& s1 = i->first;
                    int w1 = i->second;
                    const string& s2 = j->first;
                    int w2 = j->second;
                    int len = s1.length() + s2.length();
                    if (len == n * 2) {
                        string s3(len, 0);
                        int w3 = w1 + w2;
                        merge(s1.begin(), s1.end(), s2.begin(), s2.end(), s3.begin());
                        if (len < N) {
                            next_weights[s3] = w3;
                        }
    
                        if (N == len && S == w3) {
                            out << s3 << 'n';
                            ++cnt;
                        }
                    }
                }
            }
            weights.swap(next_weights);
        }
    }

    Old_DeD

    0 / 0 / 0

    Регистрация: 30.10.2016

    Сообщений: 28

    1

    19.11.2016, 17:14. Показов 3278. Ответов 6

    Метки нет (Все метки)


    Здравствуйте форумчане.Решил написать keygen сразу предупреждаю добросовестного Модератора ,что решил написать его не для лицензионной программы ,а к cackme получился вот такой код:

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    #include <iostream>
    using namespace std;
     
    int main()
    {
        char *name;
        char *key;
        cin>>name;
        __asm{
    XOR EAX,EAX
    XOR ECX,ECX
    MOV BL,0x1A
    start:
    MOV AL,BYTE PTR[name]
    ADD AL,CL
    XOR AL,CL
    DIV BL
    SHR AX,0x8
    ADD AL,0x41
    MOV BYTE PTR[key],AL
    INC EDI
    INC ESI
    INC ECX
    JMP start
        }
    cout<<key<<endl;
        return 0;
    }

    Но ,что то он не работает. Помогите найти ошубку!

    __________________
    Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



    0



    7283 / 6227 / 2834

    Регистрация: 14.04.2014

    Сообщений: 26,935

    19.11.2016, 17:49

    2

    Массивы вместо указателей сделай.



    0



    Old_DeD

    0 / 0 / 0

    Регистрация: 30.10.2016

    Сообщений: 28

    20.11.2016, 08:03

     [ТС]

    3

    Так?:

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    #include <iostream>
    #include <string>
    using namespace std;
     
    int main()
    {
        char name[256];
        char key[256];
        cin>>name;
        __asm{
    XOR EAX,EAX
    XOR ECX,ECX
    MOV BL,0x1A
    start:
    MOV AL,BYTE PTR[name]
    ADD AL,CL
    XOR AL,CL
    DIV BL
    SHR AX,0x8
    ADD AL,0x41
    MOV BYTE PTR [key],AL
    INC EDI
    INC ESI
    INC ECX
    JMP start
        }
    cout<<key<<endl;
        return 0;
    }



    0



    7283 / 6227 / 2834

    Регистрация: 14.04.2014

    Сообщений: 26,935

    20.11.2016, 11:03

    4

    Так. И почему нет выхода из этого цикла? Напиши на C++ и не усложняй.



    1



    691 / 100 / 17

    Регистрация: 22.06.2014

    Сообщений: 215

    20.11.2016, 11:11

    5

    Лучший ответ Сообщение было отмечено Old_DeD как решение

    Решение

    Old_DeD, у тебя получился какой-то замкнутый цикл с безусловным переходом назад. В конце цикла ты инкрементируешь регистры ESI и EDI, которые до этого ты не инициализировал. А если бы инициализировал, то лучше было бы юзать не MOV AL,BYTE PTR[name] и MOV BYTE PTR [key],AL, а инструкции STOSB и LODSB. Меньше «весят» и используются по конкретному назначению.



    2



    Old_DeD

    0 / 0 / 0

    Регистрация: 30.10.2016

    Сообщений: 28

    20.11.2016, 16:33

     [ТС]

    6

    Сделал цикл но почему то не работает:

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    #include <iostream>
    #include <string>
    using namespace std;
     
    int main()
    {
        char name[256];
        char key[256];
        cin>>name;
        for(int i=0;i<7;i++)
        {
        __asm{
    XOR EAX,EAX
    MOV BL,0x1A
    MOV AL,BYTE PTR[name]
    ADD AL,CL
    XOR AL,CL
    DIV BL
    SHR AX,0x8
    ADD AL,0x41
    MOV BYTE PTR [key],AL
            }
        }
    cout<<key<<endl;
        return 0;
    }



    0



    Old_DeD

    0 / 0 / 0

    Регистрация: 30.10.2016

    Сообщений: 28

    26.11.2016, 11:39

     [ТС]

    7

    Спасибо всем за помощь, наконец-то все работает(если что крэкми был fantom4)
    Сделал так, теперь все работает:

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    
    #include <iostream>
    #include <string>
    using namespace std;
     
    int main()
    {
            char name[256];
            char key[256];
            cin >> name;
        __asm{
                LEA ESI,name
                LEA EDI,key
                XOR EAX,EAX
                XOR ECX,ECX
                MOV BL,0x1A
                START:
                CMP BYTE PTR DS:[ESI],0
                JE SHORT METKA
                MOV AL,BYTE PTR DS:[ESI]
                ADD AL,CL
                XOR AL,CL
                DIV BL
                SHR AX,0x8
                ADD AL,0x41
                MOV BYTE PTR DS:[EDI],AL
                INC EDI
                INC ESI
                INC ECX
                JMP START
                METKA:
                MOV BYTE PTR DS:[EDI],0
                XOR EAX,EAX
            }
    cout<<key<<endl;
        return 0;
    }



    0



    Понравилась статья? Поделить с друзьями:
  • Как написать лампочку
  • Как написать крутую статью
  • Как написать лайк на английском языке
  • Как написать крутую музыку
  • Как написать ладно