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

Материал из YourcmcWiki
Перейти к: навигация, поиск

Задумавшись о "простеньком плагинчике" для исключения тупой ручной работы в IDA - для "трассировки констант", пришёл к выводу, что я изобрёл велосипеддекомпилятор, и что не такая уж это и сложная вещь - декомпилятор.

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

По сути 3 типа блоков:

  • Цикл
  • Условный
  • Линейный

Все 3 имеют по одной точке входа. Т.е. для их выделения начинаем с какого-то узла, дальше

  • линейный: добавляем узел, если за текущим следует только 1 и тот не разветвляется
  • цикл: если через текущий узел проходит цикл, добавляем в него этот цикл, потом добавляем также все циклы, проходящие через добавленные узлы
  • условный: если узел раздваивается и через него не проходит цикл, можно добавить к нему дочерние.