Альтернативні файлові потоки ntfs

Захватывая очередную NT-систему и устанавливая в нее свой самодельный шпионский софт, необходимо решать проблему хранения собираемой информации на компьютере жертвы. Зазвичай лог пишеться в простій файл в каталозі з великою кількістю файлів, наприклад, в system32.

Це поширений, але далеко не найкращий спосіб заховати інформацію на локальному комп'ютері. Є шанс, що користувач помітить зайвий, що постійно оновлюється файл, який раптом несподівано з'явився у нього в системному каталозі. Дописувати лог до вже існуючого файлу? Для початку треба знайти такий файл, додавання до якого інформації не зіпсує його вмісту. А як щодо того, щоб зберігати інфу в таке місце, яке не буде видно ні з провідника, ні з командного рядка, ні з будь-якого файлового менеджера? Таку можливість нам надає файлова система NTFS. На звичайної домашньої персоналке її рідко зустрінеш, так як більшість користувачів як і раніше вважають за краще FAT32, навіть ті, хто сидить під XP. Але зате в локальній мережі будь-якої фірми, що працює під Win2k / XP, майже напевно використовується NTFS, тому що ця файлова система надає такі можливості, як призначення прав доступу користувачам, шифрування і компресію файлів. Крім того, NTFS набагато більш надійна, ніж FAT32. Так що метод приховування даних, який я опишу, ідеально підходить для промислового шпигунства. З появою Longhorn, NTFS має шанс влаштуватися і на дисках домашніх комп'ютерів, так як майбутня файлова система WinFS, заснована на NTFS, обіцяє додаткові можливості щодо впорядкування та пошуку інформації, які повинні привернути звичайних користувачів.

Спосіб полягає в тому, щоб зберігати дані не в файл, як зазвичай, а в файловий потік NTFS. Поток можно прикрепить к другому файлу (при этом его размер не меняется, и данные остаются нетронутыми, а значит, утилиты, проверяющие чексуммы файлов, не заметят изменений), к каталогу или к диску. Альтернативні файлові потоки NTFS - це одна з можливостей NTFS, присутня в ній ще з найраніших версій Windows NT. Вона полягає в тому, що у одного файлу може бути кілька потоків, що містять дані, причому користувачеві доступний лише головний потік, в якому зберігається вміст файлу. Щось схоже є в файлової системі HFS на Макінтошах. Там потоки (streams) називаються розгалуженнями (forks). До недавнього часу вони використовувалися як сховище ресурсів файлу або містили інформацію про тип файлу. З появою MacOS X, Apple рекомендувала розміщувати ресурси в окремі файли, а типи файлів визначати по розширень. Але підтримка розгалужень все одно залишається. У Windows потоки зазвичай використовуються для зберігання будь-якої додаткової інформації про фото. Наприклад, в потоці може міститися зведення документа. Якщо система стоїть на диску з NTFS, то файл explorer.exe напевно містить зведення. Залежно від вмісту зведення, до файлу можуть прикріплятися потоки з іменами SummaryInformation, DocumentSummaryInformation і деякі інші. У себе на комп'ютері я виявив потік з ім'ям $ MountMgrRemoteDatabase, прикріплений до диска C.

О прикрепленных к файлу потоках юзер может узнать лишь в некоторых случаях, например, при копировании файла с прикрепленным потоком на диск с FAT/FAT32. Ці файлові системи їх не підтримують, тому система видасть запит на підтвердження втрати інформації в потоках, вказавши їх назви. Зрозуміло, така ситуація ніколи не виникне, якщо потік прикріплений до диска або до системної папці. Необов'язково використовувати потоки в шпигунських цілях. Якщо ти розробник shareware програм, то ти цілком можеш використовувати потоки для зберігання інформації про реєстрацію, кількості днів до закінчення терміну використання, словом, все те, що повинно бути приховано від користувача твоєї проги.

Алгоритм заснований на застосуванні функції BackupRead. Вона призначена для резервного копіювання файлів. Коли робиш резервну копію файлу, важливо зберегти якомога більше даних, включаючи і файлові потоки. Інформація береться зі структури WIN32_STREAM_ID. Звідти можна дістати ім'я потоку, його тип і розмір. Нам знадобляться тільки потоки типу BACKUP_ALTERNATE_DATA. Всі функції і структури описані в заголовному файлі winnt.h. Для начала надо открыть файл для чтения с помощью CreateFile. У параметрі dwFlagsAndAttributes треба вказати прапор FILE_FLAG_BACKUP_SEMANTICS, що дозволить відкривати не тільки файли, але і каталоги. Потім запускаємо цикл while, який зчитує інформацію про фото в структуру sid, з якої ми будемо діставати інформацію про кожному потоці. Перед наступним проходом циклу очищаємо структуру і зрушуємо покажчик файлу до наступного потоку за допомогою функції BackupSeek. Після того як всі потоки знайдені, очищаємо lpContext, що містить службову інформацію, і закриваємо файл. Исходный код программы приведен в листинге 2. Уже скомпилированную прогу ты можешь взять с нашего диска. Для роботи з потоками необов'язково писати спеціальні програми. Можна дещо зробити прямо з командного рядка. Кілька прикладів наведено на врізки.

Прикріпивши потік з інформацією до чого-небудь, до його вмісту важко дістатися, не знаючи його імені. Если поток прикрепить к логическому тому, то в Windows вообще нет стандартных средств, чтобы его обнаружить. Так як в імені потоку можуть міститися символи, неприпустимі в іменах звичайних файлів, це створює додаткові труднощі при спробі дізнатися вміст потоку, користуючись командним рядком. Вміст зведення документа зазвичай зберігається в потоці з назвою, яке містить символ з кодом 0x05. Цей символ можна набрати в консолі (Ctrl + E), але якби це був символ 0x10 або 0x13 (повернення каретки і переведення рядка), то набрати їх було б неможливо. Теоретично ти можеш дізнатися про прикріплених потоках випадково, використовуючи деякий софт, який з великою ймовірністю є на твоєму комп'ютері. У WinRAR є опція. і якщо вона включена, то ти можеш помітити, що розмір невеликого файлу, який міститься в архів, не тільки не зменшується, а навіть збільшується (за рахунок того, що дані в потоках теж поміщаються в архів). Це може викликати підозри. Програма для відстеження звернень до файлової системи - FileMonitor від тих же Sysinternals - не робить різниці між зверненнями до файлів або потокам. Відповідно, уважне вивчення балки звернень до диска підозрілої програми (твого кейлоггера) видасть і назва потоку, куди пишеться лог, і ім'я файлу, до якого він прикріплений.


type nul> somefile.txt: Stream

Запис в потік:


more

Існує думка про те, що потік можна видалити тільки разом з файлом, до якого він прикріплений. Це не так. Якщо ти знаєш назву потоку, то ти завжди зможеш видалити його стандартною функцією DeleteFile.

Лістинг 1. Приклад створення потоку.

По темі файлових потоків також є наступне: