Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Коммерческие плагины к популярным программам, как и обычные приложения, используют собственные механизмы безопасности. Сегодня мы немного поковыряемся во внутренностях платных расширений для популярного трехмерного редактора 3ds Max и узнаем, какие методы защиты применяют их разработчики.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
В своих публикациях я уже неоднократно затрагивал тему реверса и деобфускации .NET-приложений и библиотек. Сегодня поговорим о том же, только в несколько ином ключе. Начнем, в лучших традициях поручика Ржевского, издалека.
У дизайнеров, активно занимающихся 3D-моделированием, большой популярностью пользуется редактор 3ds Max небезызвестной компании Autodesk. Этот профессиональный редактор уже больше тридцати лет считается лидером отрасли, начиная еще с эпохи DOS. Разумеется, как любой профессиональный редактор, он предоставляет API, на основе которого толковый пользователь может дописывать свои модули под собственные технические задачи (скрипты, плагины и прочее). И конечно же, на рынке программного обеспечения довольно быстро появилась соответствующая ниша, связанная с изготовлением и продажей подобного рода расширений, которые пользуются спросом у профессиональных дизайнеров‑трехмерщиков.
За тридцать с лишним лет Autodesk успела наплодить множество типов расширений, из которых самый старый и часто используемый — скриптинг на MAXScript. MAXScript — собственный, ни на что не похожий (хотя Википедия почему‑то отмечает сходство с BASIC и LISP) язык, имеющий просто чудовищный по современным меркам синтаксис. По сути, это тяжелое наследие лихих девяностых, когда гордыня первопроходцев компьютерного софта заставляла их изгаляться во имя уникальности, лишь бы не как у всех. Самые отмороженные из подобных решений отмерли, заместились общепринятыми технологиями (Python, JavaScript), другие сами стали неким стандартом, предоставив в качестве компромисса интерфейс для вызова более популярных платформ.
Хотя в Autodesk и предприняли робкую попытку заменить MAXScript Python’ом, но на данный момент, похоже, MAXScript все‑таки лидирует — дело и в поддержке старых наработок, и в том, что из MAXScript есть возможность вызывать .NET-библиотеки, в которых можно реализовать любую хотелку.
Вот так мы и подошли к формулировке задачи исследования. Есть некая линейка широко известных в узких кругах лицензированных продуктов, реализованных с помощью MAXScript. Если лицензии нет, при загрузке плагин выдает такое красивое окошко.
Нужна активация лицензии!
И без регистрации расширение отказывается что‑либо делать дальше. Как отучить программу от этой вредной привычки?
Поначалу нам слегка везет: расширение имеет формат простого текстового скрипта, в котором хоть и напрочь отсутствуют форматирование, пробелы и переводы строк, но логику проследить можно. К слову, могло быть и хуже — это мог бы быть нативный плагин, да и сами скрипты бывают не только прозрачного текстового .MS-формата, но и зашифрованными (.MSE) и даже запакованными (.MZP).
Возни с ними больше, но останавливаться на таких плагинах подробно мы не будем, поскольку и с открытым текстовым .MS-форматом проблем нам хватит на целую статью.
Открыв текст скрипта в блокноте, мы видим, что он на девяносто процентов состоит из хаотичного набора латинских символов и цифр, напоминающих Base64 или упомянутый мной в одной из предыдущих статей адобовский JSXBIN.
Содержимое плагина
Мысленно взяв в руки бритву Оккама, предположим, что это все‑таки простейший Base64. Это предположение подтверждает и найденная в открытой текстовой части кода конструкция на «максовском» птичьем языке:
...last_dll_id!=astrid or :: last_dll_fullname!= sett_dll.fullname then(fn abytes=(dotnetclass"System.Convert").frombase64string(fb64(astr()));::sett_dll=dn_assembly.load(abytes());...
Источник: xakep.ru