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

Получить список файлов, открытых по сети, достаточно просто. Создадим новое приложение, поместим на него две кнопки - для просмотра открытых файлов и закрытия выделенного, а также компонент ТИБШеи - для отображения списка. Для компонента ТИзШеи создайте колонки со следующими именами:

• ГО - для отображения идентификатора;
• Путь - путь к открытому файлу;
• Пользователь - имя пользователя (учетная запись), открывшего файл;

• Блокировки - количество блокировок.

Пример главной формы будущей программы показан на рис. 5.18.

5.9.4. Просмотр открытых ресурсов

Рис. 5.18. Форма будущей программы

В разделе private объявления формы нам понадобятся уже знакомые переменные для хранения информации об ОС, а также хранения указателей загруженных динамических библиотек. Раздел private описывается таким образом:

private {Private declarations} bNT: Boolean:
fHandleNT. fHandle9x: THandle:

По событию OnShow определяем версию операционной системы, загружаем соответствующую библиотеку и ищем адреса двух функций - NetFi 1 eEnum и NetSessionCl ose, необходимых для решения задачи. Эти функции мы рассмотрим чуть позже, по мере написания кода программы. В листинге 5.24 приведен текст осуществления этих операций.

Листинг 5.24. Определение ОС, загрузка библиотеки и поиск функций

procedure TMonitorForm.FormShow(Sender: TObject): va г

