Скрипт Python для идентификации Inode Ext4 из необработанных данных раздела

В bash можно использовать переменную оболочки BASH _ARGV

shopt -s extdebug
# create the array BASH_ARGV with the parameter of the script
shopt -u extdebug
# No more need of extdebug but BASH_ARGV is created

f() {
  printf 'Caller $1: %s\n' ${BASH_ARGV[$((${#BASH_ARGV[*]}-1))]}
  printf '    My $1: %s\n' "$1"
}
f blah
0
03.03.2020, 00:27
1 ответ

Не существует действительно магических чисел для формата inode ext4 (, хотя об этом позже ), так что то, о чем вы просите, не совсем возможно. Существуют такие инструменты, как «findsuper» в коде e2fsprogs и ext3grep, которые будут сканировать устройство и находить магические номера суперблоков (возможно, резервные копии ), а затем вы можете попытаться использовать e2fsck для восстановления из это.

Поскольку ext4 имеет относительно фиксированный формат -диска, потребность в сканировании для поиска файлов возникает относительно редко. Легче найти суперблок, чем просто вычислить, где расположены дескрипторы групп (или их резервные копии ), а затем напрямую прочитать все иноды, поскольку их расположение фиксируется во время форматирования.

Однако , когда я писал это, я понял, что есть некоторые магические числа, которые вкрались в тело индексного дескриптора с некоторыми другими функциями, которые вы могли бы использовать, если вы действительно хотите пойти дальше. по этой дороге.

Функция быстрого xattr сохраняет xattr внутри индексного дескриптора, если индексный дескриптор достаточно велик (256 байт или больше, должен быть значением по умолчанию для всех современных файловых систем ), а xattr достаточно мал, чтобы соответствовать (верно для SELinux ).

EXT4_XATTR_MAGIC  0xEA020000

Это будет храниться во вторых 128 байтах индексного дескриптора после i_extra_bytesдополнительных полей индексного дескриптора. Как минимум, это будет правильно выровнено по границе 4 -байт, и, вероятно, будет около 128+32 байтов после начала индекса (в зависимости от версии ядра, в которой индекс был написан ).

Во-вторых, индексные дескрипторы, использующие формат экстента (, который также очень распространен в более новых файловых системах ), будут иметь магическое поле экстента, хранящееся в начале поля i_blocks, чтобы указать на использование этой функции:

EXT4_EXT_MAGIC    0xf30a

Если вы найдете одно или оба этих значения по соответствующим смещениям в индексном узле, скорее всего, у вас есть индексный дескриптор.

1
28.04.2021, 23:21

Теги

Похожие вопросы