ПРОСТЕЙШИЙ СКАНЕР изучаем исходник scan.c Спецвыпуск Xakep, номер #023, стр. 023-052-1 Рваный нерв Ну что стоит настоящему хакеру быстренько налабать программку простейшего сканера портов? Лень? Ну вот и нам тоже ЛЕНЬ! Поэтому как настоящие разленившиеся раздолбаи мы заходим по адресу: http://cs.baylor.edu/~donahoo/NIUNet/portscan.html и качаем оттуда файл scan.c с готовым сканером. Еще нам понадобиться файл listofports.dat с описанием портов (брать там же). КАК ЗАПУСТИТЬ ПРОСТЕЙШИЙ СКАНЕР? Мы откомпилили эту программу под Linux с ядром 2.4Х. Для этого надо набрать: > gcc –o ./scan ./scan.c После компиляции получившемуся бинарнику надо выставить атрибуты запускаемого файла: > chmod +x ./scan После этого можно запускать сканер, для этого укажи айпишник или доменное имя жертвы: > ./scan 127.0.0.1 Таким образом, мы просканили самих себя. Сканер выдал нам порты, которые были открыты в нашей системе. А для того, чтобы посканить доменное имя плохого хоста можно запустить сканер так: > ./Scan www.plohoy_host.ru Вот и все, что нужно начинающему юниксойду, чтобы скомпелить и испытать свой сканер. Три строчки и ты можешь чувствовать себя богом! МАЛЕНЬКИЙ БАГ! Куда бы мы девались без багов? В коде этой программы был маленький баг: вместо файла listofports.dat программа обращается к файлу listoports.dat. Это легко лечится, если переименовать файл с описанием портов, удалив букву "f". Либо можно изменить код программы, добавив профуканное "f" в имя файла. КАК РАБОТАЕТ ПРОСТЕЙШИЙ СКАНЕР? Простейший сканер засасывает в себя айпишник жертвы и поочередно пытается открыть все порты из списка. Список портов находится в файле listofports.dat. Если порт открывается, то сканер выводит описание этого порта, которое тоже берет из списка портов. Порт, который удалось открыть сканер выводит на экран. Можно задать программе доменное имя в виде www.plohoy_host.ru, тогда программа перед подключением запросит айпишник жертвы у сервера DNS. Чтобы программа была, как можно меньше в ней использованы указатели. Чтобы лучше вникнуть в суть этой программы тебе придется разобраться с указателями. С помощью указателей мы записываем содержимое файла со списком портов в память в виде дерева. С помощью тех же указателей мы достаем нужные номера портов и описание к ним. Указатель указывает на место в дереве, где лежит нужная информация, в этом вся его особенность. То есть нам не приходиться заморачиваться с перебором массивов и переменными, мы просто двигаем указатель по дереву. ЛИСТИНГ ФАЙЛА SCAN.C с подробными комментариями. /* Подключаем необходимые библиотеки */ #include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <errno.h> #include <unistd.h> #include <signal.h> #include <string.h> #include <netdb.h> #define MARK '/' /* Вот так с места в карьер мы начинаем главную функцию программы. Во время запуска программы ты можешь передать цифры целого типа, или строку символьного типа. */ void main(int argc, char *argv[]) { /* Объявление переменных, используемых в сканировании портов */ int probeport = 0; struct hostent *host; |