LINUX.ORG.RU

декомпилятор байткода


0

0

Собираю для личных нужд декомпилятор байткода для AVM2;
в принципе дело не хирое — почти все операции, которые оперируют только регистрами и стеком операндов можно свернуть
в некое подобие s-выражений с помощью нескольких простых преобразований (типа «((push X) (push Y) (add)) => ((push (add X Y)))»).

Остается последовательность операций с побочными эффектами (присваивание, вызовы функций с неиспользуемым результатом, итп),
а также условные и безусловные переходы. И от них надо бы как-то избавиться.
Можно было бы вместо каждого «(goto labelX)» подставить последовательность выражений которая идет за labelX,
но дальше надо как-то отслеживать рекурсию и заворачивать в
циклы, и как это правильно делать не совсем понятно. Подозреваю,
что об этом должна быть какая-то относительно красивая теория.
Подскажите где искать


Обычно ВМ требуют строго следить за стеком, то есть:

* каждая итерация цикла должна оставлять после себя на стеке столько же, сколько было до неё; * ветки if-then и if-else должны оставить после себя на стеке одинаковое кол-во объектов.

Если эти утверждения выполняются, то на основе некоторой эвристики можно определять циклы и ифы, а этими утверждениями пользоваться при проверке.

bvvv
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.