В нашем деле, сказать что все знаю, это ничего не сказать. Алгоритмов защиты множество, решений не меньше. Основная цель: научить вас манипулировать кодом, находить решения там где их нет и кажется что все пропало. Каждая, моя статья, будет по своему интересная и сориентирована на результат, эффективные решения задач, простоту действий в сложных ситуациях.
Но и могу сказать сразу, что только самые упорные и настойчивые достигнут успеха, в этом деле. Если вы не планируете практиковать, просто читаете статьи и не набиваете руку, это даст минимальный опыт в этом деле. Как я говорил, ранее, не просто так крошим разный софт, делаем генераторы лицензий, правим код. Без этой практики, сложнейшие статьи, анализ защиты софта (что отличается особой сложностью), просто бесполезны. Вам это скажет любой человек что занимается, варится в этом деле. Надеюсь направление мыслей понятно, ну а сейчас приступим к делу.
Обзор защиты программы WebArchive Downloader: Версия скачана с официального сайта программы и на момент публикации, этой статьи, является актуальной.
Разработчик \ Ссылка на официальный сайт: http://www.webarchivedownloader.com/ru/download.html
Версия программы: 1.5.0
Предназначение программы: Программа для скачивания архивов веб сайтов с интернет архива http://web.archive.org/. В программе присутствуют различные, удобные фишки. Например выбор периода парсинга по годам, многопоточный режим парсинга и не только это.
Защита \ Принцип активации : Принцип активации состоит из проверки ключа через интернет. Остальные нюансы разберем уже по ходу анализа.
И так какие же у нас целы:
Первый вариант (Более сложный):
- Пропатчим программу и напишем собственный KeyGen. Сделаем так что бы программа принимала наши ключи активации (с авторством и рекламой форума xss.pro).
- Перепишем принцип активации программы, с внесением множественных поправок в код, для реализации задуманного. Этот вариант будет полезным в том случае: если вы не захотите сливать программу в интернет а только будете выдавать ключи активации. И только тот, у кого ключ активации, подходит под ID системы, сможет пользоваться полнофункциональной версией.
Второй вариант (Менее сложный):
- Сделаем абсолютный патчинг, можно так сказать. Минимальное вмешательство в код а в финале программа будет активирована. Никакой привязки к железу, при этом подходе не будет. Каждый кто скачает софт сможет им пользоваться без каких либо ключей.
Но сначала давайте проверим, используя утилиту Exeinfo PE (анализатор исполняемых файлов, динамических библиотек (Файлов формата .dll)), нет ли дополнительной защиты на исполняемом файле.
1. Имя нашего, анализируемого, исполняемого файла: WebArchiveDownloader.exe
2. Разрядность (x32 или x64): x32-Битное приложение Windows.
3. На чем написан софт \ обфускатор или пакер есть ли ?: Visual C# \ Нет, не обнаружено.
4. Советы по использованию отладчика: Но мы будем использовать, как обычно, DnSpy.
То что дополнительной защиты нет, на исполняемом файле, это еще не о чем не говорит. Как показывает практика, а доказательством того есть мои предыдущие статьи, не все так просто как кажется на первый взгляд. Ну а теперь приступим к делу и начнем с визуального осмотра принципа активации программы.
Сначала, как обычно, предлагаю ознакомится с информацией о ограничениях, в бесплатной демо-версии, на официальном сайте. В некоторых случая, полученная информация приносит пользу и экономит время. Но в нашем случае разработчик ничего не говорит о ограничениях. А просто указано что можно купить ключ (Такая информация не приносит нам пользы). И действовать в слепую будет не совсем логично, как поступить в такой ситуации ?.
Тут все очень просто, нам ничего другого не остается, давайте запустим софт и посмотрим на его работу (на каком то тестовом сайте). Скорее всего, в процессе работы программы всплывают ограничения. Так мы сможем найти зацепку, составить план действий, после приступить к модификации кода . И
уже после внесенных изменений, провести тесты, убедившись в корректности работы программы.
Я взял для теста любой сайт, к примеру по бесплатным шаблонам. Прописал его в программе и запустил программу, но в работе программы есть несколько нюансов.
А именно она работает в два этапа:
1. Сначала создает карту сайта. Своего рода список ссылок (Нажатие на кнопку "Пол. список URL-ов").
2. А уже после этого можно выбрать нужные настройки и нажать кнопку "Скачать".
И вот как раз после нажатия на кнопку "Скачать" - мы получим сообщение, в котором говорится, что демо-версия скачивает не более 20 ссылок. А это уже говорит о том что мы нашли за что зацепится.
Как совет: Такие вещи лучше сразу проверять, что бы в процесс анализа, сразу понимать зависит ли активация от сети или нет, если проще сказать. Да и в программах, что работают с сетью, в последнее время, встречаются зависимости от собственного сайта (запросы в на сайт разработчика).
- Первый: В любом случае, при запуске программы, должен проверяться и ключ активации. То есть программа должна понимать когда она зарегистрирована а когда нет. Что бы потом понимать запустить ограничения или нет.
- И второй: Если перейти в окно "О программе" то мы видим что программа, автоматически, определяет ID Системы (вычисляет параметров железа). А программа активируется только по ключу активации что подходит, только, под этот ID.
Основа у нас есть, теперь приступим к самому интересному, пройдемся по коду и посмотрим на внутренности программы. Закидываем исполняемый файл в отладчик DnSpy(x86) и сразу же переходим к точке входа (Правой кнопкой мышки и выбрать пункт меню - "Перейти к точке входа" ). И уже, по факту, будем смотреть что там за функции вызываются.
- В точке входа, происходят, на первый взгляд, не сложные вещи. А именно, сначала проверяется нет ли обновлений программы, функция CheckForUpdate. Нам это не так интересно (Но если обновления не нужны, по какой то причине то проверку можно убрать), продолжаем смотреть далее.
- Потом идет загрузка визуальных стилей, внешнего вида, это тоже нам погоды не строит. То есть это стандартные процессы для адекватного запуска программы, если сказать проще.
- А после всего этого идет очень интересный класс Protection, его инициализация (его запуск). А потом уже вызов и запуск Form1 (Собственно это стандарт, форма, окно, наша программа).
- А далее сразу же завершение, каких то (что там мы пока не знаем) манипуляций в классе Protection.
Осмелюсь предположить что: Protection используется для вызова функций что отвечают за лицензию (активацию программы). Но по факту, что там происходит мы не знаем, давайте посмотрим. Переходим в класс Protection и обращаем внимание на список функций что там вызываются. И вот тут уже картина не такая простая как кажется на первый взгляд
Скажем так, разработчик под суетился и сделал много зависимостей (функций) между собой. Собственно, даже, посмотрев на код, где вызываются все эти функции, начинающему человеку, ну просто ничего не понятно. Править то можно все что нравится, но вот будет ли тол от этого ?, вот в чем вопрос.
Это я вам гарантирую, все как бы кажется не сложным, так как мы анализируем программу вместе. А если, в первые, столкнетесь с такой кашей, то нужно хорошенько подумать, составив план действий. Мы же будем действовать аккуратно и логика действий, постепенно, будет понятна.
А вот дальше становится еще интересней и понятней, так как в окончании функции идет запрос на сервер (сайт программы, где проверяется ключ). Помните мы это проверяли в начале, используя анализатор трафика Http Analyzer.
Поскольку, я говорил, что буду показывать два варианта, лечения программы, то начнем мы с первого. Каждый способ по своему интересный, я же стараюсь демонстрировать, вам, различные манипуляции с кодом программы. Так статьи получаются более интересные, вы получаете больше информации, практикуете и усовершенствуете свой опыт.
Такие вещи не тяжело показывать и делится информацией, особенно если людям нравится, так что приступим.
Вариант 1. Более сложный, но в тоже время и красивый: Написания собственного KeyGen с множественным внесением поправок в код программы.
Тип активации: Генератор ключей будет выдавать ключ по ID Системы (Отображается в окне "О программе"). А программа будет работать только на том компьютере где ключ подходит. То есть мы будем генерировать ключи активации что железо-зависиммые (соответствуют id компьютера).
Посмотрим на окно где программа отображает (получает) Id системы. Оно называется About (как обычно по стандарту), его не сложно найти как видите. Данные туда загружаются также с класса Protection.
Так вот, я составил план как будем действовать.
1. Сначала напишем генератор ключей а после этого начнем вносить правки в программу. Сделаем так что бы она принимала ключ активации нужного, нам, формата. Тем более что в программе уже присутствует функция что получает id системы (это только нам на руку).
2. Генератор ключей будет выглядеть вот так. Я напишу его на Delphi (исходник будет прикреплен к статье). Но это только заготовка и её нужно запрограммировать. Дизайн простенький, но зато смотрится красиво.
То есть, по сути дела, что происходит и по какому принципу генерируется ключ активации.
Принцип генерации ключа таков:
- Мы вводим ID системы что показывает нам программа в окне "О программе" в KeyGen.
- Идет проверка визуального компонента с ID системы на пустоту, если id есть то продолжаем работу (Этот пункт чисто для красоты).
- Все цифры заменяются на указанные буквы и в начало ключа вставляем рекламный текст в виде: -EXE-xss.pro-
- На выходе, в моем случае Id системы: B818935FD2B4AC511 то мы получаем вот такой ключ активации: -EXE-xss.pro-BVDVXFMFDEBGACMD. Естественно если ID будет другим то и ключ изменится.
А вот теперь начинается самое интересное
Первый шаг, на пути к успеху: По факту мы укоротили код до минимума и сделали вот что:
- При вводе ключа активации, не важно какого, программа записывает введенный ключ в файл LicKey.txt
- После этого идет перезапуск и закрытие приложения.
Второй шаг, на пути к успеху: Нужно сделать что бы программа принимала такие ключи. И я предлагаю такое решения вопроса. Тут же, в классе Protection, присутствует и функция Registered. Что, в свою очередь, запускает проверку активации и инициализирует функцию IsRegistered. Так как мы, часть громадной функции отрезали (убрали кусок кода), то можем себе позволить и эту отредактировать под задуманное.
Для чего это нужно узнаете далее, все так и сразу не пояснить. Но походу дела все станет на свои места.
А именно, тут мы запрограммируем (изменим) код так что бы: программа проверяла ключ активации что мы введем из KeyGen и активировала софт, именно, по этому ключу. Как это сделать сейчас покажу а потом прокомментирую, внесенные изменения. Вот так мы переписали код.
Что тут происходит.
1. Получаем ID Системы и заносим в переменную text
2. Делаем замену цифр на буквы в переменной text.
3. Читаем файл LicKey.txt (Который мы сохранили в первом шаге, в статье). Если строки в файле совпадают с -EXE-xss.pro-" + text то программа активируется.
4. Если не совпадают значит очищаем файл LicKey.txt и программу не активируем (Сделано для порядка, что бы нерабочие ключи не записывались в файл).
5. Если возникло какое исключение, к примеру нет файла LicKey.txt вообще, то также программу не активируем.
По сути то дела, получается так: что алгоритм проверки, ключа активации, мы запрограммировали и добавили в код программы, такой же как и генерирует KeyGen.
Но это еще не все, продолжаем.
Проверять, финальный результат, будем в конце, я покажу пример на видео. А пока что продолжаем работу и чистим код что бы навести красоту, порядок и довести до идеала. Обратите внимание на что ключ активации загружается из Protection.RegKey. В том случае если программа активирована. А так как мы изменили принцип активации то: что бы наши ключи активации отображались корректно (в окне About (О программе), после активации, используя KeyGen), нужно немного подправить код.
А именно, сделаем так что ключ активации будет загружаться с, того же, файла LicKey.txt. И выглядеть все это дело, после правки, будет вот так.
Ну а теперь давайте посмотрим на процесс, активации и работы программы, в действии. Что бы убедится что мы все правильно сделали.
Посмотрите видео. WAD.wmv (Видео имеется также и в архиве).
Как видите кнопка активации пропала и программа не останавливается на 20 ссылках (демонстрация работы на тестовом сайте, на видео, выше). Программа принимает регистрационный ключ с авторством и рекламой форума. То есть ключ что начинается с -EXE-xss.pro + ключ активации. Теперь, софт будет принимать только ключи, нашего формата (как и было задумано).
Ну а теперь рассмотрим второй вариант, про который я говорил выше.
Вариант 2. Более простой, смотрится не так красиво. Это патчинг функции что отвечает за активацию программы.
В этом случае никакого генератора ключей не нужно. Мы просто изменим логику функции Registered и все, то есть было.
- Отличие метода 1 (KeyGen) от метода 2 (патчинг) в том что: Вы сможете выдавать, ключи активации, с привязкой к железу. И только те у кого параметры ID и Ключ соответствуют смогут работать с софтом. Это на случай если не хотите слить софт в сеть для всех, для народа (только выдача ключей определенным людям)
. А если все таки хотите, то метод 2 это как раз метод для народа
. Ну а в целом, причин может быть масса, я всего лишь показал что можно крутить кодом как угодно, все зависит от вашей фантазии.
- Алгоритм генерации ключа можно усложнять, упрощать, сегодня я показал один из методов. В следующих статьях будут еще примеры, за это не переживайте.
- Как видите то что разработчик напихал тонну проверочного кода, это его не спасло, при правильном подходе
. Но для новичков, разобраться в такой каше, было бы не так просто.
- В целом процент успешности, в крякинге, зависит от вашего мышления. Есть люди, которым, все это дело дается очень не просто. Совет только один - учить, практиковать, упорствовать.
Ну а теперь идем далее и приступим к исследованию еще одной программы, подобного предназначения. Но тут уже другая (интересная) ситуация, в процессе анализа я расскажу.
Разработчик \ Ссылка на официальный сайт: https://web.archive.org.ru
Версия программы: 6.0
Предназначение программы: Программа для скачивания архивов веб сайтов с интернет архива http://web.archive.org/. В программе присутствуют различные, удобные фишки в виде выбора периода парсинга, по годам. Собственно то что и в первой программе, только разработчик другой.
Защита \ Принцип активации : Активация через интернет. Часть программы работает на сервере, используя свой скрипт (обращение к скрипту), формата .php.
И сегодня, рассмотрим, еще один, интересный способ активации программы. Не смотря на то что отрезать её полностью от сервера не получится (Но лицензию мы получим
Но сначала давайте проверим, используя утилиту Exeinfo PE (анализатор исполняемых файлов, динамических библиотек (Файлов формата .dll)), нет ли дополнительной защиты на исполняемом файле.
1. Имя нашего, анализируемого, исполняемого файла: WebArchiveDownloader.exe
2. Разрядность (x32 или x64): Утилита не определила, такое иногда бывает (Но отладчик определил x32-Битное приложение Windows).
3. На чем написан софт \ Есть ли обфускатор или пакер: Visual C# \ Обнаружен обфускатор Phoenix Protector.
4. Советы по использованию отладчика: А мы использовать будем, как обычно, DnSpy.
Так как исполняемый файл программы у нас под обфускатором Phoenix Protector то мы применим деобфускатор под это дело. Для этого нужно просто перетащить исполняемый файл программы на de4dot-x64.exe и получить результат. То есть исполняемый файл в котором код приведен в читаемый вид.
Картинка ниже, подтверждение моих слов.
Причем, интересный факт того что
Сайт автора имеет адрес: web.archive.org.ru
А сайт веб-архива: web.archive.org
Я веду к тому что адреса практически идентичны, разница только в доменных зонах .org а тут .org.ru. Хороший ход, если присмотреться в анализаторе то это можно заметить. Я, не просто так, показал это на картинке.
Активация, также, происходит на стороне сервера. А при нажатии на кнопку "Активировать программу" нас, сразу же, бросает на сайт автора. И там уже открывается панель активации. Ну что поделать, давайте смотреть, выбора у нас нет
А если посмотреть по функциям в fMain то мы наткнемся на функцию что инициализирует (запускает) fSite_0.method_2 и fSite_0.method_0 по условию. Если условие не соблюдается то приложение закрывается . method_2 и там идет получение системного ключа (Id можно назвать), method_0 () проверка обновлений и подключение к своей базе данных (условно говоря). Стоит и обратить внимание что они вызываются уже с класса fSite. Но вот нам интересно посмотреть на .method_4, что же там за код.
А специально, уместил, код каждого метода на одной картинке, что бы лучше воспринималась информация.
Переходим к коду .method_4 и видим вот такую картину. Посмотрев, на код, можно смело сказать что он отвечает за активацию софта. Но не спешите радоваться
Потому что, если неправильно исправить инструкцию, то софт активируется, но в процессе работы программа не будет собирать данные. То есть просто будет делать вид что работает, скажем так, немного забегая наперед.
Сначала давайте посмотрим что мы видим. А именно, string_1 это значение с ссылкой именно на тот скрипт что работает на стороне сервера (сайта программы).
А вот string_5 = "fuckhuck" что очень оригинально и можно подумать что автор матерится
Далее, нужно обратить внимание, тут же, на smethod_0, что вызывается с Class0. Он играет ключевую роль в этой конструкции и не просто так тут прописан.
К чему я виду ?: Если исправить код method_4() вот так, то есть сделать return true. То есть при любом раскладе активация успешна.
А все потому что сам вызов Class0.smethod_0 раскидан по всему коду. А мы, только в одном месте, пропатчили софт и радуемся, думаем победа!
Ну как теперь быть и что делать ?. Так вот, если перейти в Class0.smethod_0 и поставить точку останова, в начала функции. И посмотреть, под отладчиком, что за параметры нам возвращает функция, то можно убедится что это очередная проверка. То есть суть в чем, мы то программу активировали, но программа общается с .php скриптом. И отправляет запрос сначала на сайт автора программы, там проверочки идут (взломан ли софт или нет и тому подобное). И в зависимости от того да или нет, скрипт передает параметры (часть в зашифрованном виде). Ну и отсылает нас на отдых
В процессе работы получаем данные и эти данные передает уже на сайт вебархива, с которого софт получает и сохраняет данные. Скрипт этот расположен на сайте разработчика, файл 2-parser.php (доступа, конечно же, к скрипту нет).
Для того, что бы все заработало, нам нужно почистить весь код smethod_0. В прямом смысле убрать его, да именно убрать, это не шутка
Посмотрите видео. WAD-2.wmv (Видео имеется также и в архиве).
На предыдущем видео показано только сравнение двух вариантов патчинга, правильный и неправильный. И убедились что вариант, номер два, работает как нужно. Для того что бы правильно исправить функцию нужно весь код smethod_0 изменить на return ""; Или return "и тут любое значение"; это не принципиально. А вот method_4() изменяем на return true (как и было). Сохраняем, в исполняемый файл, изменения. Запускаем программу, она активировалась. И теперь работать будет как лицензия (Без ограничений).
Посмотрите видео. WAD-3.wmv (Видео имеется также и в архиве).
Таким образом, ми получим активированную версию программы, не оплатив ни цента, но потратив немного времени
Ну и теперь подведем итоги по этой программе:
- Плюс способа патчинга, что мы применили сегодня, в том что: с минимальным вмешательством, в код, мы получили результат (Активированный софт). Конечно же полностью отвязать софт от сервера не удалось, так как имеется и серверная часть (скрипт php) что взаимодействует с работой программы. Но на работоспособность это никак не повлияло.
- А если бы мы пошли другим путем, выпиливая все проверки из кода, то времени ушло бы больше а результат был бы тот же.
Ну и несколько слов, скажу, что касается сравнения работы этих двух софтов:
Так как, работа первой программы, не связана с серверной частью то работает она быстрее второй программы, намного. Еще плюсом, первого софта, является много- -поточность и больше настроек. Если выбирать между первой и второй программой то победитель тут первая.
Мое же дело заключалось в: разборе защиты, этих программ. Всем хорошего настроения, на сегодня у меня все, надеюсь и эта статья понравилась ? 
В архиве, скриншот:
Инсталляторы программ:
WebArchive Downloader v1.5.0 / virustotal: https://www.virustotal.com/gui/file/d032e3ac27ba39a16142e2737697ac797bd10b95f837951843f279e0dec0b497
Web Archive Downloader 6.0 / virustotal: https://www.virustotal.com/gui/file/84fd30a8ac18f2c6f9191e32b8c39ed12ea1df4800ded7c58237dc58f6bc3794
Инструменты для анализа:
HttpAnalyzer / virustotal: https://www.virustotal.com/gui/file/f25541dee8f859b62c642d2e6e835c247900b5bc94a00cdbc4d894bab83796dd
dnSpy x32 / virustotal: https://www.virustotal.com/gui/file/7ce05f1aafaaa87d046bbad1b07801777e724251b084bc7f70cef71c98b08105
dnSpy x64 / virustotal:
ExeinfoPe / virustotal: https://www.virustotal.com/gui/file/32e6df44a529d3bd543aae01365852990c0e7f3b4f84b5a7f9d7dfc18d6a46fd
de4dot-x64.exe (de_Phoenix) / virustotal: https://www.virustotal.com/gui/file/c8732060e43014c23c2cda9632c62ad831d45406af55f7fd7a35eeb8ddf917b0
Дополнительно:
KeyGen (В скомпилированном виде + исходники) для Web Archive Downloader 1.5.0 / virustotal:
Файлы к статье:
В архиве, скриншот:
Инсталляторы программ:
WebArchive Downloader v1.5.0 / virustotal: https://www.virustotal.com/gui/file/d032e3ac27ba39a16142e2737697ac797bd10b95f837951843f279e0dec0b497
Web Archive Downloader 6.0 / virustotal: https://www.virustotal.com/gui/file/84fd30a8ac18f2c6f9191e32b8c39ed12ea1df4800ded7c58237dc58f6bc3794
Инструменты для анализа:
HttpAnalyzer / virustotal: https://www.virustotal.com/gui/file/f25541dee8f859b62c642d2e6e835c247900b5bc94a00cdbc4d894bab83796dd
dnSpy x32 / virustotal: https://www.virustotal.com/gui/file/7ce05f1aafaaa87d046bbad1b07801777e724251b084bc7f70cef71c98b08105
dnSpy x64 / virustotal:
de4dot-x64.exe (de_Phoenix) / virustotal: https://www.virustotal.com/gui/file/c8732060e43014c23c2cda9632c62ad831d45406af55f7fd7a35eeb8ddf917b0
Дополнительно:
KeyGen (В скомпилированном виде + исходники) для Web Archive Downloader 1.5.0 / virustotal:
Файлы к статье:
Скрытый контент для зарегистрированных пользователей.