Вход

Разработка средств программного мониторинга

Курсовая работа* по программированию
Дата добавления: 13 июня 2011
Язык курсовой: Русский
Word, rtf, 5.2 Мб (архив zip, 267 кб)
Курсовую можно скачать бесплатно
Скачать
Данная работа не подходит - план Б:
Создаете заказ
Выбираете исполнителя
Готовый результат
Исполнители предлагают свои условия
Автор работает
Заказать
Не подходит данная работа?
Вы можете заказать написание любой учебной работы на любую тему.
Заказать новую работу
* Данная работа не является научным трудом, не является выпускной квалификационной работой и представляет собой результат обработки, структурирования и форматирования собранной информации, предназначенной для использования в качестве источника материала при самостоятельной подготовки учебных работ.
Очень похожие работы



Содержание


Введение

4

1

Анализ поставленной задачи

6

2

Разработка алгоритма работы программы

7

3

Кодирование программы

9

4

Проверка и отладка программы

10

5

Оценка результатов работы программы

12

Заключение

13

Литература

14

Приложение А. Блок-схема алгоритма работы программы

15

Приложение Б. Листинги модулей программы

16


Введение


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

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

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

- целостности данных - защита от сбоев, ведущих к потере информации или ее уничтожения;

- конфиденциальности информации;

- доступности информации для авторизованных пользователей.

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

Средства для мониторинга сети и обнаружения в её работе «узких мест» можно разделить на два основных класса:

- стратегические;

- тактические.

Назначение стратегических средств состоит в контроле за широким спектром параметров функционирования всей сети и решении проблем конфигурирования ЛВС, тактических – мониторинг и устранение неисправностей сетевых устройств и сетевого кабеля.

К стратегическим средствам относятся:

- системы управления сетью;

- встроенные системы диагностики;

- распределённые системы мониторинга;

- средства диагностики операционных систем, функционирующих на больших машинах и серверах.

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

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

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


1 Анализ поставленной задачи


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

Предполагается разработать программу на подобие сниффера.

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

В программе будут реализованы следующие функции:

1. Определения скорости соединения и 'живости' удаленного компьютера (команда ping). Эта задача осуществляется путём посылки Echo-сообщений протокола ICMP c последовательным перебором всех адресов сети или отправкой Echo-сообщения по широковещательному адресу. Анализируя трафик и отслеживая Echo-сообщения, посылаемые за короткий промежуток времени всем узлом, можно выявить попытки сканирования (будет указываться диапазон сканирования).

2. Сканирование всех протоколов используемых в текущий момент времени с помощью Winsock. Сокеты — это транспортный механизм, который чаще всего используется в высокопроизводительных серверных приложениях. Библиотека Win32 Windows Sockets (Winsock) предоставляет механизмы, которые повышают быстродействие программ, использующих сокеты.

3. Определения сетевой активности компьютера с помощью команд Windows «netstat». Она используется например, чтобы узнать, с каким сайтом соединяется какая-либо программа.

4. Проверка на наличие подключения по локальной сети, наличие сетевых интерфейсов с помощью подгружаемой библиотеки Windows «iphlpapi.dll».







2 Разработка алгоритма работы программы


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

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

Вывод меню пользователя (НАЧАЛО):

- сканирование методом ping;

- сканирование сетевых интерфейсов;

- сканирование с помощью netstat и Winsock;

- завершение работы программы.

В зависимости от действия пользователя (блок 1), выбранного методов сканирования (блоки 2, 4, 6) вызываются соответствующие процедуры Ping, Winsock, iphlpapi, netstat (блоки 3, 5, 7,8).

Результаты процессов сканирования выводятся в таблицы (адреса, время прохождения пакетов, название сетевых интерфейсов и т.п.).

Если выбрано завершение работы программы осуществляется выход (КОНЕЦ).

Процедура проверки IP-адресов.

Проверяется длина введенной строки (15 символов), затем она разбивается на группы. Символы – 1-3, 5-7, 9-11, 13-15 – каждая тройка проверяется на соответствие диапазону от 0 до 255. Затем для диапазона адресов проверяются первые три группы символов на равенство, последняя – на соответствие верхнего (большего) и нижнего (меньшего) значения. Если проверка введенных адресов прошла без ошибок, то выполняется процедура сканирования ping.

