Исследование защиты программы ScriptFTP
Скриншот программы ScriptFTP
ScriptFTP - интересная разработка компании FrozenFrog Software. Это FTP-клиент, который можно запрограммировать на выполнение различных действий при помощи своего скриптового языка. Так, например, вы можете по планировщику запускать синхронизацию или резервирование данных с удаленного сервера по FTP, загружать или скачивать файлы, выполнять другие действия. Примеры скриптов и подробная документация доступны на офсайте. Ранее я уже имел дело с этой программой, тогда она была написана на нормальном языке программирования и накрыта протектором Armadillo, а в нынешней версии ее зачем-то переписали на дотнете. Жадности, впрочем, от этого ничуть не убавилось.
Загружаем с офсайта дистрибутив, устанавливаем, смотрим. Внешне особых проявлений триальности не обнаруживается, кроме пункта меню "Enter license key". При клике на него открывается окно регистрации с полем ввода серийника.
Окно ввода серийного номера
На ввод неправильного серийного номера программа реагирует сообщением "The entered license key is not valid". Теперь у нас есть начальные данные для исследования, можно приступать к работе с исполняемым файлом.
Файл обфусцирован
Открываем файл в уже знакомой вам утилите ILSpy NEXT, но сразу же обнаруживаем, что все имена классов и методов в сборке представляют собой нечитаемую кашу. Ясно дело, что без обфускатора тут не обошлось.
Деобфускация файла с помощью de4dot
С обфускацией легко справляется также знакомый деобфускатор de4dot, попутно сообщая название примененного обфускатора - Crypto Obfuscator. На всякий случай проверим работоспособность полученного после деобфускации файла, все должно работать как надо.
Файл после деобфускации
Открываем очищенный файл в ILSpy NEXT. Оригинальные имена классов восстановить не удалось, на то она и обфускация, но осмысленные имена все равно воспринимаются лучше.
Поиск строки сообщения
Запускаем через меню поиск, в строке поиска вводим фрагмент сообщения, которое появляется при неправильной регистрации. Тип - константа. Через несколько секунд в результатах поиска появятся названия нескольких функций, судя по названию, принадлежащих ScriptFTP. Нас интересует первая, с характерным названием, которая отвечает за реакцию на нажатие кнопки "Validate license code".
Определяем класс, содержащий функцию проверки
Наведя курсор на название функции с очень характерным названием, получим название класса, в котором она находится. Переходим к списку и находим там его.
Исходный код функции
В этом классе несколько функций, но одна из них наиболее интересная. Из названия должно быть понятно, чем она занимается. Возвращает статус зарегистрированности программы. Нам надо сделать так, чтобы эта функция всегда возвращала статус "зарегистрировано".
Патчим функцию проверки
Переключаемся на режим просмотра IL-кода, через контекстное меню заменяем последовательно две команды на установку нужного кода возврата и саму команду возврата. Обратите внимание, что патч выполняется не в самом начале функции, где инициализируется строка, а сразу за ней.
Функция пропатчена
В результате пропатченная функция должна выглядеть, как показано на скриншоте.
Функция пропатчена
Для верности переключаемся обратно на просмотр C#-кода и видим, что теперь функция должна возвращать статус "зарегистрировано" при любом раскладе.
Сохраняем изменения
Сохраняем изменения. Переходим в списке модулей на название исследуемого файла, в меню выбираем пункт "Save Assembly". Проверяем на работоспособность полученный файл. Меню для ввода серийного номера исчезло, перевод календаря на несколько месяцев вперед на работе программы также не сказался. Цель достигнута.
Программа успешно "зарегистрирована"
Точно так же патчится консольная версия программы ScriptFTP, но это вы теперь в состоянии сделать самостоятельно. С ростом популярности дотнета надо практиковаться в его "лечении" от всяких шароварных болезней, чем мы сегодня в очередной раз успешно занимались.
Просмотров: 3681 | Комментариев: 9
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
brute
(08.02.2016 в 09:31):
странно! похоже, на XP у ILSpector другое меню по правому клику - нет выбора "Replace instruction"..
ManHunter
(07.02.2016 в 14:37):
В прошлой статье все расписано с картинками, как патчить, как сохранять.
brute
(07.02.2016 в 06:33):
1. ни в SAE, ни в DnSpy, ни в JustDecompile не заметил обфускации. В (моей версии) ILSpy её тоже нет. Всё открыто: выбираем ScriptFTP-License-GetLicenseStatus и меняем все возвраты на "return License.LicenseStatusEnum.registered;"
2. как в этой ILSpy код патчить? Две недели назад полдня искал - нашёл. А сейчас потерял и не хочу опять полдня искать..
2. как в этой ILSpy код патчить? Две недели назад полдня искал - нашёл. А сейчас потерял и не хочу опять полдня искать..
ManHunter
(01.02.2016 в 00:37):
Ololo, если уж все равно патчить, то не лучше ли пропатчить сразу до зарегистрированного состояния, минуя стадию кейгена?
Ololo
(31.01.2016 в 19:45):
Судя по скрину там зашит RSA ключ, можно было его подменить и генерировать лицензии!
ManHunter
(28.01.2016 в 08:05):
"Я не волшебник, я только учусь"
voffka
(27.01.2016 в 23:21):
А чё GetLicensedTo не поправил на
ldstr "MANHUNTER"
ret
?
ldstr "MANHUNTER"
ret
?
Doxtur
(27.01.2016 в 14:42):
Да тенденции меняются, пару лет "лечил" одну прогу - была на делфи.
Скачал последнюю версию уже на шарпе.
Пришлось возится - не то что бы трудно, как-то противно в шарпавской фигне ковыряться.
Плюс все эти фрамеворки нужной версии, плюс под Xp на виртуалке не запустилось...
Скачал последнюю версию уже на шарпе.
Пришлось возится - не то что бы трудно, как-то противно в шарпавской фигне ковыряться.
Плюс все эти фрамеворки нужной версии, плюс под Xp на виртуалке не запустилось...
Добавить комментарий
Заполните форму для добавления комментария
В итоге патчил посредством RexlexIl в .Net Reflector.