Содержание
Введение |
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.