Безумный Max. Как ломают плагины для 3ds Max

Ком­мерчес­кие пла­гины к популяр­ным прог­раммам, как и обыч­ные при­ложе­ния, исполь­зуют собс­твен­ные механиз­мы безопас­ности. Сегод­ня мы нем­ного поковы­ряем­ся во внут­реннос­тях плат­ных рас­ширений для популяр­ного трех­мерно­го редак­тора 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

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *