Продолжаю цикл статей, по реверс-инжиниринг для начинающих, сегодня приготовил список интересный список программ. В сегодняшней статье будет много интересного, разберем все алгоритмы защиты, для некоторых напишем KeyGen. Бывают ситуации, в которых, не обязательно вносить изменения в программу, нужно только разобрать логику защиты и получить ключ активации, с под отладчика. Разобрав логику защиты, можно творить разные вещи и далее все зависит от вашей фантазии и умений.
У каждой, из сегодняшних программ, свой алгоритм защиты. Я, не просто так, подбираю софт, основная цель - показать больше нюансов, с чем вы можете столкнуться (при анализе). Если предыдущие статьи понравились, то и эта не подкачает. Ну а теперь приступим к анализу программ.
Программа: AntiPlagiarism.NET (Официальный сайт: https://antiplagiarism.net/ru/)
Версия программы: 4.125.0.0 (Актуальная на сегодня).
Софт Exeinfo PE (Анализатор исполняемых файлов), показал что: на программе нет пакера и написана она на C#
Для того, что бы начать анализ (крякинг), нам нужно знать какие ограничения в программе. Как обычно, переходим на официальный сайт программы и читаем там информацию. В большинстве случаев, разработчики программ, публикуют подобную информацию на своих сайтах. В нашем случае так и есть, мы узнаем что: Демонстрационная версия программы работает 1 день. После чего проверка текста будет недоступна. Для справедливости скажу, что не все разработчики: публикуют, всю, подробную информацию о ограничениях, могут быть и подводные камни, что всплывают в процессе работы программы.
Потому закидываем исполняемый файл программы в DnSpy версии x64. И перед тем, как приступим к анализу, давайте подумаем. Мы уже знаем что для активации программы нужен ключ, тогда логично будет добраться до формы активации. После чего посмотреть на алгоритм активации под отладчиком. И уже, выходя из ситуации, составить дальнейший план действий. Направление мысли понятно, тогда приступим к действиям.
Переходим к точке входа. Кстати, говоря понятным, простым языком, точка входа в C#: это место что представлено статическим методом Main. И с этого места начинается запуск программы, с соблюдением условия что наша программа будет иметь .exe - расширение, то есть является исполняемым файлом. Бывают и случаи когда в программе несколько точек входа, что размещены статическом методе Main.
В точке входа ничего интересного не наблюдается. Но вот в глаз бросается class ActivationForm. Но это еще ни о чем не говорит, понятно что мы нашли место где вызывается проверка активации программы. Сначала анализируем а потом делаем выводы и принимаем решения, это работает только так. Бывают ситуации что думаешь вот она победа, но на самом деле, оказывается что это не так (к слову говоря).
Пройдясь по коду, я остановился на функции setSerialNumberAntiplagiarism. Что сама по себе намекает на установку настроек регистрационного ключа (условно говоря). Можно, только, предположить что: при вводе неверного серийного номера, программа выдаст нам сообщение что ключ не верный. Тем более что формат ключа мы не знаем, как это проверить ?. Все очень просто, поставим точку останова в начале функции. Запустим программу под отладчиком, введем выдуманы серийный номер, посмотрим что вернет нам функция (как отработает).
Я ввел ключ активации "123456789", функция отработала, и вернула результат. Показывая нам что введен неверный лицензионный ключ, чего и следовало ожидать. Значит, мои предположения, оказались верными, идем далее, не отходя от кассы
. Тут же, обращаем внимания на функцию !ProgramActivation.ValidateUnlimitedSerialNumber. Судя по названию, снова предполагаю, она отвечает за проверку введенного ключа активации. И вызывается она уже из класа ProgramActivation. Давайте перейдем и посмотрим на её код, после чего будем делать выводы.
- Написания генератора лицензий для программы (KeyGen).
- Сгенерировать ключ активации прямо, с под отладчика DnSpy.
- Крякинг программы, внесение изменений, после чего, программа активируется любым ключом.
Собственный генератор лицензий, всегда хорошая штука, под рукой. Особенно, если вы сливаете в сеть, подобные творения. Каждый сможет сгенерировать себе ключ активации, при этом ни одной правки в коде программы. Тут главное разобрать логику, работы, алгоритма. И так приступим, для начала давайте посмотрим что делает наша функция.
Для удобства, я все выделил блоками, на картинке.
- Идет проверка ключа активации (строки serialNumber), если его нет (поле пустое) то функция возвращает результат false (запрет). То есть говорит нет активации.
- Определение количества символов (длину строки). Если не соответствие то функция, также, возвращает результат false (запрет).
- Цифры и буквы, собственно, то из чего будет состоять наш ключ активации.
- int[] array = new int одномерный массив для создание которого используется оператор new.
- Цикл, в котором происходит генерация ключа.
- В финале если ключ не верный мы получим результат false (запрет).
Также, мы выяснили, что: длина нашего ключа активации состоит из 30 символов и после каждых 5 символов стоит разделитель, то есть знак "-". Выходя из этого,
формат, ключа активации, имеет вид: XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX. А с разделителем длина состоит из 35 символов (Это и есть правильный формат ключа).
Ну а мы пока вернемся к нашему KeyGen. Я заранее приготовил заготовку, ну как заготовку, написал алгоритм для генерации ключа активации. Сам цикл, генерации не такой уж и сложный, разбираясь в переменных, написать генератор можно на любом языке программирования. Как видите в коде генератора - нет ничего лишнего.
Демонстрация работы на видео (Активация программы используя KeyGen): Видео: ANTI-1.wmv (Имеется и в архиве, на всякий пожарный).
В результате проделанных манипуляций: Мы имеем генератор лицензионных ключей, что удобно, особенно для массового распространения. Программа активируется сгенерированными ключами и чувствует себя хорошо. С этим я думаю понятно. Исходники и скомпилированный файл прикрепил к файлам статьи. Для самых ленивых, ничего не нужно делать, запустил и сгенерировал себе ключ. 
Способ №2: Генерация ключа, прямо, с под отладчика.
Если первый способ сложный для вас, то: можно сгенерировать, себе ключ, применив возможности отладчика DnSpy (я выше про это говорил). И так, возвращаемся к нашей функции ValidateUnlimitedSerialNumber. Как мы уже знаем: Она отвечает за проверку ключа (верный или нет). Для того что бы получить ключ нам нужно поставить точку останова, в конец функции, запустить программу и посмотреть как отработает эта функция (что нам вернет, в конце).
В результате, что произошло: Формат ключа мы узнали (определили выше). Тут важно, стоит обратить внимание: Выдуманный ключ, нужно вводить, в верном формате. Если этого не сделать то: функция не отработает до конца и выдаст вам False (запрет). Это за того что, выше, мы выяснили что, в начале функции, идет проверка длины ключа и разделитель.
1. Я ввел (выдуманный ключ, в правильном формате), функция отработала и остановилась на return false (Запрет на активацию). Естественно так как ключ не валидный.
2. Но, в окончании, в отладчике, отобразился правильный ключ активации.
Проверяем активируется программа или нет. И получаем результат:
Все манипуляции, с кодом , Видео: ANTI-2.wmv (Имеется и в архиве, на всякий пожарный).
Ну и теперь переходим к третьему способу крякинга - этой программы.
Способ №3: Крякинг, внесение изменений.
Суть этого способа в следующем: изменить код программы так что бы она принимала любой ключ активации (с минимальными правками). Из функции мы убираем ненужный код, а оставляем только return true (то есть делаем что бы она всегда говорила разрешить, активировать
). Можно было и не убирать весь код, а только изменить в конце функции на return true (Это уже дело каждого, на работу программы это не повлияет). В финале, программа активируется любым ключом, формата: XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX.
Ну и для красоты, вставляем свое авторство: Что бы вместо текущего ключа отображалась, нужная вам, надпись. Это не обязательно, но смотрится намного красивее, нежели взломанный софт без инициалов. То есть вот так:
Ну и в этом случае, я продемонстрировал, все на видео, советую посмотреть:
Все манипуляции, с кодом, на видео: ANTI-3.wmv (Имеется и в архиве, на всякий пожарный).
Ну и после проделанных манипуляций, способ крякинга, наша программа активируется любым ключом и окно активации имеет вот такой вид. Ну и как замечаете что после активации, текущий лицензионный ключ не изменяется (это очевидно), так как место его вывода мы установили текстовое значение в виде копирайтов (рекламы форума), но программа все равно активируется.
Несколько нюансов, по этой программе, если кому будет интересно. Желательно, ознакомится.
1. Данные активации программа записывает в реестр, при смене ключа в том же месте и перезаписывает.
2. Тот факт: что программа стучит в интеренет, для проверки ключа активации, ничего не меняет. Если захотите - можно взять и под отладчиком убрать все ссылки (куда стучит программа), просто вырезать.
К примеру вот тут, и таких не много. Просто воспользуйтесь поиском по коду.
То есть, после удаление всех ссылок, из кода, что отвечают за активацию - софт все равно будет работать. Единственное что, при таком подходе, придется ключ активации прописать в ручную, в реестре.
То есть взять и добавить строковой параметр в реестр к ключом активации. Что я имею в виду:
1. Если ключа активации, в реестре, по какой то причине нет, то добавляем строковой параметр с именем psk
2. И там, где значение, вводим ваш ключ.
Ну по этой программе я разжевал уже все, проще некуда. Теперь идем далее и приступаем к анализу следующего софта.
Версия программы: 1.1 (Актуальная на сегодня).
Софт Exeinfo PE (Анализатор исполняемых файлов), показал что: на программе нет пакера и написана она на C#
Но, если открыть исполняемый файл, в отладчике DnSpy, то мы увидим обратную картину, присутствие обфускатора. Такое бывает, что утилита Exeinfo PE
неправильно выдала результат (иногда). Также, неправильно определена разрядность приложения (x32 или x64) - для отладки будем использовать DnSpy X64.
1. Перетащить исполняемый файл на TestsEditor.exe на de4dot.exe
2. После чего, вы, получите очищенный файл TestsEditor-cleaned.exe
С мелочами разобрались, теперь приступим к анализу программы. На официальном сайте программы, можно увидеть, что эта программа входит в комплекс программ
(она является основой, так как служит для создания тестов). О покупке софта нет никакой информации, наоборот говорится о том что софт бесплатный.
Но есть одно но, когда вы запускаете программу то получаете сообщения: Ошибка подключения!!!. После чего все меню, функционал, в программе - становятся неактивными.
Для того, что бы проверить зависимость программы от её сайта, используем HTTP Analyzer. Снова запустим анализатор (нажимаем на кнопку Start) и после этого запускаем программу, смотрим на полученный результат. И мои предположения оказались верными, программа обращается, по ссылке, к своему сайту и уже от туда идет редирект (перенаправление на http://testsprogram.narod.ru/STS.txt).
А в текстовом файле STS.txt располагается, какая то информация, в зашифрованном виде.
Переходим к точке входа и видим что тут, сразу же, идет запуск главной формы программы. Далее мы переходим в главную форму (к функциям) и ищем фразу "Ошибка подключения". Может все показаться просто, но далее мы будем анализировать, происходящие, события в коде. И постепенно дойдем до истины, как обычно.
Переход к точке входа и сразу же переход на главную форму (в код).
Переходим в method_4 и смотрим на его код. А тут все просто, именно то что нам нужно, то есть это и есть наши ограничения (события что с ними связаны). Сначала проверяются условия, если они не соблюдаются, то программа говорит визуальному компоненту, на форме, Enabled = false. То есть запрещает его использования, делая его неактивным.
На картинке
1. Условие что делает активным или неактивным меню "Файл" в программе.
2. Другие условия что также отвечают за (True или False) визуальных компонентов программы. При этом параметр bool_8 играет у нас роль выключает и включателя. Выходя из увиденного можно, смело, изменить этот параметр, то есть принудительно установить параметр True (Разрешить). После этого, у всех, запрещенных (зависящих от bool_8 ), визуальных компонентов, параметр Enabled будет равен True.
Что я имею в виду и как это делается - посмотрите на видео. В финале мы изменили параметры и получили вот такую картину.
Для закрепления материала предлагаю посмотреть видео.
Все манипуляции, с кодом, на видео: TestsEditor.wmv (Имеется и в архиве, на всякий пожарный).
А вот сообщение, что появлялось при запуске программы, заменили на свой текст "Рекламного характера" и добавили копирайты в название программы.
К примеру, если сообщение не нужно, вообще, то просто убираете вызов сообщения в коде и при запуске программы не будет никакого сообщения.
Выглядит все это вот так (после изменения в коде):
При запуске программы, появляется наше сообщение, что софт взломан и реклама форума xss.pro, все меню разблокированы. Победа!
.Небольшое дополнение:
1.Вы можете спросить: А что будет если сайт разработчика перестанет работать, ведь туда же обращается программа ?. Ответ прост, ничего не будет, все будет работать как работало. Даже, если вы вырежете ссылки на сайт разработчика софт, все равно, будет работать. Можете это сами проверить, это так для справки.
2. Остальные программы, этого разработчика, я также добавил к файлам статьи (на всякий пожарный) - они без ограничений. На тот случай, если его сайт перестанет работать. Тогда, в арсенале, будет полный комплект программ что требуются для создания тестов.
И с этим софтом разобрались, переходим к следующей программе.
Предназначение: Программа File Juggler (Официальный сайт программы https://www.filejuggler.com) для автоматической сортировки файлов по папкам (С применением правил, умеет: переименовывать, перемещать, копировать, удалять файлы и многие другие функции). Более подробная информация на официальном сайте.
Версия программы: 2.0.22 (Актуальная на сегодня).
Софт Exeinfo PE (Анализатор исполняемых файлов), показал что: на программе нет пакера и написана она на C#
Теперь осталось вычислить ограничения в программе, так как на официальном сайте, ничего, не сказано. Тогда запустим программу и посмотрим визуально, как обычно. При запуске программы, нам показывается регистрационный диалог, с намеком что триальний (пробный) период программы - 30 дней. То есть, по сути дела: Все функции доступны, пока не закончится триал.
Опустившись, немного по коду, так как функция у нас тут не одна, обращаем внимание на класс LicenseHelper.
Так вот, если перейти и посмотреть код далее, то получается очень интересная картина. Сейчас постараюсь все пояснить, так как тут: Если пойти неправильным путем то работы добавиться не мало. Это про то что я ранее, всегда, говорил - анализировать и делать правильные решения. Заметно, что в классе LicenseHelper много функций, где используются криптографические алгоритмы. Что я имел в виду под фразой "неправильным путем": IsLicensed получает статус выходя из манипуляций в IsEvaluationLicense.
Так вот, если перейти в код IsEvaluationLicense то мы переместимся в динамическую библиотеку LogicNP.CryptoLicensing.dll (файл что расположен возле исполняемого файла программы).
1. Она под обфускатором.
2. Функций там не мало, все завязано с проверкой ключа, различные крипто-манипуляции.
3. Что бы анализировать динамическую библиотеку, сначала нужно снять обфускатор.
Так тоже можно делать, если есть в этом надобность, в нашем же случае можно пойти путем - намного проще. Выше я говорил про IsLicensed, так вот: Скажу простым языком, как бы там не крутился код, в динамитеской библиотеке, финальное решение принимает IsLicensed (То есть активировать лицензию или нет). Тогда, есть смысл, посмотреть на его код и помочь ему правильно принять решение, в пользу крякера
. Это вариант лучше, нежели копаться в крипто-алгоритме. То есть тут на выбор, я только подсказываю, более проще вариант, тем более что это сработает и времени уйдет намного меньше. Плюс еще в том что: при таком подходе, патчить мы будет только исполняемый файл а не динамическую библиотеку (или то и другое, в зависимости от ситуации).
А теперь, запускаем, модифицированную, программу и смотрим. При запуске программы никаких окон, с регистрацией, не запустилось. Программа активировалась, и в окне "О программе" установлен статус Registered to. Понятно, что на кого зарегистрирована программа, отображаться не будет. Почему ? - потому что это патчинг, информация о лицензии не загрузилась. Выглядит все это дело вот так:
Все манипуляции, с кодом, на видео: F-juggler.wmv (Имеется и в архиве, на всякий пожарный).
После всех манипуляций, программа активирована и в финальном варианте будет выглядеть вот так:
Предназначение: Программа Сsv Еasу (официальный сайт: https://csveasy.com) для работы с громадными CSV файлами. Как говорит разработчик: софт может открывать файлы что состоят из 10 000 000 строк и 10 000 столбцов. Более подробное описание на официальном сайте программы.
Версия программы: 1.1.16 (Актуальная на сегодня).
Софт Exeinfo PE (Анализатор исполняемых файлов), показал что: на программе нет пакера и написана она на C#
На официальном сайте, программы, написано что триал версия доступна в течении 10 дней. Это вся информация что нам доступна. А когда закончится триальный период то программа будет ограничена в обработвке строк (не более 1000, невозможно сохранить). Забегая, немного наперед, скажу что: Эту программу можно пролечить по разному. Можно подобрать ключ активации, можно сделать так чтобы она принимала любые ключи активации (неверные). А можно сделать так что бы она сразу была зарегистрирована, то есть никаких ключей не нужно, запустил сразу же лицензионная версию. Вот и по этому пути, сегодня, мы пойдем.
При запуске программы, появляется форма, где сообщается что у вас триальная версия программы и предлагается купить её. А в меню Help - Enter License Key, есть
форма активации. Если ввести неверный ключ то программа проверит его и покажет сообщение, ну это естественно. Вот от этого мы будет и отталкиваться.
Так вот, что происходит, в каждом блоке:
1. Отображается информация о продукте: название, версии программы, описание.
2. Если значение (что вернет функция ValidLicense) неверное то мы получим Триал-Лицензию.
3. Загружается лицензионный ключ. То есть принимается значение ключа и после 5, 10, 15 символов вставляется разделитель (знак -).
4. Типы лицензии, при условии.
5. Типы лицензии устанавливаются, в зависимости, от того что вернет нам функция GetLicenseType.
Думаю понятно ?, все что нам нужно у нас есть. Теперь, давайте перейдем в GetLicenseType и посмотрим на код, после чего будет делать выводы и изменения, в зависимости от ситуации.
А тут, у нас, в зависимости от условия, активируется тип лицензии: Для одного пользователя или универсальная. Но по стандарту установлена триальная лицензия. Нам, никто не мешает, изменить код так чтобы активировалась, сразу же, максимальная лицензия. Делается все это вот так, то есть 99% кода просто убирается. Зачем нам эти условия, если мы хотим сразу максимальную лицензию. В результате код выглядит вот так, после изменения, то есть, устанавливается единый статус лицензии (без лимитная).
Но тут, есть еще один нюанс. Так как, мы убрали 99% кода, то если не подправить значения в About (Где загружается информация о лицензии), то при открытия этого окна возникнет ошибка. Последствия будут такие: информация о лицензии не отобразится а программа выдаст исключения. Я имею в виду вот это:
После чего, при открытии информации о лицензии, в окне About, никаких ошибок, не будет.Для укрепления материала советую ознакомится с видео, там все от а до я показано.
Все манипуляции, с кодом, на видео: CEasy.wmv (Имеется и в архиве, на всякий пожарный).
Финальный вариант софта, после всех правок, будет выглядеть вот так.
И с этой программой разобрались.
Несколько слов, после всего проделанного, скажу так:
В этой статье, я старался, рассказать все, максимально доступным языком. Даже мелкие нюансы, мы разобрали, для кого то просто а для кого то сложно. Все мы разные, как по знаниям так и по восприятию. Мое дело, заключается в пояснении материала: максимально просто, доступно, что бы понимал каждый человек. На сегодня у меня все, надеюсь было интересно?!.
В архиве, находятся:
KeyGen (генератор ключей для AntiPlagiarism.NET \ исполняемый файл) Virustotal: https://www.virustotal.com/gui/file/6888dbed1e7de86ffd8c9c24d80e9d317fc2eabaf0bf060f17b2f43f406f5a80
Инсталляторы Virustotal:
AntiPlagiarism.NET \ Virustotal: https://www.virustotal.com/gui/file/d6ed511644eb68a3ed2892bee962a37eae35620f54212592a86fff7e35c37778
TestsEditor \ Virustotal: https://www.virustotal.com/gui/file/744d528e047e90c68e68472f702d3d8295d6eec818750f60a2f25c552aa3ce60
Filejuggler \ Virustotal: https://www.virustotal.com/gui/file/eb80f7bf7256c2860e7a607caef313ba897f55fcab4f591422c062a760429d7a
Сsveasy \ Virustotal: https://www.virustotal.com/gui/file/960cd1c69419b152b74e45fc8557726ad8de7b7e1dcc531aeb18a4e909a1f648
Инструменты для анализа:
HttpAnalyzer / virustotal: https://www.virustotal.com/gui/file/f25541dee8f859b62c642d2e6e835c247900b5bc94a00cdbc4d894bab83796dd
DnSpy x32 / virustotal: https://www.virustotal.com/gui/file/7ce05f1aafaaa87d046bbad1b07801777e724251b084bc7f70cef71c98b08105
DnSpy x64 / virustotal: https://www.virustotal.com/gui/file/cc15f3f7836f5c976e058aabdd55af8635b484a6b9a5e94a2cb048856965f9e2
ExeinfoPe / virustotal: https://www.virustotal.com/gui/file/32e6df44a529d3bd543aae01365852990c0e7f3b4f84b5a7f9d7dfc18d6a46fd
de4dot(x32).exe / virustotal: https://www.virustotal.com/gui/file/1ef4d880b16efb49271463e1b9c0de68e637320c1be40f1e7f1603538f3e289d
de4dot(x64).exe / virustotal: https://www.virustotal.com/gui/file/89582c764c5cdeb58656a60f8419fdcd8c5eb6caa2e5f332d2658e89555693cb
Файлы к статье:
KeyGen (генератор ключей для AntiPlagiarism.NET \ исполняемый файл) Virustotal: https://www.virustotal.com/gui/file/6888dbed1e7de86ffd8c9c24d80e9d317fc2eabaf0bf060f17b2f43f406f5a80
Инсталляторы Virustotal:
AntiPlagiarism.NET \ Virustotal: https://www.virustotal.com/gui/file/d6ed511644eb68a3ed2892bee962a37eae35620f54212592a86fff7e35c37778
TestsEditor \ Virustotal: https://www.virustotal.com/gui/file/744d528e047e90c68e68472f702d3d8295d6eec818750f60a2f25c552aa3ce60
Filejuggler \ Virustotal: https://www.virustotal.com/gui/file/eb80f7bf7256c2860e7a607caef313ba897f55fcab4f591422c062a760429d7a
Сsveasy \ Virustotal: https://www.virustotal.com/gui/file/960cd1c69419b152b74e45fc8557726ad8de7b7e1dcc531aeb18a4e909a1f648
Инструменты для анализа:
HttpAnalyzer / virustotal: https://www.virustotal.com/gui/file/f25541dee8f859b62c642d2e6e835c247900b5bc94a00cdbc4d894bab83796dd
DnSpy x32 / virustotal: https://www.virustotal.com/gui/file/7ce05f1aafaaa87d046bbad1b07801777e724251b084bc7f70cef71c98b08105
DnSpy x64 / virustotal: https://www.virustotal.com/gui/file/cc15f3f7836f5c976e058aabdd55af8635b484a6b9a5e94a2cb048856965f9e2
ExeinfoPe / virustotal: https://www.virustotal.com/gui/file/32e6df44a529d3bd543aae01365852990c0e7f3b4f84b5a7f9d7dfc18d6a46fd
de4dot(x32).exe / virustotal: https://www.virustotal.com/gui/file/1ef4d880b16efb49271463e1b9c0de68e637320c1be40f1e7f1603538f3e289d
de4dot(x64).exe / virustotal: https://www.virustotal.com/gui/file/89582c764c5cdeb58656a60f8419fdcd8c5eb6caa2e5f332d2658e89555693cb
Файлы к статье:
Скрытый контент для зарегистрированных пользователей.