Процедура сканирования ping.

Для выполнения сканирования сетевых ресурсов используется диапазон IP-адресов. В цикле от верхней границы до нижней осуществляется посылка сообщения на указанные адреса, в течении 1500с если ответ не пришел от адреса, значит он считается недоступным. В противном случае выводится информация пингования (длина отправленного сообщения, время ответа от исследуемого адреса, время жизни сообщения).

Процедура определения сетевых подключений.

Определяется наличие сетевых интерфейсов на локальном компьютере и информацию о них. Далее считываются все IP адреса со всех присутствующих в системе сетевых интерфейсов. Далее осуществляется вывод полученных данных.

Далее определяются текущие активные соединения, выводится информация об интерфейсе и количестве переданных и принятых данных.

Сканирование приложений с помощью Netstat

В Windows эта команда имеется, для ее использования осуществляется вызов командной строки и выполнение команды «netstat -abn», полученные данные сохраняются в текстовый файл «log.txt». После чего выводится преобразованная информация о текущих приложениях использующих сетевые ресурсы.


3 Кодирование программы


Разработанный алгоритм работы программы реализуется на языке программирования Delphi.

Программа состоит из нескольких модулей:

Основной модуль (unit1.pas) – содержит список подключаемых модулей, список его процедур:

Function TForm1.ping_ip(s: string): Boolean; - осуществление опроса указанного IP-адреса, результат возвращается «истина» если ответ получен <=1500c.

Function TForm1.ValidIp:boolean; - осуществление проверки правильности введения границ сканирования.

Procedure TForm1.BitBtn1Click(Sender: TObject); - выполняется цикл сканирования введенных адресов от начального до конечного и вывод полученной информации в таблицу.

Procedure TForm1.Bitbtn2Click(Sender: TObject); - в данной процедуре вызывается процедура сканирования протоколов, и выполняется преобразование и вывод полученной информации от выполнено в командной строке функции Netstat.

Procedure TForm1.FormCreate(Sender: TObject); - выполняется вызов командной строки и выполнение Netstat.

Модуль сканирования Connect (Connect.pas) – в нем описана структура получения имен сетевых интерфейсов, отображение активного подключения, информации о количестве переданных и принятых данных.

Модуль сканирования NetIFEnum (NetIFEnum.pas) – содержит функции для получения сведений о типах имеющихся сетевых адаптеров, их адресов.

Модуль Tracer (Tracer.pas) – содержит процедуры и функции для проверки активных сетевых подключениях, вывод информации от какого адреса передаются данные и т.п.

Листинг модулей программы приведен в приложении Д.



4 Проверка и отладка программы


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

- Процессор Pentium III и выше;

- ОЗУ 256МБ и выше;

- наличие сетевых ресурсов (Network, Lan, Internet);

- ОС Windows XP.

На этапе генерации кода при возникновении ошибок (например: неверный вывод информации о сетевых подключениях, зависание программы, неверные размер переменных и т.д.) использовались точки останова, трассировка, имеющиеся в Delphi, с помощью данных процедур поиск ошибок облегчается.

Результаты работы программы представлены на рисунке 1 – рисунке 3

Рисунок 1. Сканирование протоколов и активных программ



Рисунок 2. – Определение сетевых интерфейсов

Рисунок 3 – Сканирование диапазона адресов


5 Оценка результатов работы программы


Результаты работы программы отображают выполнение всех перечисленных функций. Но имеются недоработки в программе, следует для использования сканирования диапазона адресов не встроенный компонент Delphi IdIcmpClient, а любую другую структуру формирования команды ping, т.к. встроенная имеет недостаток – при сканировании большого диапазона адресов программа зависает и только после сканирования к ней возвращается управление. Так же можно добавить вывод имени домена по IP-адресу.

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

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

Определение сетевой активности компьютера не ограничено использованными функциями, имеется и множество других Telnet, NetShare и т.д.














Заключение


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

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

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



Список литературы


1. Партыка Т.Л., Попов И.И. Информационная безопасность. Учебное пособие. – М.: ФОРУМ – ИНФА-М, 2005;

