• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Реверс-инжиниринг для начинающих [Часть 7 \ -EXE-]

-EXE-

RAID-массив
Пользователь
Регистрация
07.08.2022
Сообщения
55
Реакции
349
Logo-7.png

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

И сегодня будем анализировать защиту коммерческой программы, под названием Algorius Net Viewer, официальный сайт algorius.ru. Программа является удобным инструментом для администрирования, визуализации и мониторинга компьютерных сетей любого уровня. Все возможности программы перечислять нет смысла, на официальном сайте имеется, вся, необходимая информация. У нас другая цель - разобрать алгоритм защиты программы и активировать её, если есть возможность то и сделать keygen.

anv-1.jpg

Немного забегая на перед скажу: в нашем случае будет не все так просто, главное правильно разобрать алгоритм активации программы. И первое что мы сделаем скачаем, установим программу и посмотрим не защищен ли исполняемый файл, нашей программы, обфускатором или каким-нибудь упаковщиком.

После установки программы, я обратил внимание на то что в папке с установленной программой имеются 4 файла (NetViewer.exe, NetViewerServerSetup.exe, NetViewerServer.exe и InventoryAgent.exe). Читая документацию с официального сайта становится понятно что работа программы, основного исполняемого файла имеет и web сервер (web клиент). На это обращаю ваше внимание, ну и можно смело предположить что эти файлы взаимосвязаны между собой, обычно в программах такого типа это стандарт.

anv-2.jpg


Так как мы анализируем программу, ничего не зная о ограничениях, то обязательно нужно посмотреть на официальном сайте что говорит нам разработчик. Если конечно жеинформация (по ограничениям) предоставлена в открытом виде. Переходим и смотрим что у нас есть три типа лицензии: Бесплатная, Годовая и Бессрочная. И в каждом из типов лицензий есть возможность разблокировать больше параметров. Понятно что в бесплатной версии у нас ограничения по хостам мониторинга, карточек инвентаризации, устройств, карт сети и доступность к отчету. А вот годовая и бессрочная лицензии отличаются по цене в зависимости от выбранных вами параметров. Цены конечно же космические (на максимальные параметры), тут разработчик не стесняется, коммерческий софт все таки :D .

anv-3.jpg

Предоставленную информацию, выше, я не просто так показал (на это обязательно стоит обратить внимание). Теперь мы знаем от чего отталкиваться и можно запустить бесплатную версию и взглянуть как происходит активация и что для этого нужно. Почитав немного документацию к программе становится понятно что исполняемый файл NetViewer.exe производит различные настройки, визуализацию. NetViewerServerSetup.exe производит настройку, конфигурацию нашего сервера. Ну и NetViewerServer.exe запускает наш web интерфейс в браузере через localhost. InventoryAgent.exe отвечает за инвентаризацию (только настройка).

Анализируем исполняемые файлы утилитой Exeinfo PE (анализатор исполняемых файлов) что бы узнать есть ли дополнительная защита в виде обфускации или упаковки на файлах. Из получаемой информацию, по трем файлам, становится понятно что их пропустили через обфускатор, говоря простыми словами. o_O

  1. Из нюансов, такое иногда бывает, утилита неправильно определила разрядность исполняемых файлов. Так как установка программы была в C:\ProgramFiles\Algorius\NetViewer\ что это 64 разрядное (64-битное) приложение Windows. Кстати, через отладчик DnSpy, тоже можно проверить разрядность, если вы запустите 64 - битное приложение в DnSpy x32 то вам высветится соответствующее сообщение, с предупреждением.
  2. А вот язык программирования, на чем написана программа: MS Visual C#.
  3. Ну и полезная рекомендация использовать de4dot v3.1 для того что бы привести код исполняемого файла в читаемый вид.

anv-4.jpg


Разобрались, начальная подготовка завершена. И теперь запустим NetViewer.exe и посмотрим по какому принципу активируется программа, какие сообщения при неверном ключе выдает и так далее. Запускаем, заходим в меню Справка - Менеджер лицензия, после чего у нас запускается окно менеджер лицензий, нажимаем на кнопку активировать лицензию.

anv-5.jpg


Ну и в этом окне у нас отображается статус текущей лицензии. Становится заметно и режут глаза ограничения бесплатной лицензии, ну спасибо хотя за это :). Давайте создадим проект и посмотрим как сработает ограничения. К примеру создадим новую карту и добавим туда больше 25 устройств (больше лимита бесплатной лицензии). Заходим в меню Файл -> Создать -> Новая карта, создали карту. И после добавим на нее, к примеру, 30 устройств. И посмотрим как отреагирует программа. В итоге все это выглядит вот так, пример на Gif-1 анимации.

