web-dev-qa-db-ja.com

制御された方法でアーカイブファイルを破損する方法

CRCチェックサムを使用して破損したアーカイブをチェックする関数を作成しました。

それをテストするために、私はアーカイブを開き、16進エディターでコンテンツをスクランブルしました。問題は、これが破損したファイルを生成する正しい方法であるとは思わないことです。

「制御された破損」を作成する他の方法はありますか?完全にランダムではありませんが、実際の破損したアーカイブで何が起こるかをシミュレートできますか?意図的に何かを壊す必要はなかったので、ファイル内のデータのランダムなスクランブルの他に、どうすればよいのか本当にわかりません。

23
rataplan

私はあまり ファズテスト もしていませんが、2つのアイデアがあります。

ファイルの中央にいくつかのゼロを書き込みます。 ddconv=notruncとともに使用します。これは1バイトを書き込みます(block-size = 1 count = 1):

dd if=/dev/zero of=file_to_fuzz.Zip bs=1 count=1 seek=N conv=notrunc

ソースとして/dev/urandomを使用することもオプションです。

または、fallocate --punch-holeを使用して4kの倍数の穴を開けます。 fallocate --collapse-rangeでも、ゼロで埋められた穴を残さずにページを切り取ることができます。 (これによりファイルサイズが変更されます)。

間違った場所で再開されたダウンロードは、--collapse-rangeシナリオと一致します。不完全な急流はpunch-holeシナリオに一致します。 (スパースファイルまたは事前に割り当てられたエクステント。まだ書き込まれていない場所では0として読み取られます。)

不良RAM(ファイルをダウンロードしたシステムで)は破損を引き起こす可能性があり、光学ドライブもファイルを破損させる可能性があります(ECCは常にスクラッチやフェードから完全に回復するのに十分強力ではありません)染料)。

DVDセクター(ECCブロック)は2048B ですが、1バイトまたは1ビットのエラーさえ発生する可能性があります。一部のドライブは、セクターの読み取りエラーではなく、不良の修正不可能なデータを提供する可能性があります(特にrawモードで読み取る場合、または呼び出された場合)。

23
Peter Cordes

他の回答は、主にハードウェアエラーに関係しているようです。ソフトウェアに起因する破損をいくつか挙げてみましょう。

  • LFはCRLFに置き換えられました。
  • CRを削除しました。 (その後にLFがなくても)
  • 余分なヌルバイトが挿入されました。
  • 追加のUnicode「バイトオーダーマーク」が挿入されました。
  • UTF-8からLatin-1に、またはその逆に変換された文字セット。
  • ファイルの終わりにない場合でも、DOS EOF文字(#1A)が削除されました。

これらのことは、テキストファイルに発生した場合はほとんど無害ですが、バイナリファイルに適用した場合は一般に致命的です。

11
Stig Hemmer

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
#

16進数のマニュアルページ

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.
8
steve

もう1つの一般的な破損の種類はビットトゥウィドルです。データストリームで単一ビット(または複数ビット)がトグルされます。

したがって、バイト1111 0000は、たとえば1111 0010または1011 0000または1110 1100などになります。

パリティと1をカウントするチェックサムシステムでは、パリティと1の数が同じままであるため、1110 1000のような問題があり、セットとアンセットの数が同じです。

したがって、ランダムな文字のすべてのインスタンスをその逆、たとえば0x57から0x75(「9」から「K」)に置き換えること、またはその逆は検出できない場合があります。 mysqlがインストールされているシステムの場合、「replace」コマンドはそのような目的でのみ存在します。

replace K 9 < goodInputFile > corruptedOutputFile

Kと9の文字を入れ替えることもできます。これは、両方がファイルに同じ回数出現する場合に特に良いテストになります。

replace K 9 9 K < goodInputFile > corruptedOutputFile

詳細については、man replaceを使用してください。

2
Dewi Morgan

提案:

アーカイブへの書き込みを開始し、完了する前に書き込みを停止します。これは、停電などのシナリオで発生する可能性があります。

実際のシナリオ:

メディアに収まらないほど多くのデータをコピーしようとしてZipファイルを破損しました。 Windows(これはセーフモードftrのWindows 7でした)は、十分なスペースがあるかどうかを判断する前にアクションを完了しようとしました。それ以降のバージョンのWindowsでこの問題が修正されたか、それが単なるセーフモードの問題だったと思います。

2
Pharap

破損したテストデータをランダムに変更することは、サンプルを再現してテストを再実行することができないため、適切なアプローチではありません。

最初のバイト、最後のバイト、および任意の中間バイトで1ビットだけを変更して、3つのサンプルのみで満足します。しかし、バイト全体ではなく、1ビットだけです。

しかし、最良のテストサンプルは、ファイルの各1ビットを最初のバイトから最後のバイトに変更するサンプルを生成できるサンプルです。これは(通常)通常のツールでは取得できません。作成する必要があります(私はそう思います)。

このアプローチでは、アルゴリズムが1種類のエンディアンに基づいている場合は、エンディアンを含む多くの可能性を分離します。一方、大きなサンプルは処理に多くの時間を費やす可能性があります。

最後に、サンプルのバイトの切り捨てまたは追加により、テストが完了します。

0
Luciano