2. Романец Ю.В. Тимофеев П.А., Шаньгин В.Ф. Защита информации в компьютерных системах и сетях. М.: Радио и связь, 2001;

3. Delphi. Программирование на языке высокого уровня. Учебник для вузов / В.В. Фаронов.- СПб.: Питер. 2003. - 640 с: ил.

4. Фленов М.Е. Программирование в Delphi глазами хакера. – СПб.: БХВ - Петербург, 2003;

5. http://www.hackzone.ru/

6. http://book.itep.ru/4/44/

7. http://ru.wikipedia.org/wiki/

8. http://softsearch.ru/

9. http://sources.ru/security/attack2/

10. http://www.delphisources.ru/

11. http://www.webmaster.azolli.com/




Приложение А

(обязательное)


Рисунок А.1 - Блок – схема общего алгоритма работы программы




Приложение Б

(обязательное)

Листинг проекта Monitor.dpr

program Monitor;

uses

Forms,

Unit1 in 'Unit1.pas' {Form1},

Unit2 in 'Unit2.pas' {AboutBox},

Tracer in 'Tracer.pas',

Connect in 'Connect.pas',

NetIFEnum in 'NetIFEnum.pas';

{$R *.res}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.CreateForm(TAboutBox, AboutBox);

Application.Run;

end.

Листинг модуля Unit1.pas


unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Menus, StdCtrls, Buttons, Mask, ComCtrls,IdIcmpClient,winsock,

IdBaseComponent, IdComponent, IdRawBase, IdRawClient, ExtCtrls;

type

TForm1 = class(TForm)

PageControl1: TPageControl;

TabSheet1: TTabSheet;

TabSheet2: TTabSheet;

GroupBox2: TGroupBox;

Label1: TLabel;

Label2: TLabel;

BitBtn1: TBitBtn;

TV3: TListView;

MainMenu1: TMainMenu;

N1: TMenuItem;

N2: TMenuItem;

IdIcmpClient1: TIdIcmpClient;

Adr1: TMaskEdit;

Adr2: TMaskEdit;

TVs: TListView;

TabSheet3: TTabSheet;

BitBtn2: TBitBtn;

TV1: TListView;

StatusBar1: TStatusBar;

Timer1: TTimer;

BitBtn3: TBitBtn;

Label3: TLabel;

Label4: TLabel;

BitBtn4: TBitBtn;

TVnt: TTreeView;

Memo1: TMemo;

Label5: TLabel;

procedure N2Click(Sender: TObject);

procedure N1Click(Sender: TObject);

function ping_ip(s: string): Boolean;

procedure BitBtn1Click(Sender: TObject);

procedure FormShow(Sender: TObject);

Function ValidIp:boolean;

Приложение Б

(продолжение)



procedure TV1Change(Sender: TObject; Item: TListItem;Change: TItemChange);

procedure Bitbtn2Click(Sender: TObject);

procedure TV3Change(Sender: TObject; Item: TListItem;Change: TItemChange);

