Як пошкодити архівний файл контрольованим способом?


23

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

Щоб перевірити це, я щойно відкрив архів і зашифрував вміст шестигранним редактором. Проблема в тому, що я не вірю, що це правильний спосіб створення пошкодженого файлу.

Чи є якийсь інший спосіб створити "контрольовану корупцію", тому вона не буде абсолютно випадковою, але може імітувати те, що відбувається з реальними пошкодженими архівами? Мені ніколи не доводилося щось навмисно пошкоджувати, тому я не дуже впевнений, як це зробити, окрім випадкового скреблінгу даних у файлі.


Який інструмент використовується для "архіву", під корумпованим ви маєте на увазі вміст одного з файлів в архіві чи самого архіву?
Драв Слоун

Я використовую tar як формат архіву. Я хотів би зіпсувати лише вміст файлу; тому сам архів досі розпізнається як файл tar. Моя функція витягує файл; У мене є випадок, коли файл пошкоджений, але я хочу перевірити, що відбувається, коли файл всередині архіву пошкоджений.
ратаплан

Відповіді:


22

Я теж не робив багато нечітких тестувань , але ось дві ідеї:

Напишіть кілька нулів у середину файлу. Використовуйте ddс conv=notrunc. Це пише один байт (блок-розмір = 1 кол = 1):

dd if=/dev/zero of=file_to_fuzz.zip bs=1 count=1 seek=N conv=notrunc

Використання /dev/urandomв якості джерела також є варіантом.

Крім того, пробийте отвори декількома 4 к fallocate --punch-hole. Можна навіть fallocate --collapse-rangeвирізати сторінку, не залишаючи заповненого нулем отвору. (Це змінить розмір файлу).

Відновлення, завантажене в іншому місці, відповідало б --collapse-rangeсценарію. Неповний торрент буде відповідати punch-holeсценарію. (Рідкий файл або заздалегідь призначені розширення, або читати як нуль, де ще не було написано.)

Погана оперативна пам’ять (у системі, з якої ви завантажили файл) може призвести до пошкодження, а оптичні диски також можуть пошкодити файли (їх ECC не завжди є достатньо сильним, щоб ідеально відновитись від подряпин або відцвітання барвника).

Сектори DVD (блоки ECC) мають 2048B , але можуть траплятися однобайтові або навіть однобітні помилки. Деякі накопичувачі, ймовірно, дадуть вам погані нерегульовані дані замість помилки читання для сектору, особливо якщо ви читаєте в режимі "необроблений", або якщо це називається.


1
Зважаючи на те, як працюють жорсткі диски, найбільш заповнити нульове заповнення 4K-вирівнюваного блоку 4K або 512-байтового 51-байтового вирівнювання.
Марк

@Mark: О, якщо ви думаєте про корупцію, спричинену HD, так. Погана оперативна пам’ять на комп'ютері когось може трохи перевернути середину файлу. Аналогічно, зворотний шлях до / з поганого оптичного диска може занулювати менший шматок (коди DVD ECC працюють на інший розмір шматка).
Пітер Кордес

10

