Некоммерческие наборы инструментов, предназначенные для судебного дублирования
Судебное дублирование #1: точное двоичное дублирование жестких дисков
Чтобы создать зеркальную копию изображения жесткого диска, используя dd, вы должны сообщить утилите, какой исходный жесткий диск будет входным файлом, а какой - выходным (файл улик), на котором вы будете хранить изображение.
Вы можете определить, какой жесткий диск является источником, а какой адресатом, изучая вывод команды dmesg. И в системе Linux и в FreeBSD команда dmesg выводит информацию на консоль во время загрузки машины (и любые другие сообщения консоли, которые появляются после загрузки). Определить, "кто есть кто" среди жестких дисков не сложно; скорее, вы захотите подключиться к жесткому диску-хранилищу, созданному другим изготовителем, нежели к исходному жесткому диску, и тогда станет очевидно, какой из дисков является источником, а какой адресатом. После того как вы очистили жесткий диск адресата в /dev/hdd (это обсуждается позже в разделе "dd: инструмент очистки жесткого диска"), можно использовать следующий синтаксис для создания судебной копии исходного жесткого диска, подключенного к /dev/hdc в Linux.
forensic# dd, if =/dev/hdc =/dev/hdd bs=1024 conv=noerror, notrunc, sync
Судебное дублирование #2: создание локального файла улик
В первом методе мы обработали побитовую копию с исходного жесткого диска и расположили ее поверх жесткого диска адресата. Используя этот метод, мы не можем просто скопировать улики с одного носителя на другой. Метод, который способствует более простому управлению уликами, заключается в создании логического файла, который является побитовым представлением исходного жесткого диска. Очевидно, что никогда не следует сохранять файл улик на исходном жестком диске, так как мы можем уничтожить улики. Следующая команда демонстрирует создание судебной копии исходного жесткого диска, подключенного к /dev/hdc, в обыкновенный файл, расположенный в каталоге /mnt/storage/disk.bin в системе Linux.
forensic# dd, if =/dev/hdc =/mnt/storage/disk.bin bs=1024 conv=noerror,notrunc,sync
Процесс создания копии в других разновидностях операционных систем Unix подобен показанному выше. Единственное различие состоит в указании правильного имени файла устройства для ввода. Следующая команда демонстрирует дублирование исходного жесткого диска системы Windows 98 в системе FreeBSD. Исходный диск связан с /dev/ad0, а результатом является файл улик, расположенный в каталоге /mnt/storage/disk.bin.
forensic# dd if=/dev/ad0 of=/mnt/storage/disk.bin bs=1024 conv=notrunc,noerror,sync 20044080+0 records in 20044080+0 records out 20525137920 bytes transferred in 5665.925325 secs (3622557 bytes/sec) forensic# cd /mnt/storage forensic# ls -al total 20048997 drwxr-xr-x 2 root wheel 512 Jan 15 13:30 . drwxr-xr-x 7 root wheel 512 Jan 15 11:58 .. -rw-r--r-- 1 root wheel 20525237920 Jan 15 13:30 disk.bin
В предыдущем примере, если бы в процессе дублирования произошла ошибка, число входящих записей ( in ) не соответствовало бы числу выходящих записей ( out ). Например, если бы существовал один плохой блок, вывод команды dd выглядел бы так:
forensic# dd if=/dev/ad0 of =/mnt/storage/disk.bin bs=1024 conv=notrunc, noerror 20044079+1 records in 20044080+0 records out
Здесь поле +1 указывает количество записей, которые читались, но имели ошибки. Поскольку мы задали параметры conv=notrunc, noerror, sync, в случае ошибки утилита dd дополнит соответствующий блок в выводе нулями. Так как размер блока равен 1024 бита (указан с помощью параметра bs), это значит, что в нашей судебной копии 1024 байта данных не надежны. Если бы мы вычислили контрольную сумму MD5 для /dev/ad0 и /mnt/storage/disk.bin, весьма вероятно, что эти два файла не соответствовали бы друг другу. Короче говоря, такой вывод является причиной того, что нам требуется выполнить команду script, чтобы задокументировать эту ошибку в своем отчете о расследовании.
Иногда следователь создает много файлов улик для единственного исходного жесткого диска или раздела. Обычно это происходит тогда, когда следователь хочет, чтобы файлы улик были достаточно маленькими и могли поместиться на архивном компакт-диске, или когда файловая система хоста не поддерживает файлы большого размера. Такого рода проблема может быть решена с помощью комбинации ключей skip и count. Ключ skip задает позицию во входном файле, с которой утилита dd начнет копирование. Ключ count задает количество блоков, обозначенных ключом bs, которые утилита dd будет читать из исходного входного файла. Поэтому, при выполнении комбинации команд dd с увеличивающимся значением ключей skip и count будет создано несколько выходных файлов вывода, как можно видеть ниже.
forensic# dd if=/dev/hdc of=/mnt/storage/disk.1.bin bs=1M skip=0 count=620 ¬ conv=noerror,notrunc,sync forensic# dd if=/dev/hdc of=/mnt/storage/disk.2.bin bs=1M skip=621 count=620 ¬ conv=noerror,notrunc,sync forensic# dd if=/dev/hdc of=/mnt/storage/disk.3.bin bs=1M skip=1241 count=620 ¬ conv=noerror,notrunc,sync forensic# dd if=/dev/hdc of=/mnt/storage/disk.4.bin bs=1M skip=1861 count=620 ¬ conv=noerror,notrunc,sync
Когда вам требуется снова собрать отдельные части копий, которые представляют исходный жесткий диск, для их анализа, используйте следующую команду.
forensic# cat disk.1.bin disk.2.bin disk.3.bin disk.4.bin disk.whole.bin
И, наконец, вы можете ускорить процесс дублирования, изменяя размер блока. Поскольку секторы на диске занимают 512 байтов, то вы можете ускорить время чтения и записи, увеличив размер блока с помощью ключа bs. Следующая команда демонстрирует, как был ускорен процесс дублирования части внешнего жесткого диска в системе FreeBSD.
freebsd# /usr/bin/time -h dd if=/dev/ad0 of=test.bin bs=512 count=200000 ¬ conv=notrunc,noerror,sync
200000+0 records in 200000+0 records out 102400000 bytes transferred in 69.452716 secs (1474384 bytes/sec) 1m9.51s real 0.28s user 8.46s sys
forensic# /usr/bin/time -h dd if=/dev/ad0 of=test.bin bs=1024 count=100000 ¬ conv=notrunc,noerror,sync
100000+0 records in 100000+0 records out 102400000 bytes transferred in 41.785020 secs (2450639 bytes/sec) 41.79s real 0.20s user 4.42s sys
Возможно, вы не знакомы с командой time, которая просто помещает в вашу команду секундомер. В этом примере, команда time фиксирует продолжительность процесса дублирования от начала до конца и выдает реальное пользовательское и системное время. Заметьте, что реальное время уменьшилось, когда мы увеличили размер блока с 512 до 1024. Это произошло потому, что компьютер более эффективно читает (и пишет) за раз 1024 байта, чем 512 (для файла одного и того же размера). Предыдущими командами было скопировано только около 100Мб информации. Представьте себе эффективность копирования 80-гигабайтного жесткого диска при увеличении размера блока! Конечно, в какой-то момент вы почувствуете уменьшение отдачи и, возможно, захотите поэкспериментировать со своей аппаратурой и определить, что больше подходит для вашего конкретного случая.