Пропатчим все от А до Я!

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, выходной поток которой мы перенаправили в новый файл, как раз

занимается тем, что находит разницу между содержимым текстовых файлов.

Содержание  Вперед на стр. 045-057-2