procedure Button1Click(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses Unit2,Tracer,Connect,NetIFEnum;

{$R *.dfm}

function TForm1.ping_ip(s: string): Boolean;

begin

IdIcmpClient1.Host:=s;

IdIcmpClient1.Ping;

if IdIcmpClient1.ReplyStatus.MsRoundTripTime>=1500 then

begin

Result:=False;

with tv3.Items.Add do begin //5

Caption :=(IdIcmpClient1.Host);

SubItems.Add('n/a');

end; //5

end

else

begin

Result:=True;

with tv3.Items.Add do begin//4

Caption :=IdIcmpClient1.Host;

SubItems.Add(inttostr(IdIcmpClient1.ReplyStatus.BytesReceived));

SubItems.Add(inttostr(IdIcmpClient1.ReplyStatus.MsRoundTripTime));

SubItems.Add(inttostr(IdIcmpClient1.ReplyStatus.TimeToLive));

end;//4

end;

end;

procedure TForm1.N2Click(Sender: TObject);

begin

close;

end;

procedure TForm1.N1Click(Sender: TObject);

begin

AboutBox.show;

end;

Function TForm1.ValidIp:boolean;

var n,s,e,k:string[3];

n1,s1,e1,k1:string[3];

begin

ValidIp:=false;

n:=copy(adr1.Text, 1, 3); n1:=copy(adr2.Text, 1, 3);

s:=copy(adr1.Text, 5, 3); s1:=copy(adr2.Text, 5, 3);

e:=copy(adr1.Text, 9, 3); e1:=copy(adr2.Text, 9, 3);

k:=copy(adr1.Text, 13, 3); k1:=copy(adr2.Text, 13, 3);

if (n=n1) and (s=s1) and (e=e1) and (k

begin //1

if (strtoint(n)<=255) and (strtoint(n1)<=255) and (strtoint(s)<=255)

and (strtoint(s1)<=255) and (strtoint(e1)<=255)

Приложение Б

(продолжение)



and (strtoint(e)<=255) and (strtoint(k1)<=255)

and (strtoint(k)<=255) then ValidIp:=True

end//1

else MessageDlg('Неверный диапазон адресов', mtError,[mbOk], 0);

end;

function IPAddrToName(IPAddr: string): string;

var

SockAddrIn: TSockAddrIn;

HostEnt: PHostEnt;

WSAData: TWSAData;

begin

WSAStartup($101, WSAData);

SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(IPAddr));

HostEnt:=GetHostByAddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);

if HostEnt<>nil then Result:=StrPas(Hostent^.h_name)

else Result:='n/a';

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

var ip_na4alo,ip_konec:integer;

ip:string;

begin //0

if validip then

begin //2

ip:=copy(adr1.text,1,12);

ip_na4alo:=strtoint(copy(adr1.text,13,3));

ip_konec:=strtoint(copy(adr2.text,13,3));

while ip_na4alo<>(ip_konec+1) do

begin

ip:=copy(adr1.text,1,12);

ip:=ip+inttostr(ip_na4alo);

ping_ip(ip);// then //адрес овтетил

ip_na4alo:=ip_na4alo+1;

end;

end;//2

end;//0

procedure TForm1.FormShow(Sender: TObject);

begin

adr1.Text:='192.168.001.001';

adr2.Text:='192.168.001.004';

end;

procedure TForm1.TV1Change(Sender: TObject; Item: TListItem; Change: TItemChange);

begin

TV1.Scroll(0,Item.Position.y);

end;

procedure TForm1.Bitbtn2Click(Sender: TObject);

var

ms : TMemoryStream;

s:string;

begin

TCreate;

//если русская ОС, то переводим текст в русский вот так:

ms := TMemoryStream.Create;

ms.LoadFromFile('log.txt');

OEMToCharBuff(ms.Memory, ms.Memory, ms.Size);

SetString(s, PAnsiChar(ms.Memory), ms.Size);

ms.Free;

memo1.Lines.Add(s);

memo1.Lines.Insert(0,'a');

memo1.Lines.delete(0);

end;

Приложение Б

(продолжение)



procedure TForm1.TV3Change(Sender: TObject; Item: TListItem;

Change: TItemChange);

begin

TV3.Scroll(0,Item.Position.y);

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Timer1.Enabled:=true;

ReadLanInterfaces(TVnt);

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

tmrTraff(TVs);

Label3.Caption:=DateTimetostr(date+time);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

Timer1.Enabled:=false;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

if WinExec(PAnsiChar('cmd /u /c netstat -abn > log.txt'), SW_HIDE)>31 then

BitBtn2.Enabled:= true // выполняем команду и сохраняем лог в log.txt

else Bitbtn2.Enabled:=false;

end;

end.

Листинг модуля Connect.pas

unit Connect;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, ComCtrls;

procedure tmrTraff(lvTraffic:TListView);

type

TMibIfRow = packed record

wszName : array[0..255] of WideChar; //Указатель на строку содержащую имя интерфейса

dwIndex : DWORD;//Определяет индекс интерфейса

dwType : DWORD; //Определяет тип интерфейса (см. MSDN)

dwMtu : DWORD; //Определяет максимальную скорость передачи

dwSpeed : DWORD; //Определяет текущую скорость передачи в битах в секунду

dwPhysAddrLen : DWORD;//Определяет длину адреса содержащегося в bPhysAddr