ver: TOSVersionlnfo;
begin
ver.dwOSVersionlnfoSize :- SizeOf(TOSVersionlnfo):
GetVersionEx(Ver):
case Ver.dwPlatformld of
VER_PLATF0RM_WIN32_NT. bNT := True:
VER_PLATF0RM_WIN32_WIND0WS: bNT := False:
VER_PLATF0RM_WIN32s: bNT := False
end:
if bNT then begin
fHandleNT := LoadLibraryCNETAPI32.DLL');
(?NetFileEnumNT := GetProcAddress(fHandleNT. 'NetFi1eEnum").
<?NetFileCloseNT := GetProcAddress(fHandleNT. 'NetSessionClose'):
end
else
begin
fHandle9x := LoadLibraryCSVRAPI.DLL"):
@NetFi1eEnum := GetProcAddress(fHandle9x. 'NetFi1eEnum"):
PNetFileClose := GetPrùcAddress(fHandle9x. 'NetFileClose2"):
end: end:

По нажатии кнопки Показать мы должны получить информацию обо всех открытых файлах. Воспользуемся функцией NetFi 1 eEnumNT для NT-систем и NetFi 1 eEnum для Windows 9х. Код, который нужно написать по нажатии этой кнопки, показан в листинге 5.25.

Листинг 5.25. Определение списка открытых файлов procedure TMonitorForm.bnShowClick(Sender: TObject); var
FilelnfoNT: PFileInfo3Array;
FileInfo9x: array [0..1024] of TFileInfo502: i. iTE. iRE: Integer;
begin
1wResources.Items.CI ear;
if bNT then begin
// Далее идет код для NT-систем FilelnfoNT := nil;
if NetFileEnumNT(nil. nil. nil. 3. (PFilelnfoNT. DWORD(-l).
(PiRE. (PiТЕ. nil) <> 0 then
exit;
for 1 := 0 to iRE-1 do begin
with 1wResources.Iterns.Add do begin
Caption := stnng(IntToStr(FileInfoNT"[i].f13_id));
SubIterns.AddCFileInfoNT"[i].fi3_pathname): SubItems.Add(FileInfoNT"[i] fi3_username): Sub I terns. Add (I ntToSt r (Fi 1 e I nf oNr [ i ]. f i 3_num_l ock s));
end:
end;

end else begin // Далее идет код для 9х-систем

if NetFi leEnumC nil. nil. 50. (PFileInfo9x. Size0f(FileInfo9x).

(PiRE. (PiТЕ) <> 0 then exit:

for i -= 0 to iRE-1 do begin
with 1wResources.Items.Add do begin
Caption := string(IntToStr(FileIrifo9x[i].fi502_id)): SubItems.Add(FileInfo9x[i] fi502_pathname): Subltems.Add(Fi1elnfo9x[i].fi 502_username):
end:
end;
end. end:

Работа кода происходит в два этапа:

1. Определение списка открытых файлов с помощью функций NetFi 1 eEnumNT или NetFi 1 eEnum.

2. Заполнение списка Li stVi ew полученными значениями.

Функции NetFi 1 eEnumNT или NetFi 1 eEnum в Delphi описываются следующим образом:

function NetFi1eEnumNT( ServerName. BasePath.
UserName: PWideChar: Level: DWORD: BufPtr: Pointer: Prefmaxlen: DWORD;
EntriesRead. Total Entries. Resume_Handle: LPDWORD ): DWORD: stdcall;
function NetFileEnumC
pszServer.
pszBasePath: PChar:
sLevel: DWORD:
pbBuffer: Pointer;
cbBuffer: DWORD;
pcEntriesRead, pcTotalAvai1: poi nter ): integer: stdcall;

Большинство параметров схожи, поэтому подробно рассмотрим параметры для версии NT, как наиболее актуальной на данный момент:

• ServerName - имя сервера, на котором нужно просмотреть откр ытые файл ы. Для просмотра открытых ресурсов локального компьютера достаточно указать нулевое значение;
• BasePath - путь к ресурсам, внутри которых осуществляется поиск. Если.ука-зано нулевое значение, то будут показаны все ресурсы. Если указать папку C:\Windows, то будут отображены открытые ресурсы только этой папки;
• UserName - если указать имя учетной записи, то будут перечислены только те ресурсы, которые открыты пользователями с этой учетной записью. Для просмотра всех ресурсов задается нулевое значение;
• Level - уровень получения информации. Для NT-систем используется 3-й уровень, а для Эх-систем - 30-й уровень;
• BufPtr - указатель на буфер, через который будет возвращен массив структур с информацией об открытых ресурсах;
• Prefmaxl en - максимальное количество возвращаемых записей. Если указать -1, то будут возвращены все записи;
• EntriesRead - с помощью этого параметра возвращается действительное количество прочитанных ресурсов;
• Total Entries - с помощью этого параметра мы получим сведения об общем количестве записей в системе;

• Resume_Handl е - если вы запросили не все записи и увидели, что параметр Total Entries больше EntriesRead, то есть прочитаны не все записи, то в данном параметре можно указать запись, с которой нужно начать перечисление, чтобы получить оставшиеся записи.

Функции возвращают нам массив из структур. Для NT-систем это будет указатель на память, содержащую структуры THnaTFileInfo3, а для Windows 9х - массив THnaTFi 1 elnf о502. Данные структуры описываются в заголовочном файле следующим образом:

// Для NT-систем TFileInfo3 - packed record

fi3_id: DWORD:
fi3_permissions: DWORD;
fi3_num_locks: DWORD:
fi3_pathname: PWideChar;
fi3_username: PWideChar:
end;

// Для Windows 9x TFileInfo502 = packed record

fi502_id: Cardinal:
fi502_permissions: WORD;
fi502_num_locks: WORD;
fi502_pathname: PChar;
fi502_username: PChar:
fi502_sharename: PChar;
end:

Рассмотрим параметры структуры TFileInfo3, для TFileInfo502 они имеют схожее значение:

• fi3_id - идентификатор, который связан с открытым ресурсом;

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

О PERMFILEREAD - разрешено читать данные;
О PERMFILEWRITE - разрешено записывать данные;
О PERM_FILE_CREATE - разрешено создавать файл;
• fi3_num_locks - определяет количество блокировок на файл, устройство или канал;
• fi3_pathname - путь к открытому ресурсу;

• fi3_username - учетная запись пользователя, под которой он открыл файл.

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

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

Можно заметить, что в сети есть один открытый файл, и пользователь GUEST получил доступ к папке E:\net.

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

ПРИМЕЧАНИЕ -

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге Sources\ch05\MonitorResource.

5.9.3. Закрытие сессий || Оглавление || 5.9.5. Закрытие открытых ресурсов


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31