Научная статья на тему 'Анализ объектных файлов Delphi с использованием спецификации семантики машинных команд'

Анализ объектных файлов Delphi с использованием спецификации семантики машинных команд Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
352
64
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Михайлов Андрей Анатольевич

The object Delphi files decompilation problem is considered. The DCU format specification in Flext and disassembler DCU32INT of the DCU format specification are made use for the Delphi compiled files analysis. Mechanism of the code semantics description for Intel x86 processors is developed. Using this gives much of opportunities and makes the decompilation process more effective.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Delphi object files analysis using specification of machine commands semantics

The object Delphi files decompilation problem is considered. The DCU format specification in Flext and disassembler DCU32INT of the DCU format specification are made use for the Delphi compiled files analysis. Mechanism of the code semantics description for Intel x86 processors is developed. Using this gives much of opportunities and makes the decompilation process more effective.

Текст научной работы на тему «Анализ объектных файлов Delphi с использованием спецификации семантики машинных команд»

службы BOINC. Основу расчётной части составляют SAT-решатели minisat-1.14.1 и minisat-2.0, модифицированные с учётом особенностей КНФ, кодирующих задачи обращения дискретных функций [4]. Исполняемые файлы расчётной части взаимодействуют с BOINC-клиентом при помощи функций библиотеки DC-API, что позволяет, в частности, реализовать периодическое сохранение промежуточных данных вычислений в виде контрольных точек. На момент написания данной работы в проекте SAT@home принимает участие более тысячи активных добровольцев и задействовано более двух тысяч активно работающих ПК. Средняя производительность проекта за весь период работы составляет 1,7 терафлопс.

В декабре 2011 г. в SAT@home был запущен эксперимент по решению задачи криптоанализа генератора ключевого потока A5/1. На сегодняшний день наиболее эффективным методом криптонализа данного генератора является «rainbow-метод» [5]. Однако доступные rainbow-таблицы [5] покрывают ключевое пространство примерно на 88% (при «реалистичных» ограничениях на условия криптоанализа). Нами были сгенерированы 10 тестов, не поддающихся криптоанализу с использованием этих rainbow-таблиц. На момент написания данной работы в проекте SAT@home успешно решены 9 из них (в среднем на решение каждого теста уходило 2 недели работы проекта).

ЛИТЕРАТУРА

1. Платформа BOINC для организации добровольных вычислений. http://boinc.berkeley. edu/

2. Проект добровольных вычислений SAT@home. http://sat. isa.ru/pdsat/

3. Balaton Z., Gombas G., Kacsuk P., et al. Sztaki desktop grid: a modular and scalable way of building large computing grids // 21th Intern. Parallel and Distributed Processing Symposium. Long Beach, California, USA, 2007. P. 1-8.

4. Semenov A., Zaikin O., Bespalov D., and Posypkin M. Parallel logical cryptanalysis of the generator A5/1 in BNB-Grid system // LNCS. 2011. V. 6873. P. 473-483.

5. A5/1 Cracking project. http://reflextor.com/trac/a51/wiki

УДК 004.431:004.432:004.436

АНАЛИЗ ОБЪЕКТНЫХ ФАЙЛОВ DELPHI С ИСПОЛЬЗОВАНИЕМ СПЕЦИФИКАЦИИ СЕМАНТИКИ МАШИННЫХ КОМАНД

А. А. Михайлов

Процесс декомпиляции является важной, а при решении некоторых задач (таких, как поддержка программного обеспечения без возможности использования исходного кода или восстановление исходного кода) и неотъемлемой частью разработки программного обеспечения. В общем случае (для произвольных исполняемых файлов) эта задача является очень сложной, например требуется разделить память программы на код и данные. В объектных файлах Delphi программа оказывается более структурированной, например выделены блоки памяти, соответствующие коду каждой процедуры; имеется информация о типах данных; может присутствовать отладочная информация. Таким образом, при работе с файлами dcu [1] задача декомпиляции становится более достижимой.

В общем виде формат файла dcu выглядит следующим образом: сначала идёт заголовок, в котором содержится общая информация о файле, такая, как размер, время

компиляции и т. д. После заголовка следует поток теговой информации. Основную массу тегов можно разделить на следующие группы:

1) описания включаемых модулей и объектных файлов;

2) описания импортируемых из этих модулей определений (типов данных, процедур и т. д.);

3) описания определений (типов данных, процедур, функций и т.д.) из данного модуля;

4) блок памяти, составленный из блоков кода для процедур и функций, образов констант и т. д.;

5) информация для редактора связей (в какие места блока памяти необходимо занести адреса, получаемые из других модулей);

6) отладочная информация.

