1

我正在编写一个解析 eCryptfs 文件头的程序(使用 Free Pascal,而不是 C)。

标头中的值之一从字节 7 开始,到 15 结束(一个 8 字节值)。它对我有用,因为它是一个将文件唯一标识为 eCryptfs 文件的值。因此,我正在尝试编写我的应用程序以在它在文件中找到此类值时识别它。

但是,标记本身是通过将随机生成的 4 字节值 (X) 与另一个 4 字节静态十六进制值 0x3c81b7f5 (Y) 进行异或运算而生成的。生成的值是 4 个字节,Z。X + Z 一起构成了 8 个字节的特殊标记。Y 本身不存储在文件头中。因此,由于值 0x3c81b7f5 (Y) 从未存储在标头中,因此我无法编写应用程序来查找它,并看到其他 4 个字节是一个静态值与另一个随机值的异或结果,我无法弄清楚它是如何被识别的。

在询问 eCryptfs 程序如何在 eCryptfs Launchpad 站点(https://answers.launchpad.net/ecryptfs/+question/152821 )上将此值识别为“eCryptfs 文件”后,其中一个社区向我推荐了相关的 C 源代码我在下面链接到它。但是,我对 C 的理解不够好,无法弄清楚它是如何识别特殊标记的。谁能帮助我,以便我可以将相同类型的识别过程编码到我自己的应用程序中?我没有我不想要源代码,但我只想有人解释 C 代码是如何工作的“啊,是的,那是一个 eCryptfs 文件!”所以我知道我需要编写我的应用程序来做什么。

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;

get_unaligned_be32函数只是将四个字节从转换 data为无符号的四字节整数,并可能进行字节顺序 调整。在data + 4第二次调用get_unaligned_be32 中将传递的地址get_unaligned_be32向上移动四个字节:

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

所以,前两行只是从前八个字节中提取两个无符号整数data(可能有字节顺序修复)。

然后我们有这个表达式:

(m_1 ^ MAGIC_ECRYPTFS_MARKER) == m_2

^只是 XOR 运算符并且MAGIC_ECRYPTFS_MARKER0x3c81b7f5所以这个测试只是 XORingm_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。如果将它们异或在一起,则以下关系成立:

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

所以你最终应该得到值 0x3c81b7f5。

于 2011-04-25T18:07:11.423 回答