Как я нахожу смещение ext4 файловой системы?

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

Когда данные считаны или записаны в файл устройств, запрос обработан драйвером для того устройства. Каждый файл устройств имеет связанное число, которое определяет драйвер для использования. То, что устройство делает с данными, является его собственным делом.

Блочные устройства (также названный блоком специальные файлы) обычно ведут себя много как обычные файлы: они - массив байтов, и значение, которое читается в данном местоположении, является значением, которое было в последний раз записано там. Данные из блочного устройства могут кэшироваться в памяти и читать назад из кэша; записи могут быть буферизованы. Блочные устройства обычно seekable (т.е. существует понятие положения в файле, который приложение может изменить). Название “блочное устройство” происходит от того, что соответствующие аппаратные средства обычно читают и пишут целый блок за один раз (например, сектор на жестком диске).

Устройства посимвольного ввода-вывода (также названный символьными специальными файлами) ведут себя как каналы, последовательные порты, и т.д. Запись или чтение в них являются незамедлительным принятием мер. То, что драйвер делает с данными, является его собственным делом. Запись байта к устройству посимвольного ввода-вывода могла бы заставить это быть отображенным на экране, произведите на последовательном порте, преобразованном в звук... Чтение байта от устройства могло бы заставить последовательный порт ожидать входа, мог бы возвратить случайный байт (/dev/urandom)... Название “устройство посимвольного ввода-вывода” происходит от того, что каждый символ обрабатывается индивидуально.

Посмотрите Википедию и Понимающий/dev и ее subdirs и файлы для получения дополнительной информации.

9
05.12.2013, 22:48
6 ответов

Нет серовато-синего смещения стандарта с курса, можно запустить раздел везде, где Вы хотите. Но давайте предположим на мгновение поиск первого раздела, и он был создан более или менее принимающие значения по умолчанию. Существует затем два места, можно найти его, предположив использование традиционной таблицы Раздела DOS:

  1. Запуск в (512-байтовом) секторе 63. Это было традицией в течение очень долгого времени и работало, пока кто-то не придумал 4K диски...
  2. Запуск в (512-байтовом) секторе 2048. Это - новая традиция, для размещения 4K дисков.
  3. Бонусная опция! Sarting в секторе 56. Это - то, что происходит, если кто-то перемещается, 63 - запускают раздел, чтобы заставить его выровняться с 4K сектором.

Теперь, для продолжения Вы захотите взять свой любимый инструмент шестнадцатеричного дампа и узнать немного о ext4 Структуре диска. В частности, это запускается с 1 024 байтов дополнения, которое игнорирует ext4. Затем прибывает суперблок. Можно распознать суперблок путем проверки на магическое число 0xEF53 при смещении 0x38 (от суперблока, запускаются, или 0x438 от раздела запускаются, или 1080 в десятичном числе.) Магическое число является прямым порядком байтов. Таким образом, это на самом деле хранится на диске как 0x53EF.

Вот то, с чем это похоже xxd -a:

0000000: 0000 0000 0000 0000 0000 0000 0000 0000 ................ * 0000400: 0040 5d00 0084 7401 33a0 1200 33db a600 .@]...t.3...3... 0000410: 4963 5300 0000 0000 0200 0000 0200 0000 IcS............. 0000420: 0080 0000 0080 0000 0020 0000 6637 0952 ......... ..f7.R 0000430: 6637 0952 0200 1600 53ef 0100 0100 0000 f7.R....S....... 0000440: 9938 f851 004e ed00 0000 0000 0100 0000 .8.Q.N..........

Обратите внимание на то, что при предоставлении смещения для монтирования (или losetup), необходимо дать смещение туда, где дополнение запускается — не суперблок.

Теперь, если не первый раздел, или иначе не находится в одном из два (три) ожидаемые пятна, Вы в основном добираетесь для поиска магического числа 0xEF53. Это что testdisk (рекомендуемый в комментарии), делает для Вас.

12
27.01.2020, 20:04
  • 1
    !!! Я должен был записать свой собственный сценарий. testdisk не нашел бы его. Спасибо всем за справку. –  Ernest A 07.12.2013, 00:10
  • 2
    На основе этого можно использовать что-то как dd if=/dev/sda skip=$start_sector | xxd -a | grep '[02468]30: .... .... .... .... 53ef' получить некоторые вероятные соответствия. Вероятно, не очень быстро, но можно позволить ему работать при нахождении лучшего метода. –  mwfearnley 16.02.2017, 00:45
  • 3
    См. мой ответ ниже для "лучшего метода" теперь.Примечание: просто сканирование для этого числа в случайных данных найдет ложь положительной каждые 65 536 секторов (32 МБ). –  mwfearnley 25.02.2017, 13:24

Выскажите предположение как, туда, где раздел запускается, и примените некоторую грубую силу:

bsz=512 # or 1024, 2048, 4096 higher = faster

for i in {2..10000000}; do
    echo "--->$i<---"
    mount -o offset=$(($bsz*$i)) -t ext4 /dev/whatever /mnt/foo
    if [ $? == 0 ]; then # whahoo!
        echo Eureka
        break
    fi
done

Я предполагаю, что это могло занять время, но если Вы уже провели 6 часов с испытательным стендом, возможно, это стоит попытки.