bPhysAddr : array[0..7] of Byte;// Содержит физический адрес интерфейса (если проще то его, немного видоизмененный, МАС адрес)

dwAdminStatus : DWORD;//Определяет активность интерфейса

dwOperStatus : DWORD; // Содержит текущий статус интерфейса (см. MSDN)

dwLastChange : DWORD;// Содержит последний измененный статус

dwInOctets : DWORD;// Содержит количество байт принятых через интерфейс

dwInUcastPkts : DWORD; // Содержит количество направленных пакетов принятых интерфейсом

dwInNUCastPkts : DWORD; //Содержит количество ненаправленных пакетов принятых интерфейсом (включая Броадкаст и т.п.)

dwInDiscards : DWORD;// Содержит количество забракованных входящих пакетов (даже если они не содержали ошибки)

dwInErrors : DWORD; // Содержит количество входящих пакетов содержащих ошибки

dwInUnknownProtos : DWORD;// Содержит количество забракованных входящих пакетов со структурой неизвестного протокола

dwOutOctets : DWORD; //Содержит количество байт отправленных интерфейсом

dwOutUCastPkts : DWORD; //Содержит количество направленных пакетов отправленных интерфейсом

dwOutNUCastPkts : DWORD; //Содержит количество ненаправленных пакетов отправленных интерфейсом (включая Броадкаст и т.п.)

dwOutDiscards : DWORD; //Содержит количество забракованных исходящих пакетов (даже если они не содержали ошибки)

dwOutErrors : DWORD; // Содержит количество исходящих пакетов содержащих ошибки

Приложение Б

(продолжение)



dwOutQLen : DWORD; // Содержит длину очереди данных

dwDescrLen : DWORD; //Содержит размер массива bDescr

bDescr : array[0..255] of Char;// Содержит описание интерфейса

end;

TMibIfArray = array [0..512] of TMibIfRow;

PMibIfRow = ^TMibIfRow;

PmibIfArray = ^TmibIfArray;

TMibIfTable = packed record

dwNumEntries : DWORD;

Table : TMibIfArray;

end;

PMibIfTable = ^ TMibIfTable;

var

GetIfTable:function(pIfTable: PMibIfTable;pdwSize : PULONG;bOrder : Boolean ): DWORD; stdcall;


implementation

procedure tmrTraff(lvTraffic:TListView);

// Вспомогательная функция, преобразующая МАС адрес к "нормальному" виду

//Определяем специальный тип, чтобы можно было передать в функцию массив

type TMAC = array [0..7] of Byte;

//В качестве первого значения массив, второе значение, размер данных в массиве

function GetMAC(Value: TMAC; Length: DWORD): String;

var

i: Integer;

begin

if Length = 0 then Result := '00-00-00-00-00-00' else

begin

Result := '';

for i:= 0 to Length -2 do

Result := Result + IntToHex(Value[i],2)+'-';

Result := Result + IntToHex(Value[Length-1],2);

end;

end;

//Сама процедура

var

FLibHandle : THandle;

Table : TMibIfTable;

i : Integer;

Size : Integer;

begin

lvTraffic.Items.BeginUpdate;

lvTraffic.Items.Clear; //Очищение списка

FLibHandle := LoadLibrary('IPHLPAPI.DLL'); //Загрузка библиотеки

if FLibHandle = 0 then Exit;

@GetIfTable := GetProcAddress(FLibHandle, 'GetIfTable');

if not Assigned(GetIfTable) then

begin

FreeLibrary(FLibHandle);

exit;

end;

Size := SizeOf(Table);

if GetIfTable(@Table, @Size, False ) = 0 then //Выполнение функции

for i:= 0 to Table.dwNumEntries-1 do begin

with lvTraffic.Items.Add do begin //Вывод результата

Caption := String(Table.Table[i].bDescr); //Наименование интерфейса

SubItems.Add(GetMAC(TMAC(Table.Table[i].bPhysAddr),

Table.Table[i].dwPhysAddrLen)); //MAC адрес

SubItems.Add(IntToStr(Table.Table[i].dwInOctets)); //Всего принято байт

SubItems.Add(IntToStr(Table.Table[i].dwOutOctets)); //Всего отправлено байт

