И сегодня будем анализировать защиту коммерческой программы, под названием Algorius Net Viewer, официальный сайт algorius.ru. Программа является удобным инструментом для администрирования, визуализации и мониторинга компьютерных сетей любого уровня. Все возможности программы перечислять нет смысла, на официальном сайте имеется, вся, необходимая информация. У нас другая цель - разобрать алгоритм защиты программы и активировать её, если есть возможность то и сделать keygen.
После установки программы, я обратил внимание на то что в папке с установленной программой имеются 4 файла (NetViewer.exe, NetViewerServerSetup.exe, NetViewerServer.exe и InventoryAgent.exe). Читая документацию с официального сайта становится понятно что работа программы, основного исполняемого файла имеет и web сервер (web клиент). На это обращаю ваше внимание, ну и можно смело предположить что эти файлы взаимосвязаны между собой, обычно в программах такого типа это стандарт.
Так как мы анализируем программу, ничего не зная о ограничениях, то обязательно нужно посмотреть на официальном сайте что говорит нам разработчик. Если конечно жеинформация (по ограничениям) предоставлена в открытом виде. Переходим и смотрим что у нас есть три типа лицензии: Бесплатная, Годовая и Бессрочная. И в каждом из типов лицензий есть возможность разблокировать больше параметров. Понятно что в бесплатной версии у нас ограничения по хостам мониторинга, карточек инвентаризации, устройств, карт сети и доступность к отчету. А вот годовая и бессрочная лицензии отличаются по цене в зависимости от выбранных вами параметров. Цены конечно же космические (на максимальные параметры), тут разработчик не стесняется, коммерческий софт все таки
Предоставленную информацию, выше, я не просто так показал (на это обязательно стоит обратить внимание). Теперь мы знаем от чего отталкиваться и можно запустить бесплатную версию и взглянуть как происходит активация и что для этого нужно. Почитав немного документацию к программе становится понятно что исполняемый файл NetViewer.exe производит различные настройки, визуализацию. NetViewerServerSetup.exe производит настройку, конфигурацию нашего сервера. Ну и NetViewerServer.exe запускает наш web интерфейс в браузере через localhost. InventoryAgent.exe отвечает за инвентаризацию (только настройка).
Анализируем исполняемые файлы утилитой Exeinfo PE (анализатор исполняемых файлов) что бы узнать есть ли дополнительная защита в виде обфускации или упаковки на файлах. Из получаемой информацию, по трем файлам, становится понятно что их пропустили через обфускатор, говоря простыми словами.
- Из нюансов, такое иногда бывает, утилита неправильно определила разрядность исполняемых файлов. Так как установка программы была в C:\ProgramFiles\Algorius\NetViewer\ что это 64 разрядное (64-битное) приложение Windows. Кстати, через отладчик DnSpy, тоже можно проверить разрядность, если вы запустите 64 - битное приложение в DnSpy x32 то вам высветится соответствующее сообщение, с предупреждением.
- А вот язык программирования, на чем написана программа: MS Visual C#.
- Ну и полезная рекомендация использовать de4dot v3.1 для того что бы привести код исполняемого файла в читаемый вид.
Разобрались, начальная подготовка завершена. И теперь запустим NetViewer.exe и посмотрим по какому принципу активируется программа, какие сообщения при неверном ключе выдает и так далее. Запускаем, заходим в меню Справка - Менеджер лицензия, после чего у нас запускается окно менеджер лицензий, нажимаем на кнопку активировать лицензию.
Ну и в этом окне у нас отображается статус текущей лицензии. Становится заметно и режут глаза ограничения бесплатной лицензии, ну спасибо хотя за это
Кстати почему именно к точке входа, потому что я показываю как анализировать программу поэтапно, не прибегая к методам поиска, в основном. А в конце статьи подытожу, и покажу еще несколько приемов поиска. А то что я сейчас показываю является более расширенным и правильным способом при анализе. Таким способом вы практикуете и быстрее учитесь а не просто ищете регистрационный диалог, используя поиск. Ну это думаю и так понятно, идем далее.
В точке входа, в самом низу, происходит инициализация главной формы программы. Кликаем (левой кнопки мыши) по method_0 и переходим внутрь.
Как Вы уже заметили код после деобфускации кажется не очень понятный
Давайте поищем что нибудь связанное с лицензированием, к примеру слово License по всему коду MainForm. Совершенно понятно, что встречается, искомое слово будет не в одном месте. Тут смысл в том что бы найти за что зацепится а уже после этого будем разбирать логику кода. Кликаем по LicenseManagerForm, тут уже 100% нам становится понятно что тут происходят, какие то, манипуляции с кодом, собственно с активацией программы.
По коду становится понятно что функция тут не одна и все между собой взаимосвязано, что логично. Ну и теперь останется подумать как действовать ? Тут главное не спешить а проанализировать принцип действия алгоритма активации. Но вот какой подход подобрать и с чего начать ?.
Что я предлагаю сделать, как мы уже видим (интуитивно) что btActivate_Click это наша кнопка активации. То есть после ввода ключа в форму активации программы, мы нажимаем на неё и она производит действия, манипуляции над введенным данными. Что нам мешает поставить точку останова в начале функции и посмотреть как она отработает. Так и сделаем, ограничений никаких нет.
Советую, обязательно, смотреть все картинки прикрепленные к теме, потому как там показан полный алгоритм действий. Так Вам будет понятно какие манипуляции мы делаем. Пример на Gif-3.
Gif-3 анимацию на Mega: https://mega.nz/file/UWM2wTKA#6mQ3cd0463sRAmqF7H4bjfHugAEmkwebHXU_kvYU_A0
Ну и теперь я прокомментирую что за события у нас произошли после того как функция отработала. А именно при вводе регистрационных данных, естественно неверных, так как мы даже не знаем формат ключа - программа выдала нам исключение. То есть что "входные данные не являются действительной строкой от Base64". Значит, как минимум, мы можем предположить что формат ключа должен содержать алгоритм Base64.
И на Gif-3 анимации мы видели что если исключение возникает то method_4 возвращает нам False то есть запрет. То есть уже есть еще одна зацепка и давайте перейдем к method_4 и там посмотрим на код.
А тут вызывается еще и method_5 и ethod_7 причем с флагом False, то есть запрет. Ну и теперь нам нужно понять что за что отвечает. Именно, в этом месте, у нас два пути решения проблемы, то есть активации программы. Код в method_5 и ethod_7 не трогаем, в чем суть покажу и расскажу в конце статьи (Метод топора и молота
Немного ниже, опустившись по коду, у нас красуется вот такой код. Как вы думаете что это такое ? Именно так, правильно мыслите
данные из которых у нас состоит ключ активации.
А если быть поточнее то опишем
- Имя продукта, название программы
- Имя пользователя на которого будет зарегистрирован ключ активации
- Количество лицензий
- Количество ограничений, на карточки, устройства, карты, хосты,
- Тип лицензии
- Дата покупки, начала лицензии
- Дата окончания лицензии
Один, из не маловажных моментов, мы выяснили. Ну и теперь остается понять как эти данные формируются в ключ и где идет проверка ключа. Ну и самый главный нюанс это как зарегистрировать программу. Тут же в Class225 именно smethod_3 нам подсказывает что ключ у нас формируется в одну строку поочередно и разделитель между данными знак |. И в конечном итоге строка переводится в алгоритм Base64. Кстати нам, при неправильном ключе, программа тоже на это намекала. Но в данном случае тут идет считывания информации.
А теперь посмотрим на код smethod_4 что также расположен в Class225 именно тут происходит все волшебство, то есть проверка ключа активации. Ну это не сложно проверить, анализируя программу.
Для начала давайте же напишем KeyGen для программы и после продолжим. Я думаю под такой софт очень будет интересно вариант написания генератора лицензий.
KeyGen я не просто так решал сделать а что бы показать вам принцип взаимодействий функций, проверки ключа активации. Вот на этот момент обратите особое внимание.
Я не дизайнер и генератор лицензий у нас будет выглядеть как есть. Исходный код я прикреплю к статье, сможете под себя отредактировать. Тут смысл в том что бы показать, вам, по какому принципу программа считает верными сгенерированные данные. Ну и его я напишу на Delphi, тут уже кому как удобно (исходник будет прикреплен к файлам статьи). А в целом не имеет значения на чем Вы пишите генератор, главное понимать что вы делаете. Все это дело будет выглядеть вот так.
Пояснения к KeyGen
- function EncodeBase64 - функция преобразования Строки в Base64.
- function StrToHex - Функция преобразования стркоа в hex.
- Final_Key.Text - визуальный компонент в который складывается ключ что состоит из 7 частей Key[...].text.
- StrBase64.Text - визуальный компонент в который через функцию EncodeBase64 кодируется значение(Final_Key.Text);
- StrHex.Text - визуальный компонент в который через функцию StrToHex кодируется (Final_Key.Text);
Последний, пункт 5 - я добавил специально в программу, далее вы поймете почему. Информации много, главное тут не спешить и вникать в суть дела и все станет понятно. Я же стараюсь все до мелочей разжевать, как видите, очень надеюсь что понятно рассказываю.
А теперь давайте вернемся к smethod_4, поставим точку останова в начало функции и запустим программу под отладчиком. После этого сгенерируем ключ активации, вставим в окно активации и попробуем активировать программу. Нажимаем старт, и после F10 в пошаговом режиме, проходим до конца функции и смотрим что она нам вернула, как отреагировала на введенные в неё данные.
Gif-4 анимацию на Mega:
mega.nz
При вводе данных активации из KeyGen мы все равно получили исключение в виде Incorrect key format. Этого и стояло ожидать, поскольку логика принятия ключа, пока что, у программы немного другая.
6.29 MB file on MEGA
Как мы увидели что значение нашего ключа конвертируется в byte_1. А что нам мешает, немного, изменить логику активации, проверки ключа. Ровным счетом ничего
А именно:
1. Изменить return Encoding.UTF8.GetString(array3)
2. На return Encoding.UTF8.GetString(byte_1)
Нажимаем правой кнопкой мыши и выбираем в меню изменить метод. И после нажимаем кнопку компилировать, что бы изменения вступили в силу.
В итоге, наша функция активации, немного
Аналогично ставим теперь точку останова в начало функции, генерируем ключ, вставляем в окно активации и смотрим на реакцию программы. Пример на Gif-5.
Gif-5 анимацию на Mega: https://mega.nz/file/US9V0AqT#H2ITfPw4ZjbHzGRxllSgUZXYMrzSlVRgInjua4B8hic
Ну и теперь, что бы уже наверняка, то запустим программу без отладчика и еще раз введем ключ активации, сгенерированный нашим KeyGen. Как видим программа успешно приняла ключ активации. Никаких ошибок и намеков на некорректную работу.
Желаемого результата мы достигли. Кстати о типах лицензии, хотите вообще коммерческую лицензию, да не вопрос. Запускаете KeyGen, там где ограничения ставим 0, там где тип 11. Ну и на усмотрение изменяем дату на нужную вам. В итоге у вас полноценный KeyGen. Тут суть вся в том что разработчик программы, в алгоритм активации, встроил различные типы лицензии. И в зависимости от параметров активируется определенный тип лицензии. Кстати генератор ключей я сделал для удобства и что бы показать сам принцип активации, а в принципе, это все, можно было сделать в ручную.
Проверяем на ограничения, в бесплатной версии, как вы видели выше, программа дает добавить не более 25 устройств на одной карте. Я легко добавил 153 и это не предел.
И можно сказать победа. Но и это еще не все, так как это мы наставили на путь истинный только NetViewer.exe. А остальные программы от которых он зависим так и не активированы.
Ну а теперь давайте же запустим исполняемый файл NetViewerServerSetup.exe и посмотрим по какому принципу в нем активируется лицензия. При, запуске конечно же, нам дает понять программа что она не активирована и нужен ключик. Сама активация происходит уже на этапе конфигурирования сервера. Если наивно попытаться ввести с keyGen ключ активации то программа конечно же скажет нам - что формат ключа не подходит. Где то мы уже такое видели ?
То есть я намекаю на то что, скорее всего, принцип активации серверной части такой же как и у предыдущей программы. Ну давайте это проверим и что бы не томить Вас покажу еще один способ поиска зависимостей активации. Но так можно действовать тогда - когда разобрали алгоритм активации программы.
Как видим конструкция стандартная, как и в предыдущей программе, method_4 в котором происходит проверка ключа, математические вычисления. А если какое происходит исключение то нам говорят что ключ не верный.
Можно даже в этом убедится, зарегистрировав программу под отладчиком (поставив точку останова в начало функции), то есть собственно то что я и говорил.
Сохраняем изменения и давайте попробуем активировать программу - используй наш KeyGen.
Ну что сказать, красота, программа приняла сгенерированные данные активации, и этот софт мы успешно победили.
А теперь осталось победить еще файл NetViewerServer.exe что непосредственно отвечает за активацию web-панели. Как это сделать и на какие особенности нужно обратить внимание, сейчас покажу.
Так вот, когда мы уже сконфигурировали настройки сервера и запустили то в логе отображается что он у нас запущен с бесплатной лицензией. То есть, где то, в нашем файле расположена проверка ключа активации. Если этот момент проигнорировать то получится что: два, из трех, файла работают под лицензией а третий в бесплатном режиме. Сами понимаете что тогда будет, идем далее.
После этого переходим на method_4 и там также правим array3 на byte_1. То есть таким способом мы заставим веб часть чувствовать себя полноценной, зарегистрированной версией и принимать сгенерированные ключи.
После внесения изменений в исполняемый файл, сохраняем результат и смотрим что у нас получилось в итоге.
А вот, чисто как бонус, дополнение к статьи. Метод топора и молота
В основном, подходит для тех кто ищет более простые пути. Можно сказать так, если алгоритм генерации не очень важен и нужна только активация, без красоты, то 100% то что Вам нужно.
1. В программе NetViewer.exe
Ищем btActivate_Click и переходим в method_4. Нажимаем правой кнопкой мышки и выбираем изменить IL инструкцию. И меняем, в двух местах, ldc.i4.0 на ldc.i4.1 (тем самым разблокировав все до комерческой лицензии). А в method_6 изменяем return 0 на Return 80, к примеру (тем самым добавляя себе количество дней к лицензии). Минус при таком подходе в том что лицензионные данные не будут корректно отображаться. И если довести до идеала то нужно будет не в одном месте делать правки. Но чисто для общего познания показал.
Результат после правок будет вот такой. не так красиво смотрится как в случае с генератором лицензий.
2. В программе NetViewerServerSetup.exe правим тоже самое.
Ну и в финале правки в файле NetViewerServer.exe аналогичны.
Результат после таких правок тоже отличается и выглядит не так красиво. Но каждый из Вас выбирает способ крякинга сам.
Подытожим предоставленную информацию
- Обычно, лучше всего разобрать алгоритм и сделать все правильно. Но тут уже кому как удобно, главное внимательно все изучить. И все зависит от времени и желания.
- Сегодня мы рассмотрели крякинг не такой уж и простой программы (для начинающих), в состав которой входило 3 исполняемых файла. В этом деле бывают разные нюансы, если где то сделали ошибку, возвращаетесь и снова анализируете.
- Бывают ситуации что проще пропатчить в одном месте и все, а есть случаи что лучше сгенерировать ключ и работы меньше. С своей стороны пытался пояснить проще некуда
, я человек простой, надеюсь статья Вам понравится.
В архиве, скриншот:
Наш пациент (Установщик с оф. сайта) / virustotal:
Инструменты:
dnSpy x32 / virustotal:
dnSpy x64 / virustotal:
ExeinfoPe / virustotal: https://www.virustotal.com/gui/file/32e6df44a529d3bd543aae01365852990c0e7f3b4f84b5a7f9d7dfc18d6a46fd
KeyGen / Project.exe / virustotal: https://www.virustotal.com/gui/file/74ac7bfd26b79f8c299a8b7602345dd76a8b3050abcf57ea4799336778f7fd87
de4dot x32 / virustotal: https://www.virustotal.com/gui/file/1ef4d880b16efb49271463e1b9c0de68e637320c1be40f1e7f1603538f3e289d
de4dot x64 / virustotal: https://www.virustotal.com/gui/file/89582c764c5cdeb58656a60f8419fdcd8c5eb6caa2e5f332d2658e89555693cb
Файлы к статье:
mega.nz
Наш пациент (Установщик с оф. сайта) / virustotal:
Инструменты:
dnSpy x32 / virustotal:
KeyGen / Project.exe / virustotal: https://www.virustotal.com/gui/file/74ac7bfd26b79f8c299a8b7602345dd76a8b3050abcf57ea4799336778f7fd87
de4dot x32 / virustotal: https://www.virustotal.com/gui/file/1ef4d880b16efb49271463e1b9c0de68e637320c1be40f1e7f1603538f3e289d
de4dot x64 / virustotal: https://www.virustotal.com/gui/file/89582c764c5cdeb58656a60f8419fdcd8c5eb6caa2e5f332d2658e89555693cb
Файлы к статье:
Скрытый контент для зарегистрированных пользователей.
