Как этот уникальный заголовок файла 'special marker' сообщает eCryptfs, что это файл eCryptfs? - PullRequest
1 голос
/ 25 апреля 2011

Я пишу программу (используя Free Pascal, а не C), которая анализирует заголовок файлов eCryptfs.

Одно из значений в заголовке начинается с байта 7 и заканчивается 15 (8-байтовое значение). Это полезно для меня, потому что это значение, которое однозначно определяет файлы как файлы eCryptfs. Поэтому я пытаюсь закодировать свое приложение, чтобы оно распознало его в файлах.

Однако сам маркер генерируется путем XOR'а случайным образом генерируемого 4-байтового значения (X) с другим 4-байтовым статическим шестнадцатеричным значением 0x3c81b7f5 (Y). Сгенерированное значение составляет 4 байта, Z. X + Z вместе образуют специальный 8-байтовый маркер. Сам Y не хранится в заголовке файла. Таким образом, видя, что значение 0x3c81b7f5 (Y) никогда не сохраняется в заголовке, я не могу написать свое приложение для его поиска и видеть, как остальные 4 байта являются результатом XOR одного статического значения с другим случайным Я не могу понять, как это признано.

Спросив, как программа eCryptfs распознает это значение как "файл eCryptfs" на сайте панели запуска eCryptfs (https://answers.launchpad.net/ecryptfs/+question/152821,, одно из сообществ направило меня к соответствующему исходному коду C, с которым я связался ниже. Однако Я недостаточно хорошо понимаю C, чтобы понять, как он распознает специальные маркеры. Может ли кто-нибудь мне помочь, чтобы я мог кодировать такой же процесс распознавания в свое собственное приложение? Я не хочу исходный код, но я просто хочу кто-то, чтобы объяснить, как работает код C: «Ах, да, это файл eCryptfs прямо сейчас!», поэтому я знаю, что мне нужно для написания кода моего приложения.

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

Ответы [ 2 ]

4 голосов
/ 25 апреля 2011

Что вас действительно интересует, так это часть здесь:

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 в 4-байтовое целое число без знака с возможным порядком байтов Корректировки. 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_MARKER - это 0x3c81b7f5 , поэтому этот тест просто XORing m_1 и 0x3c81b7f5 и видеть, равно ли оно m_2; если это сравнение верно, то вы иметь правильный тип файла.

1 голос
/ 25 апреля 2011

Если под «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.

...