我编写了一个函数,该函数使用CRC校验和检查损坏的存档。
为了测试它,我只是打开了档案,并使用十六进制编辑器对内容进行了加扰。问题是我不相信这是生成损坏文件的正确方法。
还有其他方法可以创建“受控损坏”,因此它不会是完全随机的,但可以模拟实际损坏的存档会发生什么情况?我从来不需要故意破坏某些东西,所以除了文件中的数据随机加扰外,我不确定该如何做。
我编写了一个函数,该函数使用CRC校验和检查损坏的存档。
为了测试它,我只是打开了档案,并使用十六进制编辑器对内容进行了加扰。问题是我不相信这是生成损坏文件的正确方法。
还有其他方法可以创建“受控损坏”,因此它不会是完全随机的,但可以模拟实际损坏的存档会发生什么情况?我从来不需要故意破坏某些东西,所以除了文件中的数据随机加扰外,我不确定该如何做。
Answers:
我也没有做太多的模糊测试,但这有两个想法:
在文件中间写入一些零。dd
与一起使用conv=notrunc
。这将写入一个字节(block-size = 1 count = 1):
dd if=/dev/zero of=file_to_fuzz.zip bs=1 count=1 seek=N conv=notrunc
使用/dev/urandom
作为源也是一种选择。
或者,用打4k的多个孔fallocate --punch-hole
。您甚至fallocate --collapse-range
可以切出一页而不会留下零填充的孔。(这将更改文件大小)。
在错误的位置恢复下载将符合--collapse-range
方案。不完整的洪流将与punch-hole
场景匹配。(稀疏文件或预分配的扩展盘区,在尚未写入的任何地方都读为零。)
错误的RAM(在您从中下载文件的系统中)会导致损坏,光盘驱动器也会损坏文件(它们的ECC并不总是足够坚固,无法从划痕或褪色中完全恢复过来)。
DVD扇区(ECC块)为2048B,但可能会发生单字节甚至单比特错误。某些驱动器可能会为您提供错误的不可纠正数据,而不是该扇区的读取错误,尤其是如果您以原始模式读取或被调用时。
其他答案似乎主要与硬件错误有关。让我列出一些软件引起的损坏:
这些内容在处理文本文件时是无害的,但是在应用于二进制文件时通常是致命的。
使用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手册页
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
,可以模拟仅创建部分文件的真实场景。使用hexer
引入一些虚假内容的编辑将模拟另一种类型的损坏。顺便说一句的md5sum
可能是值得考虑的,它计算为文件MD5校验值。
dd
?
损坏的另一种常见类型是位纠缠:在数据流中切换一位(或多位)。
因此,一个字节1111 0000
可能会变成,1111 0010
或者,1011 0000
或者1110 1100
或者任何东西。
奇偶校验和合一校验和系统1110 1000
在设置和未设置相等数目的事物上存在问题,因为奇偶校验和校验和数目保持相同。
因此,可能无法检测到将随机字符的所有实例替换为其相反字符,例如0x57至0x75(“ 9”至“ K”),反之亦然。对于具有mysql的系统,命令“ replace”仅用于以下目的:
replace K 9 < goodInputFile > corruptedOutputFile
您还可以尝试将字母K和9交换掉,如果它们在文件中出现相同的次数,这将是一个特别好的测试:
replace K 9 9 K < goodInputFile > corruptedOutputFile
使用man replace
更多的信息。