Pass dd Skip|オフセットを16進数で探索

Pass dd Skip|オフセットを16進数で探索
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=3 2> /dev/null
d
# dd if=2013-Aug-uptime.csv bs=1 count=1 skip=0x3 2> /dev/null
f

2番目のコマンドが異なる値を出力するのはなぜですか?

スキップ|検索オフセットをdd16進値として渡すことはできますか?

答え1

2番目のコマンドが異なる値を出力するのはなぜですか?

歴史的な理由で乗算演算子ddと見なされます。xしたがって、0x3ゼロと評価されます。

Skip | seekオフセットを16進値としてddに渡すことはできますか?

私が知る限り、直接ではありません。乗算に演算子を使用することに加えて、x数字の後にb「512乗算」(0x200)とK「1024乗算」(0x400)を追加することもできます。 GNU ddを使用すると、接尾辞、、、、、およびMを使用して、それぞれ20、30、40、50、60、70、80、または90の積を乗算することを意味でき、大文字または大文字にすることができGます。接尾辞を除いては小文字です。 (他の可能なサフィックスもたくさんあります。たとえば、「10 18乗算」は「2 50乗算」を意味します。GNUをインストールした場合は、詳細については参考資料を参照してください。)TPEZYbEBPiBinfo coreutils "block size"

上記のコンテンツが曖昧である、不適切である、迷惑である、または面白いと思うかもしれません。心配しないでください。あなたは一人ではありません。幸いなことに、これを完全に無視し、シェルの算術置換を使用できます(bashや他のPosix互換シェルだけでなく、いくつかの非Posixシェルも機能します)。シェルは16進数を理解し、一般的な方法で書かれたさまざまな算術演算子を受け入れます。式を次に囲むだけです$((...))

# dd if=2013-Aug-uptime.csv bs=1 count=$((0x2B * 1024)) skip=$((0x37))

答え2

私はこれが古いスレッドであることを知っていますが、質問はまだ関連しています。特に私のような愚か者が一晩バックアップされていないgitにfileBがチェックインされていないとき、bash履歴で誤って「cp fileA fileB」を覚えて実行したときにそうです。その後、数時間のコーディングが必要でした:-/

このスレッドの概念のおかげで、失われたファイルを完全に回復することができましたが、32 Gbディスクと非常に小さなRAM(Ubuntu 18.04を実行)を持つリモート仮想プライベートサーバーでファイルを失いました。上記は「メモリ不足」ですぐにあなたを殺すでしょう。

私の場合、それはhexdump -C /dev/sdX1 | grep 'shortString'私を救った。 grepとは異なり、非常に狭いASCII表現である16進数のみを表示するので、短くて固有の文字列のみを見つけることが重要であり、その文字列にも改行が可能であることを覚えておいてください。一致する16進アドレスを出力した後は、上記と同様に「dd」を使用できました。ただし、デフォルトではブロックサイズが4096のように見えるので、16進バイトを変換する必要があるだけでなく、アドレスを10進数に変換しますが、これを4096で除してddのスキップ引数4kチャンクにサイズを変更します。役に立ちません。数値がddに比べて大きすぎると、エラーメッセージはskip=渡された数値の代わりに無効性について不平を言うように見えます。

$((0xabcd))Bashを使用して16進→10進変換を簡単に取得する方法に関するヒントを追加してくれた人に感謝します:-)

最後に申し上げます。私の場合、同じファイルのコピーが複数あり、すべて非常に似ていました。ただし、hexdumpによって報告された最も高いアドレスから最も低いアドレスを減算すると、可能なすべてのコピーを含む〜5MBの領域を識別できました。これは、最下位のアドレスからddを見つけ、領域全体を一時ファイルに抽出できることを意味します。 Vim エディタはバイナリコンテンツを非常にエレガントに扱うので、一時ファイルを調べて必要に応じて外観を変更できるようになりました。

関連情報