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

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

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

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

有没有其他方法来创建“受控损坏”,这样它就不会完全随机,但可以模拟真实损坏的档案所发生的情况?我从来没有故意损坏某些东西,所以除了随机扰乱文件中的数据之外,我不太确定该怎么做。

答案1

我还没有做太多模糊测试要么,但这里有两个想法:

在文件中间写入一些零。dd与 一起使用conv=notrunc。这会写入一个字节(块大小=1计数=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场景。不完整的 torrent 将与punch-hole场景匹配。 (稀疏文件或预分配的范围,在尚未写入的任何地方都读为零。)

坏的 RAM(在您下载文件的系统中)可能会导致损坏,而光驱也可能会损坏文件(它们的 ECC 并不总是足够强大,无法从划痕或染料褪色中完美恢复)。

DVD 扇区(ECC 块)为 2048B,但可能会发生单字节甚至单比特错误。某些驱动器可能会为您提供无法纠正的错误数据,而不是扇区的读取错误,特别是当您以原始模式读取或调用它时。

答案2

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

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

当这些事情发生在文本文件上时是相当无害的,但当应用于二进制文件时通常是致命的。

答案3

用于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.

答案4

另一种常见的损坏类型是位旋转:其中单个位(或多个位)在数据流中被切换。

所以一个字节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获取更多信息。

相关内容