Gif-1.gif

И этот момент я показал не просто так, поскольку мы будет анализировать программу и нам нужно будет, как минимум, понять принцип действия алгоритма ограничений. Рассмотрели один из видов ограничений. А теперь давайте попробуем ввести специально какой-нибудь, придуманный, ключ активации и посмотрим как отреагирует программа на наши действия. Пример на Gif-2.

Gif-2.gif

И вот тут обратите внимание на то что: при вводе, в моем случае, в виде ключа -EXE-xss.pro, программа выдала сообщение "Что входные данные не являются действительной строкой от Base64". И так, основу для помощи в анализе мы выяснили и теперь можно переходить к практике. Но сначала очистим файлы от обфускатора. В этом деле нам поможем, как мы выяснили выше, de4dot 3.1.4 (утилита для деобфускации кода). Перетащить файлы на de4dot-x64.exe и в результате мы получим уже очищенные исполняемые файлы (с приставкой -cleaned), с более менее читаемым кодом.

anv-6.jpg

Далее нужно удалить оригиналы файла, а те что с приставкой -cleaned нужно переименовать, убрав её. Это все для того что бы ничего не напутать, имена очищенных файлов не должны отличаться от оригиналов (особенно в нашем случае). Все это за того что программа состоит из 4-рех, взаимосвязанных между собой, файлов. И если имя, одного из них, будет отличаться то при запуске сервера с основного файла программы - возникнет ошибка, уведомление что файл не найден.. Для кого это и не новость, а я уверен что найдутся и такие юзеры кто этого не знает. В итоге у Вас должно получится вот так:

anv-7.jpg
Ну и теперь начинаем анализировать файлы по очереди, для начала откроем, в отладчике DnSpy, файл NetViewer.exe, так как он является основным. То есть в нем производятся все изначальные настройки, что с точки зрения логики понятно. Кликаем по нему правой кнопкой мышки и переходим сразу же к точке входа.

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


anv-8.jpg


В точке входа, в самом низу, происходит инициализация главной формы программы. Кликаем (левой кнопки мыши) по method_0 и переходим внутрь.

anv-9.jpg

Как Вы уже заметили код после деобфускации кажется не очень понятный :). В этом плане все зависит от ситуации, но основном, на выходе, мы получаем функции и методы в виде Class1..... и method_...и.. Причем название могут совпадать (в разных классах), при поиске, так как деобфускатор способен, в основном, только так восстановить код. Конечно же новичкам будет сложнее читать его, но со временем все поправимо. Но не спешите опускать руки, мы тут все делаем не наугад а выходя из составленного плана (логики).

anv-10.jpg

Давайте поищем что нибудь связанное с лицензированием, к примеру слово License по всему коду MainForm. Совершенно понятно, что встречается, искомое слово будет не в одном месте. Тут смысл в том что бы найти за что зацепится а уже после этого будем разбирать логику кода. Кликаем по LicenseManagerForm, тут уже 100% нам становится понятно что тут происходят, какие то, манипуляции с кодом, собственно с активацией программы.

anv-11.jpg


По коду становится понятно что функция тут не одна и все между собой взаимосвязано, что логично. Ну и теперь останется подумать как действовать ? Тут главное не спешить а проанализировать принцип действия алгоритма активации. Но вот какой подход подобрать и с чего начать ?.

anv-12.jpg


Что я предлагаю сделать, как мы уже видим (интуитивно) что btActivate_Click это наша кнопка активации. То есть после ввода ключа в форму активации программы, мы нажимаем на неё и она производит действия, манипуляции над введенным данными. Что нам мешает поставить точку останова в начале функции и посмотреть как она отработает. Так и сделаем, ограничений никаких нет.

anv-13.jpg

Советую, обязательно, смотреть все картинки прикрепленные к теме, потому как там показан полный алгоритм действий. Так Вам будет понятно какие манипуляции мы делаем. Пример на Gif-3.


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

И на Gif-3 анимации мы видели что если исключение возникает то method_4 возвращает нам False то есть запрет. То есть уже есть еще одна зацепка и давайте перейдем к method_4 и там посмотрим на код.

anv-14.jpg


А тут вызывается еще и method_5 и ethod_7 причем с флагом False, то есть запрет. Ну и теперь нам нужно понять что за что отвечает. Именно, в этом месте, у нас два пути решения проблемы, то есть активации программы. Код в method_5 и ethod_7 не трогаем, в чем суть покажу и расскажу в конце статьи (Метод топора и молота :D).

anv-15.jpg


Немного ниже, опустившись по коду, у нас красуется вот такой код. Как вы думаете что это такое ? Именно так, правильно мыслите :). Если кто еще не понял то это
данные из которых у нас состоит ключ активации.

