11
Восстановление типов данных с использование информации
о выполнении программы
Антонов Вадим Юрьевич, Долгова Катерина Николаевна
Студент факультета ВМиК
Московский государственный университет имени М.В.Ломоносова, Москва, Россия
Обратная инженерия в индустрии программного обеспечения – процесс извлечения
информации, неявно представленной в исполняемой программе. Результатом обратной
инженерии является представление программы на более высоком уровне абстракции [1].
Одной из важных задач обратной инженерии является задача восстановления типов
данных. Эта задача играет важную роль в восстановлении протоколов обмена
информацией, декомпиляции, восстановлении интерфейсов приложений и анализе
программ на наличие ошибок и угроз безопасности. Несмотря на то, что полное
автоматическое восстановление типов данных в общем случае является алгоритмически
неразрешимой задачей, существует ряд методов, позволяющих решать эту задачу для
некоторых классов программ.
Можно выделить два подхода к восстановлению типов данных: статический и
динамический. Статический подход использует только информацию, доступную в
исполняемом файле программы, в то время как динамический подход учитывает
информацию времени выполнения программы, в частности, для предлагаемого метода
используется информация о значениях переменных.
В данной работе представляется метод сбора и анализа информации времени
выполнения программы для восстановления типов данных по бинарному коду
исполняемой программы. Цель анализа данных – восстановить знаковость целого типа и
отличить целый тип от указательного, так как по ассемблерному коду восстановить это
не всегда возможно. Ассемблерные команды, в мнемоники которых явно заложена
знаковость, обычно двухадресные, и знаковость относится к одному из используемых
операндов. Отличить, к какому именно операнду – при статическом анализе зачастую
невозможно. Аналогичная ситуация возникает с распознаванием типа 32-х битных
переменных (для 32-х битной архитектуры). Для работы с указателями и 32-х битными
переменными используются одни и те же команды, для хранения – одни и те же
регистры общего назначения. Если в программе для указательного типа не было
разыменования, то при статическом анализе отличить его от целого типа не
представляется возможным.
Предлагаемый метод сбора информации времени выполнения основан на том, что
для каждой операции чтения и записи в память строится профиль загружаемых и
считываемых значений. Разработан ряд
эвристик, позволяющих
по
значениям
переменной, которые она принимала во время выполнения программы, с некоторой
вероятность оценить является ли она знаковой или беззнаковой, а также является ли
переменная указательного типа или это переменная целого типа.
Разработанный метод реализован в инструменте TDTrace, который позволяет
анализировать адреса и значения, используемые во время выполнения программы, а так
же представляет полученную информацию в удобном для последующего использования
виде. При реализации была использована среда Valgrind с открытыми исходными
кодами для разработки инструментов анализа программ во время их выполнения[2].
Инструмент TDTrace был апробирован на нескольких программах с открытыми
исходными кодами. Результаты этих экспериментов показали состоятельность подхода.
Литература
1. Chikofsky, E.J.; J.H. Cross II (January 1990). "Reverse Engineering and Design Recovery:
A Taxonomy in IEEE Software". // IEEE Computer Society
2. Nicholas Nethercote and Julian Seward. (2007) Valgrind: A Framework for Heavyweight
Dynamic Binary Instrumentation // Proceedings of ACM SIGPLAN 2007 Conference on
Programming Language Design and Implementation (PLDI 2007), San Diego, California,
USA, June 2007.