Су­щес­тву­ют весь­ма экзо­тич­ные язы­ки прог­рамми­рова­ния. Один из них — язык G, для которо­го ком­пания National Instruments соз­дала спе­циаль­ную сре­ду раз­работ­ки под наз­вани­ем LabVIEW. Тема ревер­са такого соф­та прак­тичес­ки не рас­кры­та из‑за узкой спе­циали­зации подоб­ных прог­рамм. Это упу­щение, я наде­юсь, поможет испра­вить сегод­няшняя статья.

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

Но мар­кетинг — силь­ная вещь, и дан­ная тех­нология не то что­бы слиш­ком глу­боко, но все же уко­рени­лась на рын­ке и отво­ева­ла себе опре­делен­ный сег­мент: появи­лись Smalltalk и ему подоб­ные. В сов­ремен­ности оче­ред­ным чудовищ­ным порож­дени­ем дан­ного под­хода стал гра­фичес­кий язык прог­рамми­рова­ния G фир­мы National Instruments. Для его под­дер­жки была соз­дана монс­тру­озная сре­да раз­работ­ки и плат­форма для выпол­нения прог­рамм LabVIEW (англ. Laboratory Virtual Instrumentation Engineering Workbench), в которой мож­но даже соз­давать визу­аль­ные standalone исполня­емые при­ложе­ния.

Ос­новная ауди­тория этой сре­ды раз­работ­ки — тех­нари, зна­ющие железо, но не осо­бо све­дущие в его прог­рамми­рова­нии, которые, под­давшись рек­ламе, наде­ются по‑быс­тро­му нарисо­вать на колен­ке интерфейс к какому‑нибудь китай­ско­му дат­чику или роботу из лего. По счастью, чуток наб­равшись опы­та, они или сами перехо­дят на нор­маль­ные язы­ки прог­рамми­рова­ния, или находят спе­циаль­но обу­чен­ных людей, спо­соб­ных написать прог­рамму за них. Либо прос­то бро­сают это неб­лагодар­ное занятие, ужас­нувшись неудобс­тву сре­ды раз­работ­ки.

Имен­но поэто­му мы прак­тичес­ки не встре­чаем сре­ди рас­простра­нен­ных ком­мерчес­ких пакетов дан­ные порож­дения тьмы, тер­зающие взор здо­рово­го челове­ка неес­тес­твен­ным видом интерфей­са, диало­говых окон и кон­тро­лов. Тем не менее они все‑таки попада­ются сре­ди узкоспе­циаль­ных ути­лит под­дер­жки экзо­тичес­кого железа, и их даже защища­ют от копиро­вания. Встре­ча с подоб­ной защитой — адский кош­мар для хакера даже не потому, что защита хорошо про­дума­на тех­ничес­ки. Прос­то, как ты ско­ро убе­дишь­ся, архи­тек­тура подоб­ных при­ложе­ний зак­рыта и неудоб­на в отладке.

Итак, рас­смот­рим при­мер кон­крет­ного при­ложе­ния. Обыч­но это сис­тема управле­ния тех­ничес­кими про­цес­сами, в нашем слу­чае — интерфейс нас­трой­ки спе­цифи­чес­кого железа, защищен­ный серь­езным аппа­рат­ным клю­чом, при отсутс­твии которо­го прог­рамма выда­ет доволь­но необыч­ное с дизай­нер­ской точ­ки зре­ния сооб­щение об ошиб­ке и работа­ет с уре­зан­ной фун­кци­ональ­ностью. Как имен­но мы опре­дели­ли, что перед нами — порож­дение LabVIEW? Это вов­се не оче­вид­но, ни DIE, ни Exeinfo (и, нас­коль­ко мне извес­тно, осталь­ные детек­торы) этот фор­мат не опре­деля­ют.

Из спе­цифи­ки стро­ения подоб­ных при­ложе­ний мож­но отме­тить раз­ве что кро­хот­ный кусок исполня­емо­го кода без какого‑то спе­цифи­чес­кого импорта с при­цеп­ленным к нему огромным запако­ван­ным и зашиф­рован­ным овер­леем, занима­ющим свы­ше 99% обще­го объ­ема фай­ла. В коде заг­рузчи­ка мож­но най­ти тек­сто­вые стро­ки LabVIEW, National Instruments и LVRT. Прав­да, их наличие вов­се не гаран­тирова­но. Дру­гой под­сказ­кой о про­исхожде­нии прог­раммы может стать упо­мяну­тый выр­виглаз­ный дизайн эле­мен­тов управле­ния.

Пример интерфейса, скриншот из документации
При­мер интерфей­са, скрин­шот из докумен­тации

Мы потихонь­ку подош­ли к заг­рузке прог­раммы в отладчик, в качес­тве которо­го будет исполь­зовать­ся наш любимый x64dbg. К счастью, прог­рамма бла­гопо­луч­но туда заг­ружа­ется и запус­кает­ся. Тол­ку, прав­да, от это­го нем­ного: ни строк, ни малей­ших учас­тков, похожих на все виды извес­тно­го нам исполня­емо­го кода, не появ­ляет­ся даже в дам­пе. Все дей­ствие прог­раммы в основном кру­тит­ся внут­ри модуля LVRT.DLL, наличие которо­го, пожалуй, и явля­ется отли­читель­ной осо­бен­ностью исполня­емых при­ложе­ний, соз­данных в этой сре­де раз­работ­ки.

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

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

Модуль в архиваторе
Мо­дуль в архи­вато­ре

Из­вле­чем ресурс 2 в отдель­ный файл и рас­смот­рим его более прис­таль­но. Сра­зу бро­сает­ся в гла­за сиг­натура RSRC, которая натал­кива­ет на мысль о фор­мате resource fork Mac OS. Собс­твен­но, сами раз­работ­чики и говорят о том, что взя­ли за осно­ву дан­ный фор­мат, пос­коль­ку LabVIEW изна­чаль­но соз­давал­ся для этой плат­формы, а поз­же, в вер­сии 2.5, был перене­сен на дру­гие ОС.

Ресурс 2 в hex-редакторе
Ре­сурс 2 в hex-редак­торе

Это уже какая‑то отправ­ная точ­ка. Нем­ного погуг­лив, мы обна­ружи­ваем, что до нас иссле­дова­ния в этом нап­равле­нии уже про­води­лись и упо­мяну­тый фор­мат час­тично ревер­сирован. Рас­смат­рива­емый нами заголо­вок выг­лядит вот так:

Length Type Value
6 string "RSRC\r\n"
2 ?
4 string "LVIN" (LabVIEW Instrument?)
4 string "LBVW" (LabVIEW?)
4 uint32 RSRC Info Offset
4 uint32 RSRC Info Size
4 uint32 RSRC Data Offset
4 uint32 RSRC Data Size

Вто­рая хорошая новость — нам вов­се не обя­затель­но писать свой пар­сер, пос­коль­ку доб­рый человек под ником mefistotelis уже сде­лал все за нас, запилив инс­тру­мент pylabview, который уме­ет очень мно­гое. Для его исполь­зования пот­ребу­ется Python, пос­ле уста­нов­ки которо­го мы смо­жем пре­обра­зовать богомер­зкий шиф­рован­ный ресурс в обыч­ный ZIP-архив при помощи такой коман­ды:

readRSRC.py -x -i 2

Рас­паковав получив­ший­ся архив 2_LVzp.bin, мы получа­ем мно­жес­тво вло­жен­ных катало­гов с фай­лами .VI (Visual Instrument), .CTL (эле­мен­ты управле­ния) и дру­гими.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Подписаться
Уведомить о
4 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии