R0 CREW

Neffarion :: 0xs2 :: Key Generation :: Генератор ключей (Перевод: coldfire)

0xs2 :: Key Generation :: Генератор ключей

Введение

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

Target Information

Filename… keygenme.exe [ download ]
Developer… hackereh@
Toolz… OllyDbg, C compiler

Adficio

Схема контроля, построенная на вводе серийного ключа может быть достаточно простой для крэкеров любого уровня, поскольку в алгоритм можно интегрировать практически любой дополнительный фактор, не связаный никакими физическими законами. Ведь компьтерная программа существует в вируткльном “королевстве” (области), в котором нет законов. Посему любая программа может перехватить (прочитать данные из) другой программы и некоторым образом использовать их в схеме защиты. Поскольку, на данный момент таких систем которые делали бы это практически нет (за исключеним моей), это точно будет нормой на протяжении следующих 5-8 лет. То есть, прежде чем вы приступите к чтению, нужно, чтобы ваш мозг “обработал” все ваши идеи, которые вовлечены в создание теории и просто поработал как калькулятор.

1 - а. Загрузите программу

Картинка 1. Программа ( наша цель )

2 - а. Нажмите Check

Картинка 2. Неправильные код регистрации ( серийный ключ )

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

3. - а. Загрузка исследуемой программы в OlkyDbg( File -> Open )

b. Правый клик мыши на любой инструкций и выбрать Search for -> All referenced text strings

Картинка 3. Обнаруженные строки

Наиболее быстрый путь найти решение - это найти источник проблем

Мы видим сообщений об ошибке, что мы получаем при неправильной регистрация, по адресу 0x4012DA.

4 - а. Двойной клик по адресу 0x4012DA в окошке String references dialog

Картинка 4. Сообщение с ошибкой

Мы определили источник нашего сообщения с ошибкой, находящейся по адресу 0x4012D3( начало кода окошка с сообщением). Теперь внимательно посмотрите на поле OP code, вы сможете увидеть, что наше сообщение с ошибкой принадлежит участку кода.

5 - a. Пролистайте к началу этого участка кода ( на 0x4011F2 )

Картинка 5. Бинго!

Мы видим, что первой функцией данного участка кода есть GetDlgItemText, которая( опытные программисты знают ) является функцией API которая читает входные данные с элемента формы text box. Есть очень простой способ предположить, с какого Text Box данная функция считала данные: посмотрите на флаг ControlID, которые равен 1001. По умолчанию каждый новый Теxt Box на форму имеет ControlID = 1000, таким образом у первого TextBox ControlID = 1001, у второго - 1002 и так далее.

Следующей инструкция после GetDlgItemText - СMP ( compare - сравнить ), которая проверяет, что входные данные TextBox’a( которые получили используя функцию GetDlgItemText ) проверяются со значением 1. Это означает, что инструкция проверяет соответствует ли длина строка 1 символу.

Эта техника имеет название - “прерывание на инструкции”, которая будет одной из наиболее часто используемых техник в вашей карьере реверсинга. Вы будете ставить брекпоинт на определенный адрес и выполнять программу внутри отладчика. Когда программа достигнет адреса, на котором стоит брекпонит, произойдет пауза исполняемой программы и передаст управление OllyDbg, где вы сможете увидеть , что загружено в памяти по этому адресу( мы может видеть строку, число, что-нибудь нужное).

6 - а. Поставим брекпоинт на адрес 0x40120E путем нажатия клавиши [F2]

Картинка 6. Сообщение с ошибкой

Теперь запустим программу под отладчиком и введем любой текст в Тext Boxes для того, чтобы увидеть сможем ли мы определить текст, который сравнивается по адресу 0x40120E.

7 - а. Нажмите [F9] в OllyDbg

b. Введите Name: aBcDeF
c. Введите Serial: 123456

Картинка 7. Отладка

8 - а. Нажмите Check

Картинка 8. Брекпоинт

Небольшое окошко под секцией инструкций показывает вам какое текущее значение регистра(ов), где видим что EAX=00000006. Следовательно, двоичное значение регистра ЕАХ = 6.

Картинка 9. Отладка

Программа прервалась по адресу 0x40120E, теперь мы можем проанализировать код пошагово используя технику называемую “пошаговая отладка”. Она представляет собой, что вы будете проходить по каждой инструкции участка кода останавливается на каждой, соответственно сможете проанализировать значения в ваших регистрах. Это наилучший путь отреверсить алгоритм( между прочим =) )