Інші відповіді, мабуть, стосуються апаратних помилок. Дозвольте мені перерахувати деякі програмні пошкодження:

  • LF замінено на CRLF.
  • CR видалено. (Навіть якщо за ним не слідує LF)
  • Додано додаткові нульові байти.
  • Додано додатковий Unicode "Марка порядку в байтах".
  • Набір символів, перетворений з UTF-8 в латинський-1 або навпаки.
  • Символ DOS EOF (# 1A) видалено, навіть якщо він не знаходиться в кінці файлу.

Ці речі є досить нешкідливими, коли трапляються з текстовими файлами, але, як правило, смертельними, коли застосовуються до двійкових файлів.


О, хороші! Також, звичайно, конверсії. У заголовку PNG є велика помилка під час перевірки такої ситуації: w3.org/TR/PNG-Rationale.html#R.PNG-file-signature
Дьюї Морган

7

Використовуйте ddдля врізання файлу або спробуйте двійковий редактор, як hexerредагувати та вводити деякі пошкодження.

Приклад обрізання файлу за допомогою dd

Створіть 5MB файл

# dd if=/dev/zero of=foo bs=1M count=5
5+0 records in
5+0 records out
5242880 bytes (5.2 MB) copied, 0.0243189 s, 216 MB/s
# ls -l foo
-rw-r--r-- 1 root root 5242880 Aug 12 20:13 foo
#

Обрізати 10 байт від кінця

# dd if=foo of=foo-corrupted bs=1 count=5242870
5242870+0 records in
5242870+0 records out
5242870 bytes (5.2 MB) copied, 23.7826 s, 220 kB/s
# ls -l foo foo-corrupted
-rw-r--r-- 1 root root 5242880 Aug 12 20:13 foo
-rw-r--r-- 1 root root 5242870 Aug 12 20:14 foo-corrupted
#

Сторінка людини Хексера

HEXER(1)                              General Commands Manual                             HEXER(1)

NAME
   hexer - binary file editor

SYNOPSIS
   hexer [options] [file [...]]

DESCRIPTION
   hexer  is  a  multi-buffer  editor  for  viewing  and  manipulating binary files.  It can't
   (shouldn't) be used for editing block devices, because it tries to load the whole file into
   a  buffer (it should work for diskettes).  The most important features of hexer are:  multi
   buffers, multi level undo, command line editing with completion, binary regular expressions
   (see  below).   The  user  interface  is  kept similar to vi, so if you know how to use vi,
   you'll get started easily.

Спасибі Стів. Чи зможе це імітувати те, що відбувається в реальному випадку? Наче ви копіюєте архів з мережі, і він пошкоджується? Я вважаю, що невдале завантаження може бути імітовано за допомогою dd, щоб урізати файл. Це було б точно?
rataplan

2
Так, обрізання файлу за допомогою dd, це б імітувало реальний сценарій, коли створюється лише частина файлу. І редагування за допомогою hexer введення деякого неправдивого вмісту імітувало б інший тип корупції. Оскільки в сторону, md5sumможливо, варто поглянути, вона обчислює контрольну суму md5 для файлу.
Стів

1
@newbiez, обрізання випадковим чином імітує мережевий збій, в той час як обрізання на 4Kb або 512-байтовій межі імітує збій диска.
Марк

як ви насправді усікаєте файл за допомогою dd?
Едвард Торвальдс

Додано приклад @edward torvalds - dd урізання
steve

2

Пропозиція:

Почніть писати в архів і припиніть, щоб справа не закінчилася. Це може статися під час відключення живлення та інших сценаріїв.

Реальний сценарій життя:

Я одного разу пошкодив zip-файл, намагаючись скопіювати в нього більше даних, ніж вмістилося б на носії. Windows (це була Windows 7 у безпечному режимі ftr) намагалася завершити дію, перш ніж з'ясувати, чи є достатньо місця, і до того моменту, як вона з'ясувала, файл наполовину повний і, таким чином, пошкоджений. Я сподіваюся, що вони вирішили цю проблему в пізніших версіях Windows, або це було просто безпечним режимом.


2

Ще один поширений тип корупції - це біт-подвійність: де один біт (або декілька біт) змінюється в потоці даних.

Так байт 1111 0000може стати, скажімо, 1111 0010або 1011 0000чи 1110 1100або будь-який інший .

Системи контрольної 1110 1000сукупності парності та підрахунку мають проблеми з такими речами, як там, де є однакова кількість множин і скидання, оскільки і паритет, і кількість одиниць залишаються однаковими.

Таким чином, заміна всіх випадків випадкового символу на його зворотну, скажімо, від 0x57 до 0x75 ("9" до "K") або навпаки, виявити неможливо. Для систем, у яких є mysql, існує команда «Замінити» саме для такої мети:

replace K 9 < goodInputFile > corruptedOutputFile

Ви також можете спробувати поміняти букви К і 9 навколо, що буде особливо хорошим випробуванням, якщо вони обидва відображаються у файлі однакову кількість разів:

replace K 9 9 K < goodInputFile > corruptedOutputFile

Використовуйте man replaceдля отримання додаткової інформації.


0

Випадкові зміни пошкоджених даних тесту не є хорошим підходом, оскільки ви не можете відтворити зразок для повторного запуску тестів.

Я був би задоволений лише трьома зразками, змінивши лише 1 біт у першому байті, в останньому байті та в будь-якому середньому байті. Але всього 1 біт, а не весь байт.

Але найкращим тестовим зразком був би той, де ви могли б генерувати зразки, змінюючи кожен бит файлу з першого на останній байт. Це неможливо (як правило) отримати звичайними інструментами, вам потрібно побудувати його (я думаю).

При такому підході ви виділяєте безліч можливостей, включаючи ендіазність, якщо ваш алгоритм базується на одному виду ендіазності. В інших руках великий зразок може забирати багато часу на обробку.

Нарешті, деякі зразки обрізки або додавання байтів завершать ваші тести.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.