Вертикаль власти eto'o Хакер, номер #080, стр. 080-124-6 if($not==0) $city=$ar[1];#о городе (часто этого поля вообще нет, используется вместо него address) } if(ereg("^StateProv:[ ]{0,10}([[:alpha:]]{2})",$li[$i], $ar)) { $state=$ar[1];#штат } if(ereg("^PostalCode:[ ]{0,10}([[:alnum:]]{0,8})",$li[$i], $ar)) { $post=$ar[1];#индекс } if(ereg("^NetRange:[ ]{0,10}([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}) - ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3})",$li[$i], $ar)) { $ip_from=$ar[1]; $ip_to=$ar[2]; #диапазон адресов } if(ereg("^inetnum:[ ]{0,10}([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3}) - ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.[0-9]{1,3})",$li[$i], $ar)) { $ip_from=$ar[1]; $ip_to=$ar[2]; } if(ereg("^[a|A]ddress:[ ]{0,10}(.{0,80})",$li[$i], $ar)) { $addr.=$ar[1]."\n";#Адрес (в случае для не американского ip) }} mysql_query("insert into locations('$ip_from', '$ip_to', '$country', '$city', '$state', '$post', '$addr')"); #записываем информацию о диапазоне Здесь мы открываем пайп к созданному нами процессу whois $ip и читаем в переменную $read результат работы этой утилиты. Затем проходим по каждой строке результата и при помощи набора регулярных выражений получаем интересующие нас поля с информацией. Покажу на примере как работают эти регулярные выражения. Возьмем, к примеру, вызов ereg("^City:[ ]{0,10}([[:alpha:]]{1,30})",$li[$i], $ar). Этому шаблону соответствуют все строки, которые начинаются со слова «City:» (символ ^ перед этой цепочкой), после которого обязательно идет от нуля до 10 пробелов, а затем последовательность из букв ([[:alpha:]]) длиной от 1 до 30 символов ({1,30}). Обрати внимание, что конструкция [[:alpha:]]{1,30} взята в круглые скобки, это означает, что все совпадающие с этим шаблонов строки будут помещаться в массив $ar. Как раз поэтому я присваиваю переменной $city значение $ar[1]. Когда я писал эту программу, у меня возникла проблема: информация о различных адресах возвращалась в разных форматах. Все дело в том, что в зависимости от территориальной привязки, информация об адресах хранится в различных организациях и почему-то не соблюдается единый стандарт. Я не большой знаток службы whois, но меня это порядком удивило. К примеру, если сделать whois 207.46.130.108, то поле со страной будет называться «Country», а если whois 217.10.40.1 - то «country», с маленькой буквы. Именно по этой причине ряд шаблонов начинаются как [c|C]ountry, здесь символ вертикальной черты обозначает логическое "or". В последней строчке напечатанного кода происходит запись информации о сетевом диапазоне в таблицу locations. [выводы] Я рассказал тебе о ключевых моментах создания системы управления ботами. Ты уже вполне можешь сам написать простенький сценарий с минимумом возможностей. Однако я также показал тебе, как прикрутить к системе определение географии пользователя, как реализовать сбор и хранение некоторых свойств бота, каким образом удобнее объединять ботов в различные группы. По большому счету, все самое главное я тебе рассказал. Осталось лишь реализовать возможность фильтрации ботов по параметрам (скажем, по стране, или городу), а также по передаваемым самим трояном свойствам бота (частота процессора, серый/белый адрес, объем жесткого диска и т.д.). Все это делается элементарно - простейшими манипуляциями с sql-запросами и обработкой xml-документов. И о том, и о другом мы с тобой уже много раз подробно говорили, поэтому проблем у тебя возникнуть не должно. В любом случае ты всегда можешь обратиться на наш диск и посмотреть, как это написал я. Удачи. |