1

eCryptfs ファイルのヘッダーを解析するプログラム (C ではなく Free Pascal を使用) を作成しています。

ヘッダーの値の 1 つはバイト 7 で始まり、15 で終わります (8 バイト値)。ファイルを eCryptfs ファイルとして一意に識別する値であるため、私にとっては役に立ちます。そのため、ファイルにそのような値が見つかったときにそれを認識するようにアプリをコーディングしようとしています。

ただし、マーカー自体は、ランダムに生成された 4 バイト値 (X) と別の 4 バイト静的 16 進値 0x3c81b7f5 (Y) を XOR することによって生成されます。生成された値は 4 バイトの Z です。X + Z を合わせて 8 バイトの特殊マーカーを形成します。Y 自体はファイル ヘッダーに格納されません。したがって、値 0x3c81b7f5 (Y) がヘッダーに格納されることは決してないので、それを探すようにアプリケーションをコーディングすることはできません。他の 4 バイトは、ある静的な値と別のランダムな値との XOR の結果であることを確認できます。 、どのように認識されているのかわかりません。

eCryptfs Launchpad サイト ( https://answers.launchpad.net/ecryptfs/+question/152821 ) で eCryptfs プログラムがこの値を「eCryptfs ファイル」として認識する方法を尋ねたところ、コミュニティの 1 人が関連する C ソース コードを紹介してくれました。以下にリンクしています.しかし、私はCが特別なマーカーをどのように認識しているかを理解するのに十分なほどよく理解していません.同じ種類の認識プロセスを自分のアプリにコーディングできるように、誰か助けてもらえますか?ソースコードは必要ありませんが、C コードがどのように機能するかを誰かに説明してもらいたいだけです。

http://fxr.watson.org/fxr/source/fs/ecryptfs/crypto.c?v=linux-2.6;im=excerpts#L1029

4

2 に答える 2

4

あなたが本当に興味を持っているのは、ここのこの部分です:

m_1 = get_unaligned_be32(data);
m_2 = get_unaligned_be32(data + 4);
if ((m_1 ^ MAGIC_ECRYPTFS_MARKER) == m_2)
    return 1;

この関数は、4 バイトを から符号なし 4 バイト整数にget_unaligned_be32変換 し、バイト順を 調整するだけです。の2 番目の呼び出しで、渡​​され たアドレスを4 バイト上に移動します。datadata + 4get_unaligned_be32get_unaligned_be32

[0][3][2][4][4][5][6][7]   
^           ^
data        data + 4
m_1         m_2          /* After adjusting byte order */

そのため、最初の 2 行は の最初の 8 バイトから 2 つの符号なし整数を取り出しているだけですdata(おそらくバイト順が修正されています)。

次に、次の式があります。

(m_1 ^ MAGIC_ECRYPTFS_MARKER) == m_2

^単なる XOR 演算子であり、MAGIC_ECRYPTFS_MARKER0x3c81b7f5 あるため、このテストは単にXORm_1と 0x3c81b7f5 を実行し、それが と等しいかどうかを確認するだけm_2です。この比較が真であれば、適切なタイプのファイルがあります。

于 2011-04-25T17:43:36.367 に答える
1

「X + Z が一緒になって 8 バイトの特殊マーカーを形成する」ということで、それらが連結されていることを意味する場合、次のようになります。

Y = 0x3c81b7f5
X = some random value

Z = X ^ Y  (also a random value, due to X being random)

これで、ファイル ヘッダーから X と Z が得られました。これらを xor すると、次の関係が成り立ちます。

X ^ Z = X ^ (X ^ Y) = Y

したがって、値は 0x3c81b7f5 になります。

于 2011-04-25T18:07:11.423 に答える