如何以受控方式破坏存档文件?


23

我编写了一个函数,该函数使用CRC校验和检查损坏的存档。

为了测试它,我只是打开了档案,并使用十六进制编辑器对内容进行了加扰。问题是我不相信这是生成损坏文件的正确方法。

还有其他方法可以创建“受控损坏”,因此它不会是完全随机的,但可以模拟实际损坏的存档会发生什么情况?我从来不需要故意破坏某些东西,所以除了文件中的数据随机加扰外,我不确定该如何做。


用什么工具“存档”,是通过损坏来表示存档中文件之一的内容,还是存档本身?
Drav Sloan

我正在使用tar作为存档格式。我只想破坏文件的内容;因此存档本身仍被识别为tar文件。我的函数提取文件;我有一种情况,那里的文件已损坏,但我想检查一下存档中的文件损坏时会发生什么。
rataplan 2015年

Answers:


22

我也没有做太多的模糊测试,但这有两个想法:

在文件中间写入一些零。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,但可能会发生单字节甚至单比特错误。某些驱动器可能会为您提供错误的不可纠正数据,而不是该扇区的读取错误,尤其是如果您以原始模式读取或被调用时。


1
由于硬盘的工作方式,最实际的做法是在4K对齐的4K块或512字节对齐的512字节的块上进行零填充。
2015年

@Mark:哦,如果您正在考虑高清引发的腐败,是的。某人计算机中的RAM不足会在文件中间翻转一点。类似地,往返于不良光盘的往返可以将较小的块归零(DVD ECC代码以不同的块大小工作)。
彼得·科德斯

10

其他答案似乎主要与硬件错误有关。让我列出一些软件引起的损坏:

  • LF替换为CRLF。
  • CR已删除。(即使没有跟随LF)
  • 插入了额外的Null字节。
  • 插入了额外的Unicode“字节顺序标记”。
  • 字符集从UTF-8转换为Latin-1,反之亦然。
  • DOS EOF字符(#1A)已删除,即使不在文件末尾也是如此。

这些内容在处理文本文件时是无害的,但是在应用于二进制文件时通常是致命的。


哦,好人!当然,转换也是另一种方式。对于这种情况,PNG标头有一些很大的错误检查:w3.org/TR/PNG-Rationale.html#R.PNG-file-signature
Dewi Morgan

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手册页

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字节边界截断模拟磁盘故障。
2015年

您实际上如何使用截断文件dd
爱德华·托瓦尔兹

@edward torvalds-添加了dd截断示例
Steve

2

建议:

开始写入存档,并在完成之前停止进行写入操作。这可能在断电和其他情况下发生。

现实生活场景:

我曾经试图通过将压缩数据复制到压缩文件中的方式破坏了压缩文件,而不是将其压缩到中等大小。Windows(这是处于安全模式下的Windows 7 ftr)在确定是否有足够的空间之前尝试完成该操作,并且在确定文件空间为一半时已损坏。我希望他们在Windows的更高版本中解决了该问题,或者那只是安全模式。


2

损坏的另一种常见类型是位纠缠:在数据流中切换一位(或多位)。

因此,一个字节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更多的信息。


0

随机更改损坏的测试数据不是一个好方法,因为您无法复制样本以重新运行测试。

我将只用3个样本感到满意,在第一个字节,最后一个字节和任何中间字节中仅更改1位。但是只有1位,而不是整个字节。

但是最好的测试样本应该是可以生成样本的文件,该样本会将文件的每个位从第一个字节更改为最后一个字节。(通常)无法通过常规工具获得,您需要构建一个(我想)。

如果您的算法基于一种字节性,则使用这种方法可以隔离包括字节性在内的许多可能性。另一方面,大样本可能会花费大量时间进行处理。

最后,一些截断或添加字节的示例将完成测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.