Компания Trail of Bits объявила об открытии под лицензией BSD исходных текстов фреймфорка McSema (MC-Semantics), предназначенного для анализа и преобразования машинного кода в промежуточный биткод LLVM (RISC-подобные виртуальные инструкции LLVM IR). Фреймворк поддерживает машинный код архитектуры x86, включая целочисленные вычисления, операции с плавающей запятой (FPU) и векторные инструкции (SSE). Проект разработан при поддержке Агентства по перспективным оборонным научно-исследовательским разработкам США (DARPA).

В качестве основных областей применения McSema отмечаются анализ и обратный инжиниринг программ. Например, становится возможным применение инструментов отладки и анализа (KLEE, PAGAI, LLBMC), поддерживающих LLVM IR. При этом преобразование машинного кода в промежуточное представление LLVM открывает такие потенциальные возможности, как обеспечение запуска на других аппаратных архитектурах и трансляция в более понятные для разбора исходные тексты на высокоуровневых языках. McSema также позволяет упростить сложные схемы трансформации кода с сохранением изначальной функциональности. Например, полученный биткод LLVM при помощи компилятора Emscripten можно преобразовать в представление на языке JavaScript, пригодное для выполнения внутри браузера.

В состав McSema входит несколько доступных для обособленного использования субпроектов, выполняющих функции восстановления управляющего потока, трансляции инструкций, разбора бинарных файлов и тестирования. На первом этапе при помощи программы bin_descend производится восстановления управляющего потока и построение графа структуры программы, определяющего базовые блоки кода и информацию о внешних вызовах с сохранением семантики инструкций оригинальной архитектуры. Граф с информацией об управляющем потоке сериализируется с использованием протокола Google Protocol Buffer и передаётся для обработки программе cfg_to_bc, которая выполняет преобразование инструкций и формирует биткод LLVM.

Из других открытых проектов, занимающихся решением задачи преобразования исполняемых файлов в промежуточное представление LLVM можно отметить Dagger, Fracture и libbeauty, но они пока не выходят за рамки экспериментальных разработок и подходят в для трансляции простейших программ.

Источник: http://www.opennet.ru/opennews/art.shtml?num=40375