Содержание Введение 1 Анализ поставленной задачи 2 Разработка алгоритма работы программы 3 Кодирование программы 4 Проверка и отладка программы 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.MsRoundTripTim e>=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.Repl yStatus.BytesReceived)); SubItems.Add(inttostr(IdIcmpClient1.Repl yStatus.MsRoundTripTime)); SubItems.Add(inttostr(IdIcmpClient1.Repl yStatus.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<k1) then 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(PC har(IPAddr)); HostEnt:=GetHostByAddr(@SockAddrIn.sin_a ddr.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].dwI nOctets)); //Всего принято байт SubItems.Add(IntToStr(Table.Table[i].dwO utOctets)); //Всего отправлено байт 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(TimeZoneInformati on); 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.Sta ndardName); end; else Data := Data - ((TimeZoneInformation.Bias + TimeZoneInformation.DaylightBias) / MinPerDay); Result := DateTimeToStr(Data) + + WideCharToString(TimeZoneInformation.Day lightName); 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^.
LeaseObtai ned)); // Время устаревания данных от сервера tvInterfaces.Items.AddChild(DHCPTree, 'LeaseExpires: ' + TimeToDateTimeStr(TmpPointer^.LeaseExpir es)); 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.IpA ddress.S)); // запасной
WINS tvInterfaces.Items.AddChild(WinsTree, 'SecondaryWinsServer: ' + String(TmpPointer^.SecondaryWinsServer.I pAddress.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 = $9801; 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,@ListenThrea d,
Form1.TV1,0,ThID); if hThread=0 then ShowMessage(SysErrorMessage(GetLastError )); end; end.
! |
Как писать рефераты Практические рекомендации по написанию студенческих рефератов. |
! | План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом. |
! | Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач. |
! | Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты. |
! | Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ. |
→ | Виды рефератов Какими бывают рефераты по своему назначению и структуре. |