А если быть поточнее то опишем
  1. Имя продукта, название программы
  2. Имя пользователя на которого будет зарегистрирован ключ активации
  3. Количество лицензий
  4. Количество ограничений, на карточки, устройства, карты, хосты,
  5. Тип лицензии
  6. Дата покупки, начала лицензии
  7. Дата окончания лицензии
anv-16.jpg


Один, из не маловажных моментов, мы выяснили. Ну и теперь остается понять как эти данные формируются в ключ и где идет проверка ключа. Ну и самый главный нюанс это как зарегистрировать программу. Тут же в Class225 именно smethod_3 нам подсказывает что ключ у нас формируется в одну строку поочередно и разделитель между данными знак |. И в конечном итоге строка переводится в алгоритм Base64. Кстати нам, при неправильном ключе, программа тоже на это намекала. Но в данном случае тут идет считывания информации.

anv-17.jpg


А теперь посмотрим на код smethod_4 что также расположен в Class225 именно тут происходит все волшебство, то есть проверка ключа активации. Ну это не сложно проверить, анализируя программу.

anv-18.jpg


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

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

anv-19.jpg

Пояснения к KeyGen
  1. function EncodeBase64 - функция преобразования Строки в Base64.
  2. function StrToHex - Функция преобразования стркоа в hex.
  3. Final_Key.Text - визуальный компонент в который складывается ключ что состоит из 7 частей Key[...].text.
  4. StrBase64.Text - визуальный компонент в который через функцию EncodeBase64 кодируется значение(Final_Key.Text);
  5. StrHex.Text - визуальный компонент в который через функцию StrToHex кодируется (Final_Key.Text);

Последний, пункт 5 - я добавил специально в программу, далее вы поймете почему. Информации много, главное тут не спешить и вникать в суть дела и все станет понятно. Я же стараюсь все до мелочей разжевать, как видите, очень надеюсь что понятно рассказываю. ;)

anv-20.jpg

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

anv-21.jpg


Gif-4 анимацию на Mega:
При вводе данных активации из KeyGen мы все равно получили исключение в виде Incorrect key format. Этого и стояло ожидать, поскольку логика принятия ключа, пока что, у программы немного другая. ;) То есть в smethod_4 происходит различные вычисления. А именно преобразование строки, представляющую двоичные данные в виде цифр в кодировке Base64 (class229_1.string_1). И уже в цикле For происходят математические операции и сравнения массива байтов, магия одним словом. После чего результат выводится именно в return Encoding.UTF8.GetString(array3); Ну и на основе полученных данных далее строка проверяется (по принципу шифрование) и если исключений нет то программа зарегистрируется.

anv-22.jpg


anv-23.jpg


anv-24.jpg


Как мы увидели что значение нашего ключа конвертируется в byte_1. А что нам мешает, немного, изменить логику активации, проверки ключа. Ровным счетом ничего ;).

А именно:
1. Изменить return Encoding.UTF8.GetString(array3)
2. На return Encoding.UTF8.GetString(byte_1)

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

anv-25.jpg


В итоге, наша функция активации, немного ;), изменила принцип проверки ключа, ну в общем не значительно. А теперь пробуем то же самое, то есть активировать программу уже с измененной функцией и нашим генератором лицензий.

anv-26.jpg


Аналогично ставим теперь точку останова в начало функции, генерируем ключ, вставляем в окно активации и смотрим на реакцию программы. Пример на Gif-5.

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

anv-27.jpg


Желаемого результата мы достигли. Кстати о типах лицензии, хотите вообще коммерческую лицензию, да не вопрос. Запускаете KeyGen, там где ограничения ставим 0, там где тип 11. Ну и на усмотрение изменяем дату на нужную вам. В итоге у вас полноценный KeyGen. Тут суть вся в том что разработчик программы, в алгоритм активации, встроил различные типы лицензии. И в зависимости от параметров активируется определенный тип лицензии. Кстати генератор ключей я сделал для удобства и что бы показать сам принцип активации, а в принципе, это все, можно было сделать в ручную.

anv-28.jpg


Проверяем на ограничения, в бесплатной версии, как вы видели выше, программа дает добавить не более 25 устройств на одной карте. Я легко добавил 153 и это не предел. ;)

anv-29.jpg


И можно сказать победа. Но и это еще не все, так как это мы наставили на путь истинный только NetViewer.exe. А остальные программы от которых он зависим так и не активированы.

Ну а теперь давайте же запустим исполняемый файл NetViewerServerSetup.exe и посмотрим по какому принципу в нем активируется лицензия. При, запуске конечно же, нам дает понять программа что она не активирована и нужен ключик. Сама активация происходит уже на этапе конфигурирования сервера. Если наивно попытаться ввести с keyGen ключ активации то программа конечно же скажет нам - что формат ключа не подходит. Где то мы уже такое видели ? ;).

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

