Гусенко М.Ю. —
Применение регулярных выражений в задачах декомпиляции статических данных
// Программные системы и вычислительные методы. – 2017. – № 2.
– С. 1 - 13.
DOI: 10.7256/2454-0714.2017.2.22608
URL: https://e-notabene.ru/itmag/article_22608.html
Читать статью
Аннотация: Предметом исследования является процесс декомпиляции исходного кода программ на языки высокого уровня (ЯВУ). Показано место декомпиляции в цикле трансформации программы, включающем процессы канонизации, компиляции, оптимизации и декомпиляции. Объект исследования - скомпилированный эквивалент описания статических данных на ЯВУ, который в общем случае является нетривиальным отображением синтаксических конструкций на ЯВУ в последовательности байтов, размещаемых в исполняемых модулях программ и построенных с учетом различных техник оптимизации для данной микропроцессорной архитектуры. Процесс декомпиляции статических данных рассмотрен как реконструкция дерева разбора программы, восстанавливаемого при анализе ее исполняемого кода, так и как бинарная последовательность в памяти машины фон Неймана, которая анализируется регулярным выражением, создаваемым декомпилятором по предполагаемому описанию данных. Регулярные выражения традиционно используются для анализа символьных последовательностей. В статье показана другая область применения этого инструмента - для проверки гипотезы, что данный массив байтов исполняемого модуля является эквивалентом скомпилированных статических данных. Предложен вариант соответствующего синтаксиса языка регулярных выражений. Показано, что предлагаемый метод может использоваться для дополнительной проверки качества декомпилированного кода.
Abstract: The subject of the study is the process of decompiling the source code of programs into high-level languages. The author shows the decompilation point in the program transformation cycle which includes the processes of canonization, compilation, optimization, and decompilation. The object of the study is the compiled equivalent of the static data description on a high level programming language, which in general case is a nontrivial mapping of syntactic constructions on a high level programming language into a byte sequences located in executable program modules and constructed considering various optimization techniques for this microprocessor architecture. The paper reviews the static data decompilation process as reconstruction of the parse tree of the program, which is recovered during the analysis of its executable code and as a binary sequence in the memory of the von Neumann machine, which is analyzed by the regular expression created by the decompiler from the supposed description of the data. Regular expressions are traditionally used to analyze character sequences. The article presents another area of application of this tool – for proving the hypothesis that this byte array of the executable module is the equivalent of compiled static data. The author suggests a variant of the corresponding syntax of the regular expression language. The article shows that the proposed method can be used to further verify the quality of the decompiled code.