Представьте: у вас есть несколько тысяч файлов, и для каждого нужно извлечь метаданные — даты создания, модификации и последний доступ. Можно, конечно, сидеть и вручную копировать эти данные из Проводника. Один файл, второй… Через час работы голова уже плывёт, а впереди ещё сотни файлов. Но всего этого можно избежать.
Меня зовут Максим Антипов, я компьютерный криминалист и преподаватель в CyberEd. В этом руководстве я покажу вам, как автоматизировать процесс извлечения атрибутов файлов с помощью скрипта на VBA. Мы настроим Excel так, чтобы он сам собирал данные о размере, дате создания, модификации и последнем доступе к файлам.
Проблема
При проведении исследований носителей информации часто возникает необходимость извлечения временных меток атрибутов файлов из файловой таблицы. Это могут быть такие параметры, как размер файла, дата создания или последней модификации. Реже, но все же, возникает задача извлечения даты последнего доступа к файлу или группе файлов. Если файлов немного — десяток-другой — можно без спешки вручную перенести нужные атрибуты или воспользоваться специальным программным обеспечением. Решение этой задачи — типовая операция, о которой не стоит подробно говорить: поиск в интернете моментально выдаст список программ для создания реестров файлов (file listers).
Однако на практике перед специалистами по компьютерной криминалистике возникают задачи, которые требуют более глубокого подхода. Например, как быть, если файлов тысячи? И нужно извлечь атрибуты не для всех файлов каталога, а только для определенного списка, отобранного по какому-то критерию? В подобных ситуациях стандартные утилиты для составления списков файлов уже не всегда эффективны.
Примеры таких задач:
Список предположительно вредоносных файлов, обнаруженных антивирусом. Иногда таких файлов может быть несколько десятков, и они разбросаны по всей файловой системе в самых неожиданных местах.
Список исполнимых файлов из журнала аудита событий. События с кодами 4688 и 4689 могут дать информацию о запущенных в системе процессах. Если был установлен Sysmon, то его события с кодом 1 предоставят исчерпывающий список исполняемых файлов. Эти файлы требуют проверки, если защита системы не выявила подозрительных действий, но в работе системы наблюдаются аномалии. Кроме того, можно извлечь хэши исполнявшихся файлов, но это — тема для отдельного обсуждения.
Список документов с определенными ключевыми словами после индексирования. Что делать, если таких документов несколько тысяч и они разбросаны по разным папкам?
Список файлов, отобранных по каким-либо критериям. Из десятков тысяч файлов нужно извлечь лишь несколько тысяч, соответствующих определенным критериям. Эти файлы могут быть неравномерно распределены по всей файловой системе.
Стандартные решения: недостатки
Можно попытаться извлечь атрибуты всех файлов и затем написать скрипт для фильтрации по нужному списку. Я сначала думал пойти этим путем, но это громоздко и многослойно. В начале нужно создать список отобранных файлов в Excel, а потом вручную добавить в таблицу нужные атрибуты. Это решение подходит для пользователей, чья работа измеряется часами за монитором, но велика вероятность ошибок.
Мы, однако, не рядовые пользователи. Нам требуется более эффективное решение — автоматизация процесса. Когда задача возникает регулярно, например, как в случае с несколькими тысячами файлов, отобранных по заданным критериям, начинаешь задумываться: а можно ли автоматизировать этот процесс в Excel? Ведь ручное копирование атрибутов — это рутина, которой можно и нужно избежать. Вопрос лишь в том, как организовать эту автоматизацию.
Решение — написать скрипт на VBA для Excel, который выполнит три простых задачи:
Пройдет по всем ячейкам списка с путями к файлам.
Автоматически извлечет необходимые атрибуты из файловой таблицы.
Вставит эти атрибуты в указанные ячейки таблицы.
Решение
Итак, у нас есть файл Excel с таблицей, где в столбце «A» уже указан список нужных файлов. Задача — извлечь из файловой системы значения следующих атрибутов для каждого файла:
Столбец «B» — размер файла в байтах.
Столбец «C» — дата создания файла.
Столбец «D» — дата последней модификации.
Столбец «E» — дата последнего доступа.
Первым шагом нужно определить, сколько строк занимает столбец «A». Это даст нам количество файлов, с которыми предстоит работать.
Для этого используем строку:
LastRow = Cells.SpecialCells(xlLastCell).Row
Теперь нам понадобится объект для работы с файлами — FileSystemObject. С его помощью мы сможем получить доступ к атрибутам файлов. Переменная «i» будет служить счётчиком в цикле FOR, по которому мы пройдемся по каждой ячейке столбца «A», считывая путь к файлу, а затем извлекая его атрибуты.
Для этого добавим следующие строки:
Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.GetFile(Range("A" & CStr(i)))
Пишем скрипт
Теперь приведем итоговый скрипт на VBA с комментариями к каждой части. Этот скрипт будет проходить по всем строкам в столбце «A», проверять наличие файла и извлекать нужные атрибуты.
Sub ATTR1()
' Определяем количество строк в столбце активного листа
LastRow = Cells.SpecialCells(xlLastCell).Row
' Запускаем цикл перебора ячеек от первой до последней строки
For i = 1 To LastRow
' Инициализируем объект FileSystemObject для работы с файлами
Set FSO = CreateObject("Scripting.FileSystemObject")
' Пробуем получить доступ к файлу, путь к которому указан в ячейке "A"
If FSO.FileExists(Range("A" & CStr(i))) Then
' Если файл существует, извлекаем его атрибуты
Set File = FSO.GetFile(Range("A" & CStr(i)))
' Записываем размер файла в байтах в столбец "B"
Range("B" & CStr(i)).Value = File.Size
' Записываем дату создания файла в столбец "C"
Range("C" & CStr(i)).Value = File.DateCreated
' Записываем дату последней модификации файла в столбец "D"
Range("D" & CStr(i)).Value = File.DateLastModified
' Записываем дату последнего доступа к файлу в столбец "E"
Range("E" & CStr(i)).Value = File.DateLastAccessed
Else
' Если файл не найден, выводим сообщение в столбец "B"
Range("B" & CStr(i)).Value = "File not found"
End If
Next i
End Sub
Что делает этот скрипт
Определяет количество строк в столбце «A», чтобы знать, сколько файлов предстоит обработать.
Цикл FOR проходит по каждой строке, начиная с первой.
FileSystemObject проверяет, существует ли файл по указанному пути.
-
Если файл найден, извлекаются его атрибуты:
Размер файла заносится в столбец «B».
Дата создания — в столбец «C».
Дата последней модификации — в столбец «D».
Дата последнего доступа — в столбец «E».
Если файл не найден, в столбце «B» появляется сообщение «File not found».
Тесты, куда ж без них
Запускаем тестовую машину, ищем подходящие файлы и приступаем к тестированию.
Переносим список файлов в Excel.
Открываем редактор VBA, создаем новый макрос и вставляем в него наш скрипт для автоматизации извлечения атрибутов файлов. Пробуем его запустить.
Скрипт успешно отработал, и у нас теперь есть готовая таблица, в которую можно добавить заголовки и переносить ее в отчет.
Для уверенности открываем свойства одного из файлов и сверяем значения атрибутов, чтобы убедиться, что они корректно извлечены.
Особенности атрибута «Last Accessed»
Проведенные тесты показывают, что атрибут «Last Accessed» (дата последнего доступа) довольно ненадежен. Это объясняет, почему он редко используется. В некоторых случаях этот атрибут может не обновляться, особенно если файл открывался в режиме «только чтение». Если дата последнего доступа не требуется для исследования, её можно просто исключить из скрипта, закомментировав или удалив соответствующую строку.
Если же файлы находятся на подмонтированном образе в режиме «только чтение», имеет смысл исследовать и эти файлы, добавив их атрибуты в таблицу.
Моменты, которые стоит учесть
Казалось бы, задача решена: атрибуты извлечены, рутинная работа выполнена, и можно двигаться дальше. Однако, как часто бывает, на этом сложности не заканчиваются.
Проверка успешности чтения файлов
Для стабильности работы скрипта важно предусмотреть проверку успешности чтения каждого файла. Это необходимо для того, чтобы скрипт не останавливался при возникновении ошибок, например, если файл поврежден или недоступен.Учет часовых поясов
И Excel, и Проводник Windows извлекают временные атрибуты файлов с учетом настроек текущего часового пояса. Для обычного пользователя это обычно не вызывает вопросов. Однако для криминалистов важно помнить, что файловые системы, такие как NTFS, хранят временные метки в формате UTC+00:00. Многие криминалистические утилиты работают именно с этим временем или позволяют настроить нужный часовой пояс в отчетах. Если не учитывать этот момент, можно запутаться при анализе временных меток, особенно если устройства находятся в разных часовых поясах.
Заключение
После того как я начал преподавать, студенты часто задают вопрос: нужно ли знать программирование для работы компьютерным криминалистом? Ответ на этот вопрос очевиден: такие навыки не просто полезны, они становятся необходимыми. Эта задача пример того, как программирование помогает решать даже рутинные задачи эффективно, что экономит время и снижает вероятность ошибок.
В следующей статье мы попробуем учесть наличие сдвига часового пояса в атрибутах и автоматически привести временные метки к виду UTC+00:00. Задавайте свои вопросы в комментарии и следите за обновлениями — будет интересно!
Комментарии (5)
Cere8ellum
01.10.2024 14:26Если хотели описать пошаговый алгоритм, то задача совсем уж тривиальная. И так всё понятно. Ну а если код продемонстрировать, то как-то уж мало его. Где отлов ошибок? Где прогресс выполнения? Да хотя бы запрет обновления экрана где. Ибо при большом кол-ве файлов система неслабо так подвиснет.
rqdkmndh
01.10.2024 14:26теперь есть готовая таблица, в которую можно добавить заголовки и переносить ее в отчет.
Сам? Ручками? Вот если бы это делал скрипт - было бы круче.
CCNPengineer
для таких простых случаев спрашиваете chatgpt и он пишет программу на python, но возможно и на VBA тоже умеет
CyberEdRussia Автор
Все верно, выбор инструмента остаётся за вами. Мы лишь объяснили принцип и указали на важные моменты — в этом смысл статьи
CCNPengineer
выбор инструмента остаётся за вами.
python лучший выбор на мой взгляд. он универсален и прост. в то же время есть много готовых библиотек.
например если у вас будет CSV файл с мак адресами то на python есть готовая библиотека которая выдает вендора по мак адресу. в VBA такого нет.