Я взял несколько нетривиальных программ
и проанализировал их: исходный код привел
к читаемому виду и вкратце описал, какие
особенности языка Си используются.
Вы можете загрузить копию этих страниц
одним файлом: obf.tar.gz или
obf.zip.
Последовательность разархивирования:
$ gunzip obf.tar.gz
$ tar xf obf.tar
или
X:> pkunzip -d obf.zip
Изначально эта работа выполнена с целью получения допуска
к зачёту по курсу лекций "Языки и системы программирования"
(Часть I, осень 1997). Преподаватель -
Одинцов Игорь Олегович. Тема работы -
"Нетривиальные программы на языке C.
Собрать и проанализировать."
Работа сделана на основе "The Thirteenth International
Obfuscated C Code Contest" (13th IOCCC, 1996) (13-й
международный конкурс нетривиальных C-программ).
IOCCC имеет официальную домашнюю страничку
по адресу:
http://www.ioccc.org.
Она содержит списки победителей разных лет,
информацию о судьях, анонсы и прочее.
Вначале просматривался исходный текст программы.
Затем читалась аннотация к ней с рекомендациями по
использованию. Потом программа компилировалась и
запускалась.
Самым сложным этапом является преобразование
программы в более простую форму. В первую очередь
исходный текст аккуратно пропускался через препроцессор
(gcc -E ... ) (аккуратно - значит чтобы не раскрывались
конструкции наподобие #include<stdio.h>).
После прогонки результата через переформатер C-программ
она уже принимала приличный вид. Оставалось только
вручную разобрать сложные конструкции. Последним шагом
было преобразование нетривиальных конструкций
последовательностью более простых команд. Этот последний
шаг повторялся, пока программа не становилась совсем
ясной.
prog.c - исходный текст программы. Если его необходимо компилировать с заданием макродиректив извне, то приведён 'Makefile'. prog.hint содержит краткое описание программы, её использование и намёки автора на то что она делает. converted.c - текст программы, преобразованный в простую форму. Дано также описание программы. При необходимости включаются дополнительные файлы.
Желательно использовать сетеходилку, поддерживающую
фреймы. Но необязательно. lynx тоже сгодится.
Обязательно используйте шрифт с одинаковой
шириной букв. Эстетическое восприятие исходных текстов
многих программ очень сильно зависит от этого.
Не помешает установить в параметрах, что табуляция равна
восьми пробелам.