Я написал функцию, которая проверяет поврежденный архив, используя контрольную сумму CRC.
Чтобы проверить это, я просто открыл архив и зашифровал содержимое с помощью шестнадцатеричного редактора. Проблема в том, что я не верю, что это правильный способ создания поврежденного файла.
Есть ли другой способ создать «контролируемое повреждение», чтобы оно не было полностью случайным, но могло имитировать то, что происходит с настоящими поврежденными архивами? Мне никогда не приходилось специально что-то портить, поэтому я не совсем уверен, как это сделать, кроме случайного шифрования данных в файле.
files
corruption
барабанный бой
источник
источник
Ответы:
Я не проводил много нечетких испытаний , но вот две идеи:
Запишите несколько нулей в середину файла. Используйте
dd
сconv=notrunc
. Это записывает один байт (размер блока = 1 счетчик = 1):Использование
/dev/urandom
в качестве источника также вариант.В качестве альтернативы, пробейте несколько отверстий 4k с помощью
fallocate --punch-hole
. Вы могли бы дажеfallocate --collapse-range
вырезать страницу, не оставляя заполненной нулями дыры. (Это изменит размер файла).Загрузка, возобновленная в неправильном месте, будет соответствовать
--collapse-range
сценарию. Неполный торрент будет соответствоватьpunch-hole
сценарию. (Разреженный файл или предварительно выделенные экстенты, либо читаются как ноль в любом месте, которое еще не было записано.)Плохое ОЗУ (в системе, из которой вы загрузили файл) может привести к повреждению, а оптические приводы также могут повредить файлы (их ECC не всегда достаточно прочен, чтобы полностью восстановиться от царапин или выцветания красителя).
Секторы DVD (блоки ECC) имеют размер 2048B , но могут возникнуть ошибки в один байт или даже в один бит. Некоторые накопители, скорее всего, будут выдавать вам некорректные некорректируемые данные вместо ошибки чтения для сектора, особенно если вы читаете в необработанном режиме или когда он называется.
источник
Другие ответы в основном касаются аппаратных ошибок. Позвольте мне перечислить некоторые программные повреждения:
Эти вещи довольно безвредны при работе с текстовыми файлами, но, как правило, смертельно при применении к двоичным файлам.
источник
Используйте
dd
для усечения файла или попробуйте двоичный редактор, например,hexer
для редактирования и внесения некоторых искажений.Пример усечения файла с использованием dd
Создать 5 МБ файл
Обрезать 10 байтов от конца
Man-страница Hexer
источник
dd
это имитирует сценарий реального мира, в котором создается только часть файла. А редактирование, использующееhexer
для введения некоторого поддельного контента, имитирует другой тип искажения. Кроме того, наmd5sum
что стоит обратить внимание, он вычисляет контрольную сумму md5 для файла.dd
?Предложение:
Начните писать в архив и остановите запись, прежде чем она закончится. Это может произойти во время отключений питания и других сценариев.
Реальный сценарий жизни:
Однажды я испортил zip-файл, пытаясь скопировать в него больше данных, чем поместилось бы на носителе. Windows (это была Windows 7 в безопасном режиме ftr) пыталась завершить действие, прежде чем выяснить, достаточно ли места, и к тому времени, когда она выяснила это, файл был наполовину полон и, следовательно, поврежден. Я надеюсь, что они исправили эту проблему в более поздних версиях Windows или это был просто безопасный режим.
источник
Другим распространенным типом искажений является битовое перемешивание: когда один бит (или несколько бит) переключается в потоке данных.
Таким образом, байт
1111 0000
может стать, скажем,1111 0010
или1011 0000
или1110 1100
или как угодно.Системы
1110 1000
контроля чётности и подсчета чеков имеют проблемы с такими вещами, как, например , равное количество множеств и неустановок, так как и чётность, и количество единиц остаются одинаковыми.Поэтому замена всех экземпляров случайного символа его обратным, скажем, от 0x57 до 0x75 (от '9' до 'K') или наоборот, может быть не обнаружима. Для систем, которые имеют mysql, команда «заменить» существует как раз для такой цели:
Вы также можете попробовать поменять местами буквы K и 9, что будет особенно хорошим тестом, если они оба появятся в файле одинаковое количество раз:
Используйте
man replace
для получения дополнительной информации.источник
Случайные изменения поврежденных тестовых данных не являются хорошим подходом, так как вы не можете воспроизвести образец для повторного запуска тестов.
Я был бы счастлив только с 3 выборками, меняя только 1 бит в первом байте, в последнем байте и в любом среднем байте. Но только 1 бит, а не весь байт.
Но лучшим тестовым образцом будет тот, в котором вы можете генерировать образцы, меняя каждый бит файла с первого до последнего байта. Этого нельзя (обычно) получить с помощью обычных инструментов, вам нужно создать один (я думаю).
При таком подходе вы изолируете множество возможностей, включая порядковый номер, если ваш алгоритм основан на одном виде порядкового номера. В других руках большой образец может потребовать много времени для обработки.
Наконец, некоторые примеры усечения или добавления байтов завершат ваши тесты.
источник