end;

end;

Приложение Б

(продолжение)



lvTraffic.Items.EndUpdate;

FreeLibrary(FLibHandle);

end;

end.

Листинг модуля NetIFEnum.pas


unit NetIFEnum;

interface

uses

Windows, SysUtils, Classes, Controls, Forms, ComCtrls;

const

MAX_ADAPTER_NAME_LENGTH = 256;

MAX_ADAPTER_DESCRIPTION_LENGTH = 128;

MAX_ADAPTER_ADDRESS_LENGTH = 8;

IPHelper = 'iphlpapi.dll';

// Типы адаптеров

MIB_IF_TYPE_OTHER = 1;

MIB_IF_TYPE_ETHERNET = 6;

MIB_IF_TYPE_TOKENRING = 9;

MIB_IF_TYPE_FDDI = 15;

MIB_IF_TYPE_PPP = 23;

MIB_IF_TYPE_LOOPBACK = 24;

MIB_IF_TYPE_SLIP = 28;

type

// Структуры для выполнения GetAdaptersInfo

time_t = Longint;

IP_ADDRESS_STRING = record

S: array [0..15] of Char;

end;

IP_MASK_STRING = IP_ADDRESS_STRING;

PIP_MASK_STRING = ^IP_MASK_STRING;

PIP_ADDR_STRING = ^IP_ADDR_STRING;

IP_ADDR_STRING = record

Next: PIP_ADDR_STRING;

IpAddress: IP_ADDRESS_STRING;

IpMask: IP_MASK_STRING;

Context: DWORD;

end;

PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;

IP_ADAPTER_INFO = record

Next: PIP_ADAPTER_INFO;

ComboIndex: DWORD;

AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;

Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;

AddressLength: UINT;

Address: array [0..MAX_ADAPTER_ADDRESS_LENGTH - 1] of BYTE;

Index: DWORD;

Type_: UINT;

DhcpEnabled: UINT;

CurrentIpAddress: PIP_ADDR_STRING;

IpAddressList: IP_ADDR_STRING;

GatewayList: IP_ADDR_STRING;

DhcpServer: IP_ADDR_STRING;

HaveWins: BOOL;

PrimaryWinsServer: IP_ADDR_STRING;

SecondaryWinsServer: IP_ADDR_STRING;

LeaseObtained: time_t;

LeaseExpires: time_t;

end;

procedure ReadLanInterfaces(tvInterfaces:tTreeView);

// При помощи данной функции определяется наличие сетевых интерфейсов

Приложение Б

(продолжение)



// на локальном компьютере и информацию о них

function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;

var pOutBufLen: ULONG): DWORD; stdcall; external IPHelper;

implementation

// Считывание всех IP адреса со всех присутствующих

// в системе сетевых интерфейсов

procedure ReadLanInterfaces(tvInterfaces:TTreeView);

function MACToStr(Addr: array of Byte; Len: Integer): String;

var

I: Integer;

begin

if Len = 0 then Result := '00-00-00-00-00-00' else

begin

Result := '';

for I := 0 to Len - 2 do

Result := Result + IntToHex(Addr[I], 2) + '-';

Result := Result + IntToHex(Addr[Len - 1], 2);

end;

end;

function TimeToDateTimeStr(Value: Integer): String;

const

UnixDateDelta = 25569; // количество дней между 12.31.1899 и 1.1.1970

MinPerDay = 24 * 60;

SecPerDay = 24 * 60 * 60;

var

Data: TDateTime;

TimeZoneInformation: TTimeZoneInformation;

AResult: DWORD;

begin

Result := '';

if Value = 0 then Exit;

// Формат Unix-ового TIME_T кол-во секунд от 1.1.1970

Data := UnixDateDelta + (Value / SecPerDay);

AResult := GetTimeZoneInformation(TimeZoneInformation);

case AResult of

TIME_ZONE_ID_INVALID: RaiseLastOSError;

TIME_ZONE_ID_STANDARD:

begin

Data := Data - ((TimeZoneInformation.Bias +

TimeZoneInformation.StandardBias) / MinPerDay);

Result := DateTimeToStr(Data) + ' ' +