В программе DCU32INT [2] используется статический дизассемблер, который, в частности, не может определить имя виртуального метода по коду его вызова: для этого требуется проследить последовательность присвоений регистров и ячеек памяти и по смещению в таблице виртуальных методов извлечь имя вызываемого метода. Для решения подобных задач требуется использовать информацию о семантике машинных команд. Основным результатом данной работы является создание структур данных, предназначенных для описания семантики машинных команд процессоров семейства Intel x86 [3] и механизмов их использования в сочетании с дизассемблером DCU32INT. Предложенные структуры данных позволяют точно описать семантику наиболее важных для рассматриваемой задачи инструкций. При разборе инструкции используется результат её анализа существующим статическим дизассемблером, позволяющий определить выполняемую операцию и её аргументы. Семантика выполняемых операций задается при помощи специализированных операторов и выражений, предназначенных для решения этой задачи. Для грубого определения семантики остальных (не описанных явно) команд используются таблицы «опкодов» [4], в которых содержится информация об операндах, мнемоника инструкции, изменяемых и тестируемых флагах и т. д. Хотя грубые описания семантики не позволяют определить точные выражения для вычисляемых операцией значений, они могут дать информацию о времени жизни в ячейках памяти. В результате при анализе кода подпрограмм в dcu появляется возможность анализа потоков данных, порождаемых наиболее важными конструкциями языка Delphi, например вызовом виртуального метода.

Таким образом, разработан механизм описания спецификаций семантики машинных команд. С его помощью решаются задачи извлечения имён вызываемых виртуальных методов, распространения констант, подстановки имён используемых переменных и т. д., которые позволяют существенно сократить временные ресурсы, требуемые на получение описания алгоритма исследуемой программы. Конечной целью исследования является разработка методов анализа и программы декомпилятора объектных файлов Delphi на основе программы DCU32INT в язык высокого уровня, максимально соответствующий исходному коду исследуемой программы.

ЛИТЕРАТУРА

1. Хмельнов А. Е. Язык FlexT для спецификации бинарных форматов данных: дис. ... канд.

техн. наук. Иркутск, 2000. 118 с.

2. http://hmelnov.icc.ru/DCU/index.ru.html —Инструмент DCU2INT (для разбора юни-

тов Delphi).

3. http://www.intel.com/content/www/us/en/processors/architectures-software-deve-

loper-manuals.html —Intel Architecture Software Developer’s Manual.

4. http://ref.x86asm.net/geek32.html — X86 Opcode and Instruction Reference.

УДК 004.4’41

АНАЛИЗ НЕКОТОРЫХ СЕМАНТИЧЕСКИХ АСПЕКТОВ ИСХОДНЫХ ТЕКСТОВ ПРОГРАММ НА ОСНОВЕ ФОРМАЛЬНЫХ СПЕЦИФИКАЦИЙ СИНТАКСИСА И СЕМАНТИКИ

А.М. Саух

Целью работы является создание инструментального средства, позволяющего осуществлять семантический анализ исходных текстов программ, написанных на различных языках программирования, на основе формальных спецификаций лексики, синтаксиса и семантики целевого языка программирования. Рассматривается задача анализа некоторых семантических аспектов исходных текстов однопоточных программ на императивных языках программирования, таких, как объявление и использование идентификаторов, а также выявления областей их использования на основе анализа потоков исполнения программы. Целью такого анализа является извлечение семантически значимых конструкций и алгоритмов работы из текста программы и представление их в независимом от конкретного языка виде.

Анализ проводится в несколько этапов. Сначала производится лексический и синтаксический анализ, сопровождающийся построением абстрактного синтаксического дерева по исходному тексту программы. В зависимости от конкретного языка построение таблицы идентификаторов и дерева пространств имён происходит либо в один этап — сразу при построении синтаксического дерева, либо в два этапа, первый из которых осуществляется при построении дерева, а второй — при вторичном обходе построенного дерева.

В качестве отправной точки для решения задачи построения синтаксического дерева используется система генераторов компиляторов Lex и Yacc. Генераторы модифицированы так, что вместо исходного кода анализирующих конечных автоматов, который необходимо сначала скомпилировать, сразу создаются готовые к работе структуры анализатора. В качестве формата файлов спецификаций используются оригинальные форматы файлов спецификаций лексики и синтаксиса Lex и Yacc, модифицированные в части описания действий, исполняемых при свёртке по синтаксическим правилам. Лексические правила описываются в виде набора регулярных выражений, которым сопоставлены управляющие конструкции, регулирующие возврат обнаруженных лексем в синтаксический анализатор. Синтаксические правила представляют собой описания структур языка, которым сопоставлены управляющие конструкции, регулирующие построение абстрактного синтаксического дерева, таблиц идентификаторов, дерева пространств имён и других элементов (такой подход описан в [1]). Синтаксическим анализатором поддерживаются контекстно-свободные грамматики, разбираемые по алгоритму LALR.

Семантический анализ производится на основе нескольких обходов абстрактного синтаксического дерева с построением конструкций, описывающих объявление и использование идентификаторов (типов, переменных, функций, классов, методов и т. д.), организацию пространств имён и ограниченно описывающих потоки исполнения команд, что позволяет анализировать использование тех или иных участков кода.

i Надоели баннеры? Вы всегда можете отключить рекламу.