Изменения

ARM-декомпилятор

2246 байтов добавлено, 13:56, 2 апреля 2011
м
Нет описания правки
=== Условные операторы ===
Условный оператор определить легко: если что-то ветвится и это не ветвление, реализующее цикл (т.е. то есть не предусловие и не постусловие само по себе), это условный оператор :)
Транслировать его следует так:
</code-c>
== Процесс Данные декомпиляции ==
Что есть у декомпилятора:
* Список функций — по сути, адресов, с которых они начинаются.
* Хеш использования переменных, функций и т. п. По сути, каждый адрес может использоваться другими адресами.
* ГрафОриентированный граф ветвлений, состоящий из непрерывных блоков выполненияи переходов между ними.
* На каждую инструкцию внутри блока — отслеженные с начала функции либо всей программы выражения.
* На каждый блок — входные и выходные значения регистров и т. п., относительные входных + транслированное тело.
* Список ASCII-строк с их адресами.
Всё это в процессе анализа может меняться и дополняться.
Первое, что нужно сделать после разбора полного листинга из objdump'а - это начать отслеживать == Отслеживание данных == Отслеживать данные и строить граф ветвлений нужно вместе, а начинать следует сразу после разбора objdump’овского листинга с какой-нибудь точки входа. При этом для каждого непрерывного блока нужно сохранять входные значения и выходные, относительные входных. Выражения, порождаемые и используемые только внутри блока, можно подставлять сразу. Часть выражений, которые после выхода из блока не будут использоваться, можно забыть. Выделять циклы и условные операторы здесь на этом этапе ещё не надонужно, потому что граф ветвлений может ещё меняться поменяться в процессеанализа, а от интерпретации циклов и условных операторов зависят и окончательные выражения. Правда, нужно иметь ввиду, что после выделения блоков могут появиться и новые переходы, влияющие и на граф и снова на циклы и т. п., но в основном такие переходы будут, скорее всего, вызовами функций, поэтому пока что можно сильно не заморачиваться. Чтобы отслеживать данные, желательно иметь хотя бы некоторый движок, который был бы в состоянии упрощать выражения. К счастью, извращений типа функции, которая по номеру регистра и значению в него что-то пишет, в сишных программах быть не должно, потому что есть EABI — соглашение по вызову функций, но вот в память запись может идти и по адресу, который сам является выражением. И не просто может, а может очень часто.