CRCチェックサムを使用して破損したアーカイブを検証する関数を作成しました。
テストするには、アーカイブを開き、16進エディタを使用して内容を混乱させました。問題は、これが破損したファイルを生成する正しい方法だとは思わないということです。
完全にランダムではありませんが、実際に破損したアーカイブで何が起こるのかをシミュレートできるように、「管理された損傷」を作成する別の方法はありますか?私は意図的に何かを壊したことがないので、ファイルのデータをランダムに混乱させる以外に何をすべきかわかりません。
答え1
私はまだ多くのことをしていません。ファズテストどちらかですが、ここには2つのアイデアがあります。
ファイルの途中にいくつかのゼロを書き込みます。dd
と一緒に使用されますconv=notrunc
。これは1バイトを書き込みます(ブロックサイズ= 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
シナリオに適しています。不完全な急流がpunch-hole
シーンと一致します。 (まれなファイルまたは事前に割り当てられた範囲は、まだ作成されていないすべての場所から0を読み取ります。)
不良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(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
については。