10 - а. Нажмите [F7] 8 раз ( и смотрите на значения в регистрах пока делаете это) пока не достигните адреса 0x401222

Картинка 10. Введенные нами данные

Пока мы шагали по каждой нашей инструкции мы видели, что происходило:

  • 0x40120E: Сравните длину Name с 1
  • 0x401211: Если длина Name меньше чем 1 символ, то делаем прыжок на адрес 0x4012A7
  • 0x401217: Сравниваем длину Name с 24 ( Помните, что все цикла представляются в hex, “24” в hex - “18”)
  • 0x40121A: Если длина Name больше чем 24 делаем прыжок на адрес 0x401293
  • 0x40121C: EAX содержит длину Name
  • 0x40121E: Очистить регистр ECX ( Используя команду XOR регистр автоматически очищает себя)
  • 0x40120E: Очистить регистр EAX
  • 0x401222: EDI содержит введенное нами Name (“aBcDeF”)

Конечно теперь вы понимаете почему пошаговая отладка так важна? ;). После шага 5 я объяснял как идентифицировать Техt boxes по их Cid ( Control ID) и оказывается, что первый раз функция GetDlgItemText вызывается после чтения данных с первого Техt boxe - наше Name.

Следующая инструкция после 0х401222 содержит под-блок( блок кода внутри блока кода), давайте рассмотрим его.

11 - а. Нажмите [F7] 52 раза ( и наблюдайте за значения в регистрах пока будете это делать) пока не достигните адреса 0x401248

Картинка 11. Генерация серийника

Пошагово проходим по инструкциям и смотрим что происходило:

  • 0x401227: EDX содержит строку “DEADC0DE”
  • 0x40122C: Берем первый символ нашего Name и записуем ее в EAX
  • 0x401230: Прибавляем к содержимому ЕАХ содержимое EDX
  • 0x401232: Умножаем EAX на “666”
  • 0x401238: Складываем EAX с EDX
  • 0x40123A: Отнимаем “777” от EAX
  • 0x40123F: Инкрементируем ECX значением размещения текущего символа Name, который сейчас обрабатывается - Поскольку сейчас мы обрабатываем первый символ строки Name, таким образом ECX = “1”
  • 0x401240: Сравниваем длину ECX(“1”) с длиной EBX(“6”, длина нашей строки Name)
  • 0x401242: Если ECX == 0 делаем прыжок на адресс 0x40122C (начало цикла)

Этот цикл использует строку “DEADCODE” как хэш, потом ( для каждого символа отдельно ) выполняет определенные математические преобразования и записует результат в EBX, который равен “3FC62105” :slight_smile:

По адресу 0x401248 мы видим 2ю функцию этого участка кода, которая называется wsprintf. Эта функция берет строку и форматирует ее специальным образом. Всегда обращайтесь к справочнику по Windows API если не знаете, что определенная функция делает. Только 1 флаг, который устанавливается для этой функцией - параметр Форматирования, и “%u” означает, что строка будете конвертирована в беззнаковое целое число.

Картинка 12. Сгенерированный серийник

Окончательный результат (“3FC62105”) - правильный серийный код, который сгенерирован для строка “aBcDeF”, и представленный в шестнадцетиричном виде. Я люблю использоваться виндовский калькультор для преобразования из шестнадцетиричной системы в двоичную. Для 3FC62105 получаем значение 1069949189.

7 - а. Сверните окно OllyDbf и перейдите к программе b. Введите Name: aBcDeF с. Введие Serial: 1069949189 d. Нажмите Check

Картинка 13. (не смотря на номер =)) ) Все отлично. УРА!)

Основываясь на этом алгоритме я написал небольшой генератор на с++, который можно скачать в этом туториле( ссылка сверху ). Вы должны понимать, что создание генератор не легкая задача, поэтому не думайте, что коммерческие программу будут иметь такой простой алгоритм как в этом примере. Существует 2 пути, по которым вы можете взломать программу, которая имеем схему защиты “имя/серийный ключ”: написание генератора ключей или пропачить ее. Во втором уроке, вы видели, как легко пропатчить некоторые (‘профессиональные’) программы;)

© +Neffarion
http://www.0xNeff.eu

© Translated by coldfire from r0 Crew

0x401238: Слаживаем EAX с EDX
Исправьте опечатку.

с вашего позволения, опубликую у себя

Всегда за)) Файл с разметкой находится тут