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

         

Подвисшие файлы


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

Вспомните, как формируется сетевой путь:

\\Имя компьютера\диск\путь

Если нужно обратиться к локальному диску как сетевому, и при этом диск не является открытым, то после имени диска необходимо поставить знак $. Например, чтобы получить доступ к файлу myfile.txt на диске С:, нужно написать следующий путь:

\\MyComputer\C$\myfile.txt

Теперь самое интересное. В Windows нельзя создавать файлы с именами, содержащими знак ?, и проверка на такой знак делается на уровне ОС. Но если обращаться к файлу по сети, то проверка не выполняется. Если у вас есть сеть, то подключите любой сетевой диск другого компьютера. Допустим, что этому диску будет назначена буква е:. Теперь, если выполнить код из листинга 5.7, то программа зависнет, и снять ее будет невозможно.

Листинг 5.7. Создание неправильного файла по сети
if ((FileHandle = CreateFile("\\\\notebook\\e$\\?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 if (WriteFile(FileHandle, "Test line", 9, BWritten, NULL)== 0) { MessageBox(0, "Write to file error", "Error",0); return; }

// Close file CloseHandle(FileHandle);

В листинге 5.7 я пытался создать файл и записать в него 9 символов, как и в разд. 4.2. Но имя файла написано неверно (присутствует символ ?), поэтому создание невозможно, а проверка на недопустимый символ отсутствует. Именно поэтому программа зависает в ожидании ответа от ОС, которого не будет.



Примечание
Исходный код примера, описанного в этом разделе, вы можете найти на компакт - диске в каталоге \Demo\Chapter5\TestFile.



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