WideCharToString(TimeZoneInformation.StandardName);

end;

else

Data := Data - ((TimeZoneInformation.Bias +

TimeZoneInformation.DaylightBias) / MinPerDay);

Result := DateTimeToStr(Data) + ' ' +

WideCharToString(TimeZoneInformation.DaylightName);

end;

end;

var

InterfaceInfo,

TmpPointer: PIP_ADAPTER_INFO;

IP: PIP_ADDR_STRING;

Len: ULONG;

AdapterTree, IPAddrTree, DHCPTree, WinsTree: TTreeNode;

AdapterType: String;

begin

// сколько памяти нам требуется?

if GetAdaptersInfo(nil, Len) = ERROR_BUFFER_OVERFLOW then

begin

Приложение Б

(продолжение)



// Берется нужное кол-во

GetMem(InterfaceInfo, Len);

try

// выполнение функции

if GetAdaptersInfo(InterfaceInfo, Len) = ERROR_SUCCESS then

begin

// Перечисление всех сетевых интерфейсов

TmpPointer := InterfaceInfo;

repeat

// Имя сетевого интерфейса

AdapterTree := tvInterfaces.Items.Add(nil, 'Adapted: ' + TmpPointer^.AdapterName);

// Описание сетевого интерфейса

tvInterfaces.Items.AddChild(AdapterTree, 'Description: ' + TmpPointer^.Description);

// МАС Адрес

tvInterfaces.Items.AddChild(AdapterTree, 'МАС: ' +

MACToStr(TmpPointer^.Address, TmpPointer^.AddressLength));

// Индекс адаптера в списке

tvInterfaces.Items.AddChild(AdapterTree, 'Index: ' +

IntToStr(TmpPointer^.Index));

// Тип адаптера

case TmpPointer^.Type_ of

MIB_IF_TYPE_OTHER: AdapterType := 'MIB_IF_TYPE_OTHER';

MIB_IF_TYPE_ETHERNET: AdapterType := 'MIB_IF_TYPE_ETHERNET';

MIB_IF_TYPE_TOKENRING: AdapterType := 'MIB_IF_TYPE_TOKENRING';

MIB_IF_TYPE_FDDI: AdapterType := 'MIB_IF_TYPE_FDDI';

MIB_IF_TYPE_PPP: AdapterType := 'MIB_IF_TYPE_PPP';

MIB_IF_TYPE_LOOPBACK : AdapterType := 'MIB_IF_TYPE_LOOPBACK';

MIB_IF_TYPE_SLIP : AdapterType := 'MIB_IF_TYPE_SLIP';

else

AdapterType := 'Unknown';

end;

tvInterfaces.Items.AddChild(AdapterTree, 'Type: ' + AdapterType);

// определение активности DHCP

if Boolean(TmpPointer^.DhcpEnabled) then

begin

DHCPTree := tvInterfaces.Items.AddChild(AdapterTree, 'DHCP: Enabled');

// Адрес DHCP сервера

tvInterfaces.Items.AddChild(DHCPTree, 'DHCP IP Addr: ' +

String(TmpPointer^.DhcpServer.IpAddress.S));

// Время получения данных от сервера

tvInterfaces.Items.AddChild(DHCPTree, 'LeaseObtained: ' +

TimeToDateTimeStr(TmpPointer^.LeaseObtained));

// Время устаревания данных от сервера

tvInterfaces.Items.AddChild(DHCPTree, 'LeaseExpires: ' +

TimeToDateTimeStr(TmpPointer^.LeaseExpires));

end

else

tvInterfaces.Items.AddChild(AdapterTree, 'DHCP: Disabled');

// перечислиние всех IP адресов интерфейса

IP := @TmpPointer.IpAddressList;

IPAddrTree := tvInterfaces.Items.AddChild(AdapterTree, 'IP Addreses:');

repeat

tvInterfaces.Items.AddChild(IPAddrTree, Format('IP: %s, SubNetMask: %s',

[String(IP^.IpAddress.S), String(IP^.IpMask.S)]));

IP := IP.Next;

until IP = nil;

// основной шлюз:

tvInterfaces.Items.AddChild(AdapterTree, 'Default getaway: ' +

TmpPointer^.GatewayList.IpAddress.S);

