Программирование на C++ глазами хакера

Работа с ресурсами сетевого окружения


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

Когда приложение использует файл, то ОС сначала определяет устройство, на котором находится необходимый ресурс. Если ресурс расположен на удаленном компьютере, то запрос на ввод/вывод передается по сети этому устройству. Таким образом, ОС при обращении к сетевому ресурсу занимается перенаправлением ввода/вывода (I/O redirection).

Допустим, что у вас диск Z: — это подключенная по сети папка с удаленного компьютера. Каждый раз, когда вы обращаетесь к ней, ОС будет переадресовывать запросы ввода/вывода перенаправителю (redirector), который создаст сетевой канал связи с удаленным компьютером для доступа к его ресурсам. Таким образом, можно использовать те же средства, что и для доступа к локальным ресурсам. Это сильно облегчает создание приложений, предназначенных для работы в локальной сети. Точнее сказать, никаких изменений вносить не надо. Если программа умеет работать с локальным диском, то сможет работать и с удаленными дисковыми ресурсами.

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

Чтобы обеспечить доступ к ресурсам другого компьютера в вашей сети, не обязательно подключать открытую папку как локальный диск. Достаточно правильно написать сетевой путь. Для этого надо знать универсальные правила именования (Universal Naming Conversion , UNC) — способ доступа к файлам и устройствам (например, к принтерам) без назначения им буквы локального диска. Тогда вы не будете зависеть от имен дисков, но нужно будет четко определить имя компьютера, на котором находится нужный объект.


Общий вид UNC-имени выглядит следующим образом:

\\компьютер\имя\путь

Имя начинается с двойной косой черты (\\). Затем идет имя компьютера или сервера, на котором расположен объект, имя — это имя сетевой папки. После этого нужно указать путь к объекту.

Допустим, что у вас есть компьютер Тоm, на котором открыта для общего доступа папка Sound. В этой папке есть файл MySound.wav. Для доступа к этому файлу необходимо использовать UNC-имя: \\Tom\Sound\MySound.wav.

В листинге 4.1 приведен пример создания файла в открытой папке компьютера с именем Notebook.



Листинг 4.1. Пример создания файла в открытой папке другого компьютера
void CreateNetFile() { HANDLE FileHandle; DWORD BWritten;

// Create file \\notebook\temp\myfile.txt // Создание файла \\notebook\temp\myfile.txt if ((FileHandle = CreateFile("\\\\notebook\\temp\\myfile.txt", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL )) == INVALID_HANDLE_VALUE) { MessageBox(0, "Create file error", "Error",0); return; }

// Write to file 9 symbols // (Записать в файл 9 символов) if (WriteFile(FileHandle, "Test line", 9, BWritten, NULL)== 0) { MessageBox(0, "Write to file error", "Error",0); return; }

// Close file (Закрыть файл) CloseHandle(FileHandle); }

Для начала создается файл с помощью стандартной WinAPI -функции CreateFile . У этой функции следующие параметры:

путь к создаваемому файлу;

режим доступа — файл открыт для чтения (GENERIC_READ) и записи (GENERIC_WRITE);

режим доступа к открытому файлу другим профаммам — другим приложениям разрешено чтение (FILE_SHARE_READ) и запись (FILE_SHARE_WRITE);

атрибуты безопасности — не использованы (NULL);

способ открытия файла — всегда создавать (CREATE_ALWAYS), если файл уже существует, то данные будут перезаписаны;

атрибуты создаваемого файла — нормальное состояние файла (FILE_ATTRIBUTE_NORMAL);

указатель на шаблон, который будет использоваться при создании файла.



Функция CreateFile возвращает указатель на открытый файл. Если результат равен INVALID_HANDLE_VALUE, то файл не был создан по каким-либо причинам.

Для записи используется функция WriteFile, у которой следующие параметры:

указатель на открытый файл;

данные, которые надо записать;

количество байт данных для записи;

количество записанных байт (переменную типа DWORD);

структура, которая необходима только при открытии файла в режиме наложения (overlapped I/O).

Если запись прошла успешно, то функция должна вернуть ненулевое значение.

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

Примечание
Исходный код примера вы можете найти на компакт - диске в каталоге \Demo\Chapter4\Network.

Содержание раздела