· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Восстановление исходного кода по тройкам

Посл.отвђт Сообщенiе


Дата: Апр 6, 2004 18:55:13

Знатоки теории компиляции, компиляторов и т.п. Ткните меня носом в какую-нибудь литературу или что-нибудь в этом духе. Мне надо восстановить исходный код (в компилируемом виде - идентичности, понятное дело, не добиться), имея на руках промежуточную форму, например, тройки, четверки и т.п. Это возможно теоретически?


Дата: Апр 6, 2004 23:15:31

А что? Каждая тройка может быть вполне тривиально переведена на любой
процедурный язык программирования. Даже компилироваться будет... :)))

Также задача существенно зависит от того, прошел ли код через оптимизатор,
который мог удалить индуктивные переменные и сделать прочие страшные вещи.

Насколько я понимаю, у тебя уже есть "хороший учебник по компиляторам".
Вот его и надо читать, особенно главу про оптимизацию, и уделив пристальное
внимание такому понятию, как ДОМИНАТОР. По дереву доминаторов можно
восстановить такие высокоуровневые структуры, как условные операторы,
циклы и подпрограммы... Также в этой книге в конце каждой главы есть
аннотированные в вольном стиле списки литературы, всякие CACM-ы, JACM-ы
читать - не перечитать... :)

Вообще, такими вещами наверное имеет смысл заниматься, поимев сначала
опыт написания компиляторов. Есть таковой?

Можно еще попробовать помучить Доктора Голову на предмет того как у них
поставлены на поток разборки. У меня есть стойкое подозрение, что без
подобного рода тулз ("для внутреннего употребления") они бы вряд ли
достигали такой производительности в своем деле...


Дата: Апр 6, 2004 23:49:37

Во-первых, спасибо, что ответил.
Теперь поехали.

Также задача существенно зависит от того, прошел ли код через оптимизатор

Речь идет о восстановлении кода в компилированных перловских скриптах. И оптимизатор там присутствует, да. peephole optimizer, который может гупать в пределах двух смежных опкодов.

Вот его и надо читать, особенно главу про оптимизацию, и уделив пристальное
внимание такому понятию, как ДОМИНАТОР.


Что это такое - я не знаю, но почитаю.

Вообще, такими вещами наверное имеет смысл заниматься, поимев сначала
опыт написания компиляторов. Есть таковой?


И да, и нет. Да, потому что в состоянии написать что-то простое для YACC, втырить туда LEX и получить что-нибудь внятное. Книги есть и что читать тоже есть. Буду разбираться. Что до написания компилятора с нуля - не могу. Здоровья не хватит. Я не думаю, что у кого-нибудь здесь хватит здоровья на подобное деяние с нуля. Даже при обладании теорией.


Дата: Апр 6, 2004 23:50:20

Вот копия моего поста на реверсинге:

Попалась мне защита, основанная на скомпилированных перловских скриптах. Уже неделю усиленно разбираюсь во внутреннем строении перла - токенизатор, YACC, опкода на виртуальной машине и т.п.
В общем, чего эти ребята сделали. Взяли перловский скрипт, взяли perlcc. Получили сишный файл. Внутри этого файла есть ф-ция perl_run, а есть функция, которая готовит список байт-кодов. В файле в этой подготовительной функции инструкции идут сплошняком - там нет ни jz, ни jnz и т.п. Есть только Perl API и запихивание опкодов по структурам. Далее perl_run начинает пробежку по этим структурам (если кому любопытно - файл run.c в дистрибутиве перла). Так вот, я могу получить сброшенный в лог список этих опкодов. Теперь вопросы.

1) Если кто знаком с теорией компиляции. Как можно из троек/четверок воссоздать исходный код, если это вообще возможно в принципе. Применительно к данному случаю. Если я располагаю полным знанием о структуре опкодов, скаляров, массивов и хешей (и т.п.), а также знаю как исполнялась программа, можно ли как-то восстановить исходный код?
2) Как это падчить?

Если кому совсем любопытно, то перл можно заставить выдать последовательность опкодов, исполненных программой. Надо набрать perl -Dtr filename.pl. Для этого требуется perl, собранный с ключом -DDEBUGGING. Надо скачать сорцы с activestate.com, прочитать два файла (в случае виндузы) - README.w32 и makefile в директории win32. Собрать перл при помощи nmake (можно и не только ей, но у меня VS.NET) и проинсталлировать nmake install. Потом ручками пропишите PATH и соассоциируете pl-расширение с перловским интерпретатором.
Так вот, последовательность опкодов известна, структура любого данного опкода известна, о данных тоже кое-что известно, как получить исходный код?
Взять лог исполнения, написать перловскую программу, которая делает... что?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057