// Windows Internet Name Service

if TmpPointer^.HaveWins then

Приложение Б

(продолжение)



begin

WinsTree := tvInterfaces.Items.AddChild(AdapterTree, 'WINS: Enabled');

// основной WINS

tvInterfaces.Items.AddChild(WinsTree, 'PrimaryWinsServer: ' +

String(TmpPointer^.PrimaryWinsServer.IpAddress.S));

// запасной WINS

tvInterfaces.Items.AddChild(WinsTree, 'SecondaryWinsServer: ' +

String(TmpPointer^.SecondaryWinsServer.IpAddress.S));

end

else

tvInterfaces.Items.AddChild(AdapterTree, 'WINS: Disabled');


TmpPointer := TmpPointer.Next;

until TmpPointer = nil;

end;

finally

// Освобождение занятой память

FreeMem(InterfaceInfo);

end;

end;

end;

end.


Листинг модуля Tracer.pas

unit Tracer;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ComCtrls, Winsock;

const

MAX_PACKET_SIZE = $10000;

SIO_RCVALL = $98000001;

procedure TCreate;

procedure TClose;

type

USHORT = Word;

TIPHeader = record

iph_verlen: UCHAR;

iph_tos: UCHAR;

iph_length: USHORT;

iph_id: USHORT;

iph_offset: USHORT;

iph_ttl: UCHAR;

iph_protocol: UCHAR;

iph_xsum: USHORT;

iph_src: ULONG;

iph_dest: ULONG;

end;

PIPHeader = ^TIPHeader;

var

Buffer: array [0..MAX_PACKET_SIZE] of Char;

flag: Integer;

hThread: Cardinal;

implementation

uses Unit1;

procedure TClose;

begin

while not TerminateThread(hThread,0) do Sleep(500);

end;

procedure ListenThread(LV: TListView); stdcall;

Приложение Б

(продолжение)



var

lowbyte, hibyte: USHORT;

wsadata: TWSAData;

s: TSocket;

name: array [0..128]of Char;

phe: PHostent;

sa: TSockAddrIn;

sa1: TInAddr;

count: Integer;

hdr: PIPHeader;

begin

flag:=1;

WSAStartup(MAKEWORD(2,2), wsadata);

s := socket(AF_INET, SOCK_RAW, IPPROTO_IP);

gethostname(name, sizeof(name));

phe := gethostbyname(name);

ZeroMemory(@sa, sizeof(sa));

sa.sin_family := AF_INET;

sa.sin_addr.s_addr := cardinal(pointer(phe^.h_addr_list^)^);

bind(s, sa, sizeof(TSockaddr));

ioctlsocket(s, SIO_RCVALL, flag);

repeat

count := recv(s, Buffer, sizeof(Buffer), 0);

if (count >= sizeof(TIPHeader)) then

with LV.Items.Add do

begin

hdr := @Buffer;

Caption:= TimeToStr(Time);

case hdr.iph_protocol of

IPPROTO_TCP: SubItems.Add('TCP');

IPPROTO_UDP: SubItems.Add('UDP');

IPPROTO_RAW: SubItems.Add('RAW');

IPPROTO_ICMP: SubItems.Add('ICMP');

IPPROTO_IGMP: SubItems.Add('IGMP');

IPPROTO_IP: SubItems.Add('IP');

else SubItems.Add('Неизвестен') end;

sa1.s_addr := hdr.iph_src;

SubItems.Add(inet_ntoa(sa1));

sa1.s_addr := hdr.iph_dest;

SubItems.Add(inet_ntoa(sa1));

lowbyte := hdr.iph_length shr 8;

hibyte := hdr.iph_length shl 8;

hibyte := hibyte + lowbyte;

SubItems.Add(IntToStr(hibyte));

SubItems.Add(IntToStr(hdr.iph_ttl));

end;

until false;

end;

procedure TCreate; //1

var

ThID: Cardinal;

begin

hThread:=CreateThread(nil,0,@ListenThread,Form1.TV1,0,ThID);

if hThread=0 then ShowMessage(SysErrorMessage(GetLastError));

end;

end.



© Рефератбанк, 2002 - 2024