Пропатчим все от А до Я!
Xakep, номер #045, стр. 045-057-1 Andrushock (andrushock@fromru.com) Салют, читатель! Наверняка за все время сидения в *никсах ты не раз попадал в такую ситуацию, когда путем неимоверных усилий, нагона тонны трафика или траты драгоценного диалапного времени ты, наконец, качнул архинужную прогу, но облом-с: она не cкомпилилась. После этого в квартире/офисе/IRC-канале начинает стоять трехэтажный <censored> вместе с мыслями по поводу затраченного времени. Однако сухари заранее сушить не стоит. Давай посмотрим, что можно сделать в подобной ситуации. Выявляем корень В чем причина неудачной компиляции? Попробуем ответить на этот вопрос. Итак, программа в большинстве случаев не собирается из-за: 1) Отсутствия в системе нужных ей заголовков и библиотек (например, пакетов -devel; для сетевых утилит же обычно требуются libpcap, libnids, libnet). 2) Более ранних версий библиотек, чем требуемые программой. 3) Неверного для твоей системы указания путей, например, к заголовкам ядра или некоторым зависимостям. 4) Синтаксических ошибок в сырцах, сделанных иногда даже сознательно, к примеру, когда кодер сам не хочет, чтобы его прогу кто-то скомпилил. Такое бывает в исходниках потенциально очень опасных эксплоитов, дабы отстранить от их использования добрую часть script kiddies. За экзамплом далеко ходить не нужно: стоит вспомнить недавний 7350nxt.c для BIND 8.2.x. 5) Ошибок в компоновке и т.д. Выгоняем всех из Интернета На бескрайних просторах всемирной паутины мною была добыта утилитка phoenix (http://www.team-teso.net/releases/phoenix.tar.gz), сочетающая в себе возможности сниффера (правда, очень бедные, но для образовательных целей может пригодиться) и роль убийцы TCP-соединений для вполне безобидных целей: уменьшить количество входящего трафика и высвободить время сотрудникам конторы/хз-чего-там для работы ;). Распаковав архив: tar zxvf phoenix.tar.gz, переходим в созданный каталог, дрожащими руками набираем make all и через пару секунд видим несколько предупреждений и ошибку сборки программы. Но не удивляйся - именно поэтому мы и скачали эту программу, чтобы заставить ее таки нормально скомпилиться. В этот момент главное не забиваться в угол, не перегружаться в винду и не паниковать. Давай лучше посмотрим в файл packet.c, собственно, главного виновника происшедшего, особенно на номера строк и те функции, которые к нам попали в stderr. При внимательном рассмотрении можно увидеть, что у warning'овых функций не хватает приставки "libnet_" (моя /dev/intuition подсказывает, что программер умышленно сделал такие ошибки, век ирки не видать :). Например, видим функцию do_checksum (buf, IPPROTO_TCP, TCP_H), где произошла ошибка, и доводим до ума: libnet_do_checksum (buf, IPPROTO_TCP, TCP_H). Разобрался? Отлично! Но не спеши править сырцы - сначала сделаем резервную копию packet.c: cp packet.c packet.c.orig Все, вносим необходимые изменения в packet.c и делаем патч: diff -Naur packet.c.orig packet.c > phoenix.patch Программа diff, выходной поток которой мы перенаправили в новый файл, как раз занимается тем, что находит разницу между содержимым текстовых файлов. |