web-dev-qa-db-ja.com

ディスクから生のext3iノードデータを抽出する方法は?

Ext3(またはext2/4、フレーバーを選択)ファイルシステムで、特定のiノードに対応する生のバイトデータをハードドライブから直接抽出するにはどうすればよいでしょうか。たとえば、iノード番号を指定してディスク上の位置を特定し(おそらくパーティションの先頭からのオフセット、またはその他のLBAオフセットとして)、「dd」などのユーティリティやシステムコール(何か)を使用することは可能ですか?ファイルシステムで操作することを除いてlseekのように?)ファイルとしてそれを参照する必要なしにそのデータを読むために?おそらく、ある種のドライバーレベルのユーティリティを使用して、これを実行できると思います..。

3

Debugfsのimapコマンドは、iノードがどこにあるかを教えてくれます。例:

$ debugfs -R 'imap <128901>' /dev/whatever
debugfs 1.42.5 (29-Jul-2012)
Inode 128901 is part of block group 16
        located at block 524344, offset 0x0400

Iノード128901のrawダンプを取得するには、524344*block_size + 0x0400バイトをシークし、inode_sizeバイトを読み取ります。サイズは、statsdebugfsコマンド、または別のユーティリティdumpe2fsを使用して取得できます。

statsまたはdumpe2fsは、すべてのiノードストレージ領域の完全なリストも提供するため、毎回imapを実際に呼び出す(またはインタラクティブに実行する)ことなく、debugfsと同等の機能を実行する独自の関数を作成できます。計算を行うときは、iノードゼロがないことを覚えておいてください。 iノード1は、iノードの最初のブロックのバイト0から始まります。

外部プログラムを使用せずにCプログラムでこれを実行する場合は、すべての標準ext2ユーティリティで使用されるlibext2ライブラリを確認する必要があります。私自身は使用していませんが、libext2のドキュメントとdebugfsのソースコードを参考にして、独自のimapのような関数を簡単に作成できると思います。

...そしてここで私はあなたがそうしなかったかもしれないと思いました文字通りあなたがiノードの生データが欲しかったことを意味します。 iノードが記述するファイルの内容が必要な場合があります。その場合、それはさらに簡単です。 debugfsには、そのための組み込みコマンドがあります。

debugfs -R `cat <128901>` /dev/whatever

iノード番号が128901のファイルの内容を出力します。

8
user41515

私は同じようなことをしたかったので、他の答えと同じようにdebugfsを使用することになりましたが、以下を使用しました(ルートファイルシステムは/dev/nvme0n1p4にあります)。

$ debugfs
debugfs: open /dev/nvme0n1p4
debugfs: stat /usr/bin/docker-current
debugfs: inode_dump <9445675> # After getting the inode number from the output above

次のこともできます。これにより、手動のiノードルックアップなしで同じ出力が得られます。

debugfs:  inode_dump /usr/bin/docker-current 
0000  ed81 0000 2819 f200 e805 ab5d ed28 7d5d  ....(......].(}]
0020  be5c 585d 0000 0000 0000 0100 1079 0000  .\X].........y..
0040  0000 0800 0100 0000 0af3 0200 0400 0000  ................
0060  0000 0000 0000 0000 0008 0000 0060 8f02  .............`..
0100  0008 0000 2207 0000 0050 8f02 0000 0000  ...."....P......
0120  0000 0000 0000 0000 0000 0000 0000 0000  ................
0140  0000 0000 76bb 0b93 0000 0000 0000 0000  ....v...........
0160  0000 0000 0000 0000 0000 0000 0000 0000  ................
0200  2000 0000 0025 6ad3 0000 0000 2c57 e8ca   ....%j.....,W..
0220  ed28 7d5d 18db 8a5f 0000 0000 0000 0000  .(}]..._........
0240  0000 0000 0000 0000 0000 0000 0000 0000  ................
*
0
ffledgling