Изменения

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

252 байта добавлено, 14:35, 29 марта 2011
м
Нет описания правки
Задумавшись о «простеньком плагинчике» для исключения тупой ручной работы в IDA — для «трассировки констант», пришёл к выводу, что я изобрёл <s>велосипед</s>декомпилятор, и что не такая уж это и сложная вещь — декомпилятор.
 
В какой-то момент я ещё нашёл страничку http://www.backerstreet.com/decompiler/creating_statements.php, и понял, что все мои мысли полностью соответствуют стандартной теории декомпиляции.
Потом понял, что парсить вывод IDA — занятие тяжкое и приносящее малый профит, и в случае ARM точно лучше использовать objdump, хотя он и не является рекурсивным дизассемблером. Вообще, в случае ARM всё ну очень просто, так как любая инструкция занимает 4 байта и всегда выровнена на границу 4 байт. Поэтому натравленный на файл objdump всегда дизассемблирует его корректно, только некоторые «инструкции», которые на самом деле не инструкции, нужно будет заменить на данные.
** Помечаем пройденные узлы как обработанные.
** Когда где-то видим уже обработанный узел, заменяем переход к нему на goto. То есть, if «без дублирования» кусков веток будет «нормальным», без goto.
*: Пример «плохого» if’а: 0->1->3->4, 0->2->3, 0->4, 0->5->4.
*: <graph>digraph G { 0->1->3->4; 0->2->3; 0->4; 0->5->4; }</graph>
Всё это соответствует стандартной теории декомпиляцииПример «плохого» if’а: 0->1->3->4, см0->2->3, 0->4, 0->5->4. например http<graph>digraph G { 0->1->3->4; 0->2->3; 0->4; 0->5->4; }</graph> Декомпилировать его можно как-то так:<code-c>if(_1) { 1; 3; }else if(_2) { 2; goto 3; }else if(_5) { 5; }4;<//www.backerstreet.com/decompiler/creating_statements.phpcode-c>