我正在写一个程序(使用免费的Pascal,而不是C)来解析eCryptfs文件头。
报头中的一个值开始于字节7,结束于15 (一个8字节值)。它对我很有用,因为它是唯一地将文件标识为eCryptfs文件的值。因此,我正在尝试编写我的应用程序,当它在文件中找到这样的值时,它会识别它。
然而,标记本身是通过将随机生成的4字节值(X)与另外4字节静态十六进制值0x3c81b7f5 (Y)进行异或而生成的。生成的值是4字节,Z。X+Z一起形成了8字节的特殊标记。Y本身并不存储在文件头中。因此,由于值0x3c81b7f5 (Y)从未存储在头文件中,因此我无法编写应用程序代码来查找它,并且由于其他4个字节是一个静态值与另一个随机值的XOR结果,我不知道它是如何被识别的。
在询问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
发布于 2011-04-26 01:43:36
你真正感兴趣的是这里的这部分:
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函数通过可能的byte order调整将四个字节从data转换为一个无符号的四个字节的整数。第二次调用get_unaligned_be32时,data + 4将传递给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_MARKER是0x3c81b7f5,所以这个测试是XORing m_1和0x3c81b7f5,看看它是否等于m_2;如果这个比较是真的,那么您就有了正确的文件类型。
发布于 2011-04-26 02:07:11
如果"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。
https://stackoverflow.com/questions/5781061
复制相似问题