Patching Unity Dif Schneider Electric
Aug 06, 22Предыстория
У Schneider Electric есть неплохой инструмент для сравнения изменений двух версий одного проекта, но, к сожалению, он платный с 21 дневным триалом. Не плохо бы пользоваться этим инструментом на постоянной основе. История о том, как имея сильную защиту в плане лицензирования, можно обойти небольшим патчем dll библиотеки.
DISCLAIMER: Данная заметка написана в ознакомительных целях и не является руководством к неправомерным действиям. Уважайте чужой труд программистов и уважайте авторское право.
Подготовка
Качаем Trial Reset v4.0, анализатор файлов Detect It Easy. Для декомпиляции понадобятся либо JetBrains dotPeek, либо мой любимый dnSpy - a debugger and .NET assembly editor.
Сам Unity Dif представлен в виде двух версий: Unity Dif V8.0 и Unity Dif V14.0. Разница в том, что новая версия работает с Control Expert.
Предварительный анализ
Устанавливаем - вместе с Dif идет сразу License Manager, который регистрирует нам программы производства SE.
Открываем Detect It Easy, натравливаем на него основной UnityDif.exe
Отлично, даже ничем не запаковано, чистое Net приложение)
Поиграемся с триалом стандартными средствами. При старте приложения нам выходит следующее окно:
Переводим время на два дня вперёд, открываем приложение - теперь вместо 21 дня у меня уже 19. Хорошо, пробуем откатить время на текущее. Теперь приложение ругается на инвалидную лицензию после того, как часы вернулись обратно (картинка будет ниже). Те, кто читал предыдущую часть по скидыванию триала на Control Expert уже знают, что Schneider Electric применяет FlexNet для защиты своего ПО.
Ну мы ребята, наученные жизнью, открываем Trial Reset и скидываем всё, что есть. Открываем приложение вновь и видим данное окно:
“Что-то пошло не так”. У меня Trial Reset не нашел сектор на диске, поэтому обнуляю данные по инструкции:
И теперь у меня снова 21 день.
Ниже видеоинструкция, как всё сделать за пару минут:
Проверим перевод времени на один день:
и снова возвращаем на день назад. Как ни странно, но в этом случае снова показало 21 день. Проверяем вновь на два дня назад:
Возвращаем обратно и оп - тоже самое, что было и при первой попытке:
Молодцы, добили лицензию) Можно провести все манипуляции обратно и получим вновь работающую 21 лицензию. Но может есть путь легче?
Патчим библиотеку
Открываем dnSpy, сразу закидываем все файлы из папки. Это сделано для того, чтобы легко переходить по ссылкам - я долго тупил потом, где мне искать библиотеку, пока не закинул в dotPeek файл. dnSpy будет вам просто помечать красным ссылку, пока вы файл не добавите в “Обозреватель сборок” файл, на который ссылаются в проекте.
Смотрим наш UnityDif.exe и видим следующее:
Один главный метод Main. Всё! Удивлению не было предела - такого минималистичного кода я давно не видел) Ну что ж, идем дальше - смотрим, что там интересного в этом IN.SE.UnityDifFramework.
И сразу в глаза бросается метод **BrickManager.CheckLicense()**
и его сравнение с числом.
Перейдем и посмотрим, что в нём:
Не сложно догадаться, что если мы переменную типа bool BrickManager.Instance._licenseChecked
сделаем true в начале условия, то программа будет всегда зарегистрированной:
Выбираем в dnSpy “Изменить метод C#”, вносим правку из скриншота, компилируем и выходим с сохранением.
Проверяем расположение нашей библиотеки в C:\Windows\Microsoft.NET\assembly\GAC_MSIL\UnityDif\v4.0_14.0.11.0__aac912ca4f0c5227
. Это нужно для того, что приложение подтягивает файл не из директории программы, а с Global Assembly Cache (GAC), что в дословном переводе на русский означает: Глобальный Кеш Сборок. Поэтому первые мои патчи шли мимо, и я не сразу понял, что в кэше ещё старая версия библиотеки.
Подкидываем файл и проверяем:
Как видим, всё работает без проблем. И что был FlexNet, что его нет - нам он уже не помешает. Ну и повторю прописную истину - “Уровень защищенности информационной системы полностью определяется уровнем защищенности самого слабого места в ней”.
Готовые пропатченные библиотеки можно скачать по ссылкам ниже: Unity Dif V8.0, Unity Dif V14.0.