2
27.01.2020, 20:04
  • 1
    Ха, это - много грубой силы! –  derobert 06.12.2013, 00:28
  • 2
    Это работает, но это медленно; я попробовал это на изображении мультираздела, смещения которого я знал, таким образом, я мог запустить его довольно близко. Добавил echo "--->$i<---" строка из-за этого, так как иначе невозможно измерить прогресс. Я думаю, что Вы могли увеличиться bsz к 4 096, который ускорит вещи. –  goldilocks 06.12.2013, 14:27
  • 3
    Вы могли ускорить его много, если Вы принимаете традиционное расположение, где разделы запускаются на "дорожке" (или это цилиндр?) граница. –  derobert 06.12.2013, 15:13
  • 4
    моя оценка была бедным для этого решения быть практичной, но может работать при других обстоятельствах –  Ernest A 07.12.2013, 01:14

Это не тестируется, но я думаю, что можно использовать метод, обсужденный в этом SU названные Вопросы и ответы: Обратный поиск inode/file от смещения в неструктурированном устройстве на Linux и ext3/4?.

Похоже, что можно использовать inode файла + дисковое смещение + размер блока для определения смещения файла.

0
27.01.2020, 20:04
  • 1
    , который я не вижу, как этот метод мог помочь мне выяснить, где файловая система запускается. –  Ernest A 05.12.2013, 23:45
[117760]Попробуйте другой вариант (например, используя debugfs и fsck.ext4): debugfs:

Сначала нужно смонтировать debugfs (а не неисправный жесткий диск):

http://johnsofteng.wordpress.com/2013/11/20/sysfs-procfs-sysctl-debugfs-and-other-similar-kernel-interfaces/

http://afzalkhanlinuxtalk.wordpress.com/2013/08/07/how-to-recover-deleted-file-in-linux/comment-page-1/#comment-8

http://blesseddlo.wordpress. com/2010/10/12/using-debugfs/

(по сути, использовать "debugfs -w" с режимом записи, а затем "lsdel", чтобы перечислить все удаленные файлы). В качестве альтернативы вы можете использовать

и вот fsck.ext4:

http://linuxexpresso.wordpress. com/2010/03/31/repair-a-broken-ext4-superblock-in-ubuntu/

Другой - "sleuthkit" ("sudo apt-get install sleuthkit"), который имеет команду типа "istat" для предоставления блокам информации об inodes - из которой вы можете получить смещение и, таким образом, легко заблокировать содержимое данных.

https://www.ibm.com/developerworks/cn/linux/l-cn-ext4resize/

(BTW, если размер блока 1024, то из команды debugfs "show_super_stats" следует, что блок 1 - это смещение в 1024 байта от начала диска, и каждая группа блоков тоже может иметь несколько блоков)[117783].

2
27.01.2020, 20:04

Основываясь на ответе @ derobert , я написал программу ( gist ), которая будет анализировать входной поток из dd и сканировать каждый сектор в поисках чего-то, что выглядит как начало раздела ext.

Он будет работать так же быстро, как dd может читать с вашего жесткого диска. Сокращенная версия ниже.

Самый простой вариант использования - sudo dd if = / dev / xxx | ext2scan , хотя вы, вероятно, захотите изменить команду dd , чтобы улучшить размер блока или выбрать область для поиска.

#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main() {
  unsigned char const MAGIC[2] = {0x53, 0xef};
  unsigned char const ZEROS[512] = {0};

  long long int sector = 0;

  char buf[4][512];
  int empty1, empty2;

  while (read(STDIN_FILENO, buf[sector&3], 512) > 0) {
    if (!memcmp(buf[sector&3] + 0x38, MAGIC, 2)) {
      printf("Found a possible ext2 partition at sector %lld", sector-2);

      empty1 = !memcmp(buf[(sector-2)&3], ZEROS, 512);
      empty2 = !memcmp(buf[(sector-1)&3], ZEROS, 512);

      if (empty1 && empty2) printf(" (first two sectors are empty :)\n");
    }
    sector++;
  }
}

Примечание: он обнаружит не только начало разделов, но и суперблоки в них.

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

5
27.01.2020, 20:04

У меня был образ прошивки электронной -книги, который включал образ раздела ext3fs, чтобы смонтировать и отредактировать его, мне пришлось сканировать образ с помощью инструмента bgrep , чтобы найти все позиции магического числа ext3fs 0x53EFи попробуйте смонтировать, используя найденные смещения.

Вот укороченный скрипт, выполняющий монтирование:

#!/bin/sh
FW_IMAGE=$1
MOUNT_POINT=$2

FS_TYPE=ext3
EXTFS_MAGIC_NUM=53ef
MAGIC_OFFSET=1080

OFFSETS=`bgrep $EXTFS_MAGIC_NUM $FW_IMAGE | awk '{print toupper($NF)}'`
for OFFSET in $OFFSETS; do
  OFFSET=`echo "ibase=16; $OFFSET" | bc`
  OFFSET=`expr $OFFSET - $MAGIC_OFFSET`
  sudo mount -t $FS_TYPE -o loop,offset=$OFFSET $FW_IMAGE $MOUNT_POINT 2>/dev/null
  if [ $? -eq 0 ]; then
    echo "Success!  Offset is: $OFFSET."
    break
  fi
done

Полный скрипт находится здесь .

1
27.01.2020, 20:04

Теги

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