Napisałem funkcję, która sprawdza uszkodzone archiwum za pomocą sumy kontrolnej CRC.
Aby to przetestować, właśnie otworzyłem archiwum i zaszyfrowałem zawartość edytorem szesnastkowym. Problem polega na tym, że nie wierzę, że jest to właściwy sposób na wygenerowanie uszkodzonego pliku.
Czy istnieje inny sposób na stworzenie „kontrolowanej korupcji”, aby nie była całkowicie losowa, ale mogła symulować to, co dzieje się z prawdziwymi uszkodzonymi archiwami? Nigdy nie musiałem specjalnie uszkodzić czegoś, więc nie jestem pewien, jak to zrobić, oprócz przypadkowego mieszania danych w pliku.
files
corruption
bębnić
źródło
źródło
Odpowiedzi:
Nie przeprowadziłem też wielu testów fuzz , ale oto dwa pomysły:
Wpisz kilka zer na środku pliku. Użyj
dd
zconv=notrunc
. Spowoduje to zapisanie jednego bajtu (wielkość bloku = 1 liczba = 1):Użycie
/dev/urandom
jako źródła jest również opcją.Alternatywnie, wybij wiele otworów o wielkości 4k za pomocą
fallocate --punch-hole
. Możesz nawetfallocate --collapse-range
wyciąć stronę bez pozostawiania dziury wypełnionej zerą. (Spowoduje to zmianę rozmiaru pliku).Pobieranie wznowione w niewłaściwym miejscu byłoby zgodne ze
--collapse-range
scenariuszem. Niekompletny torrent pasuje dopunch-hole
scenariusza. (Rzadki plik lub wstępnie przydzielone zakresy, odczytywane jako zero w dowolnym miejscu, które nie zostało jeszcze zapisane).Zła pamięć RAM (w systemie, z którego pobrałeś plik) może powodować uszkodzenie, a dyski optyczne również mogą uszkadzać pliki (ich ECC nie zawsze jest wystarczająco mocne, aby idealnie odtworzyć się po zadrapaniach lub blaknięciu barwnika).
Sektory DVD (bloki ECC) to 2048B , ale mogą wystąpić błędy jednobajtowe lub nawet bitowe. Niektóre dyski prawdopodobnie zapewnią złe dane, których nie da się naprawić, zamiast błędu odczytu dla sektora, szczególnie jeśli czytasz w trybie surowym lub w / e to się nazywa.
źródło
Inne odpowiedzi wydają się dotyczyć głównie błędów sprzętowych. Pozwól mi wymienić kilka uszkodzeń spowodowanych przez oprogramowanie:
Te rzeczy są dość nieszkodliwe w przypadku plików tekstowych, ale generalnie zabójcze w przypadku plików binarnych.
źródło
Użyj
dd
do obcięcia pliku lub wypróbuj edytor binarny, np.hexer
Edytuj i wprowadzaj pewne uszkodzenia.Przykład obcięcia pliku przy użyciu dd
Utwórz plik 5 MB
Obetnij 10 bajtów od końca
Strona podręcznika Hexer
źródło
dd
, który symulowałby rzeczywisty scenariusz, w którym tworzona jest tylko część pliku. A edycja za pomocąhexer
wprowadzenia fałszywych treści symulowałaby inny rodzaj korupcji. Na marginesie, na comd5sum
warto spojrzeć, oblicza sumę kontrolną md5 dla pliku.dd
?Sugestia:
Zacznij pisać do archiwum i przestań pisać, zanim skończy. Może to wystąpić podczas przerw w dostawie prądu i innych scenariuszy.
Scenariusz z życia:
Kiedyś zepsułem plik zip, próbując skopiować do niego więcej danych, niż mieściłoby się na nośniku. Windows (to był Windows 7 w trybie awaryjnym ftr) próbował zakończyć akcję, zanim zorientował się, czy jest wystarczająca ilość miejsca, a zanim się zorientował, plik był w połowie kompletny, a zatem uszkodzony. Mam nadzieję, że rozwiązali ten problem w późniejszych wersjach systemu Windows lub że był to tylko tryb bezpieczny.
źródło
Innym powszechnym rodzajem korupcji jest kręcenie bitów: gdy jeden bit (lub wiele bitów) przełącza się w strumieniu danych.
Tak bajt
1111 0000
może stać się, powiedzmy,1111 0010
lub1011 0000
lub1110 1100
lub cokolwiek.Systemy
1110 1000
kontroli parzystości i liczenia mają problemy z takimi rzeczami, jak na przykład taka sama liczba zestawów i rozbrojenia, ponieważ zarówno parzystość, jak i liczba pozostają takie same.Dlatego zastąpienie wszystkich wystąpień losowego znaku odwrotnością, powiedzmy od 0x57 do 0x75 („9” do „K”) lub odwrotnie, może nie być wykrywalne. W systemach, które mają mysql, istnieje właśnie polecenie „replace” w takim właśnie celu:
Możesz także spróbować zamienić litery K i 9 wokół, co będzie szczególnie dobrym testem, jeśli oba pojawią się w pliku tyle samo:
Użyj,
man replace
aby uzyskać więcej informacji.źródło
Losowe zmiany w uszkodzonych danych testowych nie są dobrym podejściem, ponieważ nie można odtworzyć próbki w celu ponownego uruchomienia testów.
Byłbym zadowolony tylko z 3 próbek, zmieniając tylko 1 bit w pierwszym bajcie, w ostatnim bajcie i dowolnym bajcie środkowym. Ale tylko 1 bit, nie cały bajt.
Ale najlepszą próbką testową byłaby taka, w której można wygenerować próbki zmieniające każdy bit pliku od pierwszego do ostatniego bajtu. Tego nie da się (zwykle) uzyskać zwykłymi narzędziami, trzeba je zbudować (tak myślę).
Dzięki takiemu podejściu izolujesz wiele możliwości, w tym endianess, jeśli twój algorytm opiera się na jednym rodzaju endianess. W innych rękach duża próbka może zająć dużo czasu na przetworzenie.
W końcu niektóre przykładowe obcięcie lub dodanie bajtów zakończy testy.
źródło