Компания Trail of Bits объявила (http://blog.trailofbits.com/2014/08/07/mcsema-is-officially-.../) об открытии под лицензией BSD исходных текстов фреймфорка McSema (https://github.com/trailofbits/mcsema) (MC-Semantics), предназначенного для анализа и преобразования машинного кода в промежуточный биткод (http://llvm.org/docs/BitCodeFormat.html) LLVM (RISC-подобные виртуальные инструкции LLVM IR). Фреймворк поддерживает машинный код архитектуры x86, включая целочисленные вычисления, операции с плавающей запятой (FPU) и векторные инструкции (SSE). Проект разработан при поддержке Агентства по перспективным оборонным научно-исследовательским разработкам США (DARPA).
В качестве основных областей применения McSema отмечаются (http://blog.trailofbits.com/2014/06/23/a-preview-of-mcsema/) анализ и обратный инжиниринг программ. Например, становится возможным применение инструментов отладки и анализа (KLEE, PAGAI, LLBMC), поддерживающих LLVM IR. При этом преобразование машинного кода в промежуточное представление LLVM открывает такие потенциальные возможности, как обеспечение запуска на других аппаратных архитектурах и трансляция в более понятные для разбора исходные тексты на высокоуровневых языках. McSema также позволяет упростить сложные схемы трансформации кода с сохранением изначальной функциональности. Например, полученный биткод LLVM при помощи компилятора Emscripten (http://www.opennet.ru/opennews/art.shtml?num=35313) можно преобразовать в представление на языке JavaScript, пригодное для выполнения внутри браузера.
В состав McSema входит несколько доступных для обособленного использования субпроектов, выполняющих функции восстановления управляющего потока, трансляции инструкций, разбора бинарных файлов и тестирования. На первом этапе при помощи программы bin_descend производится восстановления управляющего потока и построение графа структуры программы, определяющего базовые блоки кода и информацию о внешних вызовах с сохранением семантики инструкций оригинальной архитектуры. Граф с информацией об управляющем потоке сериализируется с использованием протокола Google Protocol Buffer и передаётся для обработки программе cfg_to_bc, которая выполняет преобразование инструкций и формирует биткод LLVM.
Из других открытых проектов, занимающихся решением задачи преобразования исполняемых файлов в промежуточное представление LLVM можно отметить Dagger (http://dagger.repzret.org), Fracture (https://github.com/draperlaboratory/fracture) и libbeauty (https://github.com/jcdutton/libbeauty), но они пока не выходят за рамки экспериментальных разработок и подходят в для трансляции простейших программ.
URL: https://news.ycombinator.com/item?id=8148669
Новость: http://www.opennet.ru/opennews/art.shtml?num=40375