anv-30.jpg


anv-31.jpg

Из предыдущего анализа, мы уже знаем что кнопка активации, у нас называлась btActivate_Click. Вот давайте и её поищем, решение в лоб ;). Ну и сразу определим такой алгоритм активации или что то изменилось. Закидываем программу в отладчик DnSpy (x64) и ищем btActivate_Click. В итоге успех, мы нашли кнопку активации а тамуже не далеко и до разбора алгоритма.

Как видим конструкция стандартная, как и в предыдущей программе, method_4 в котором происходит проверка ключа, математические вычисления. А если какое происходит исключение то нам говорят что ключ не верный.
anv-32.jpg

Можно даже в этом убедится, зарегистрировав программу под отладчиком (поставив точку останова в начало функции), то есть собственно то что я и говорил.

anv-33.jpg

Как действуем, все очень просто, переходим в method_4 и по всему коду Class64 находим smethod_4. Ну и что делаем ?, совершенно верно изменяем array3 на byte_1.
Сохраняем изменения и давайте попробуем активировать программу - используй наш KeyGen.

anv-34.jpg


anv-35.jpg


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

А теперь осталось победить еще файл NetViewerServer.exe что непосредственно отвечает за активацию web-панели. Как это сделать и на какие особенности нужно обратить внимание, сейчас покажу.

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

anv-36.jpg

Для того что бы это исправить закидываем последний файл NetViewerServer.exe и ищем в нем method_4 что находится в Class65. Тут такая же конструкция активации, поэтому действуем также как из предыдущими примерами.

После этого переходим на method_4 и там также правим array3 на byte_1. То есть таким способом мы заставим веб часть чувствовать себя полноценной, зарегистрированной версией и принимать сгенерированные ключи.

anv-37.jpg


anv-38.jpg

После внесения изменений в исполняемый файл, сохраняем результат и смотрим что у нас получилось в итоге.

anv-39.jpg

Программа активировалась на нужные нам данные, сгенерированные нами. Теперь у нас на руках, 100% рабочий, комплект из трех исполняемых файлов что взаимосвязаны между собой. И теперь, при смене лицензии в основное панели, то есть в NetViewer.exe, эту же лицензию подхватят и остальные, исполняемые файлы программы.

А вот, чисто как бонус, дополнение к статьи. Метод топора и молота :cool: про который я говорил в начале статьи.
В основном, подходит для тех кто ищет более простые пути. Можно сказать так, если алгоритм генерации не очень важен и нужна только активация, без красоты, то 100% то что Вам нужно.

1. В программе NetViewer.exe
Ищем btActivate_Click и переходим в method_4. Нажимаем правой кнопкой мышки и выбираем изменить IL инструкцию. И меняем, в двух местах, ldc.i4.0 на ldc.i4.1 (тем самым разблокировав все до комерческой лицензии). А в method_6 изменяем return 0 на Return 80, к примеру (тем самым добавляя себе количество дней к лицензии). Минус при таком подходе в том что лицензионные данные не будут корректно отображаться. И если довести до идеала то нужно будет не в одном месте делать правки. Но чисто для общего познания показал.

anv-40.jpg


anv-41.jpg


Результат после правок будет вот такой. не так красиво смотрится как в случае с генератором лицензий.

anv-42.jpg


2. В программе NetViewerServerSetup.exe правим тоже самое.

anv-43.jpg


Ну и в финале правки в файле NetViewerServer.exe аналогичны.

anv-44.jpg


Результат после таких правок тоже отличается и выглядит не так красиво. Но каждый из Вас выбирает способ крякинга сам.

anv-45.jpg

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

reestrr.jpg



Подытожим предоставленную информацию
  1. Обычно, лучше всего разобрать алгоритм и сделать все правильно. Но тут уже кому как удобно, главное внимательно все изучить. И все зависит от времени и желания.
  2. Сегодня мы рассмотрели крякинг не такой уж и простой программы (для начинающих), в состав которой входило 3 исполняемых файла. В этом деле бывают разные нюансы, если где то сделали ошибку, возвращаетесь и снова анализируете.
  3. Бывают ситуации что проще пропатчить в одном месте и все, а есть случаи что лучше сгенерировать ключ и работы меньше. С своей стороны пытался пояснить проще некуда :cool:, я человек простой, надеюсь статья Вам понравится.
В архиве, скриншот:
anv-46.jpg


Наш пациент (Установщик с оф. сайта) / 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

Файлы к статье:
Скрытый контент для зарегистрированных пользователей.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх