我编写了一个函数,该函数使用 CRC 校验和检查损坏的存档。
为了测试它,我只是打开了存档并使用十六进制编辑器对内容进行了加扰。问题是我不相信这是生成损坏文件的正确方法。
有没有其他方法可以创建“受控损坏”,因此它不会完全随机但可以模拟真实损坏的档案会发生什么?我从来没有故意破坏某些东西,所以除了随机打乱文件中的数据之外,我真的不确定该怎么做。
Pet*_*des 27
我也没有做过很多模糊测试,但这里有两个想法:
在文件中间写入一些零。dd与 一起使用conv=notrunc。这会写入一个字节(块大小=1 计数=1):
dd if=/dev/zero of=file_to_fuzz.zip bs=1 count=1 seek=N conv=notrunc
Run Code Online (Sandbox Code Playgroud)
使用/dev/urandom作为源也是一种选择。
或者,使用 . 打多个 4k 孔fallocate --punch-hole。您甚至fallocate --collapse-range可以在不留零填充孔的情况下剪下一页。(这将改变文件大小)。
在错误的位置恢复下载将与--collapse-range场景匹配。不完整的洪流将匹配punch-hole场景。(稀疏文件或预先分配的范围,在尚未写入的任何地方读取为零。)
坏的 RAM(在您下载文件的系统中)会导致损坏,光驱也会损坏文件(它们的 ECC 并不总是足够强大,无法从划痕或染料褪色中完美恢复)。
DVD 扇区(ECC 块)是 2048B,但可能会发生单字节甚至单比特错误。某些驱动器可能会给您带来无法纠正的坏数据,而不是扇区的读取错误,尤其是当您以原始模式读取时,或调用它时。
Sti*_*mer 12
其他答案似乎主要与硬件错误有关。让我列出一些由软件引起的损坏:
这些事情发生在文本文件上时是无害的,但在应用于二进制文件时通常是致命的。
使用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
#
Run Code Online (Sandbox Code Playgroud)
从末尾截断 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
#
Run Code Online (Sandbox Code Playgroud)
Hexer 手册页
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.
Run Code Online (Sandbox Code Playgroud)