Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Существуют весьма экзотичные языки программирования. Один из них — язык 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-редакторе
Это уже какая‑то отправная точка. Немного погуглив, мы обнаруживаем, что до нас исследования в этом направлении уже проводились и упомянутый формат частично реверсирован. Рассматриваемый нами заголовок выглядит вот так:
Length | Type | Value |
---|---|---|
6 | string | «RSRCrn» |
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