-
Если искомый элемент является текстовой строкой, попробуйте использовать
-t
параметрhead
команды для печати смещения, где найдена строка. Поскольку пользователюgrep -m 1 GRUB
не важно, откуда взялись данные, он работает с файлами, блочными устройствами и входящими в него каналамиdd
.Пример с начала жесткого диска:
sudo strings -t d /dev/sda | grep -m 1 GRUB
Вывод:
392 GRUB
Вместо
head
этого может быть подключенbash
канал, который выводит только первую строку с « GRUB »:s=GRUB ; sudo strings -t d /dev/sda7 | grep "$s" | while read a b ; do n=${b%%${s}*} printf "String %-10.10s found %3i bytes into sector %i " ""${b#${n}}"" $(( (a % 512) + ${#n} )) $((a/512 + 1)) done | head -5
Вывод:
String "GRUB Boot found 7 bytes into sector 17074 String "GRUB." found 548 bytes into sector 25702 String "GRUB." found 317 bytes into sector 25873 String "GRUBLAYO" found 269 bytes into sector 25972 String "GRUB" found 392 bytes into sector 26457
Оттуда
dd
можно сделать довольно много. Этот код находит первые 5 экземпляров «GRUB» на моем загрузочном разделе / dev / sda7 :strings
Вывод (номера секторов здесь относятся к началу раздела):
strings
Что следует учитывать:
-
Не
dd
выполняйте -bastrings -td одноблочные поиски, такgrep
как это не сработает, если строка охватывает два блока. Используйтеbash
сначала, чтобы получить смещение, затем преобразуйте это смещение в блоки (или сектора). -
$n
может возвращать большие строки, а «игла» может содержать несколько байтов в строку, и в этом случае смещение будет началом большой строки, а неrafind2
строкой (или «иглой»). Вышеупомянутыйsudo rafind2 -Xs GRUB /dev/sda7 | head -7
код позволяет это и использует0x856207 - offset - 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF 0x00856207 4752 5542 2042 6f6f 7420 4d65 6e75 006e GRUB Boot Menu.n 0x00856217 6f20 666f 6e74 206c 6f61 6465 6400 6963 o font loaded.ic 0x00856227 6f6e 732f 0069 636f 6e64 6972 0025 733a ons/.icondir.%s: 0x00856237 2564 3a25 6420 6578 7072 6573 7369 6f6e %d:%d expression 0x00856247 2065 7870 6563 7465 6420 696e 2074 expected in t
для вычисления скорректированного смещения.
-
-
bash
Метод « ленивый все-в-одном» . Например, найдите первый экземпляр « GRUB » на / dev / sda7, как и раньше:sed
Вывод:
strings
С некоторыми
s=GRUB ; sudo rafind2 -Xs "$s" /dev/sda7 | sed -r "s/x1B[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | sed -r -n 'h;n;n;s/.{52}//;H;n;n;n;n;g;s/ //p' | while read a b ; do printf "String %-10.10s" found %3i bytes into sector %i " ""${b}" $((a%512)) $((a/512 + 1)) done | head -5
иsed
что выход может быть переработан в том же формате, что иstrings
вывод:sed
Первый
sed
экземпляр заимствован из ответа jfs на « Программа, передающая STDIN в STDOUT с разбитыми цветовыми кодами? » , Посколькуrafind2
выдает нетекстовые цветовые коды.Вывод:
String "GRUB Boot" found 7 bytes into sector 17074 String "GRUB....L" found 36 bytes into sector 25703 String "GRUB...LI" found 317 bytes into sector 25873 String "GRUBLAYO." found 269 bytes into sector 25972 String "GRUB .Geo" found 392 bytes into sector 26457