Чтение двоичного файла как массив байтов или 16 или 32 бита с помощью сценария оболочки

Как быстрое и грязное обходное решение, можно загрузить сборку с восходящего потока, Mozilla Foundation, единственных, кто имеет право по закону делать сборки того веб-браузера с именем "Firefox" и с логотипом лисы-и-земного-шара.

Но с помощью текущей версии Вы имеете, возможно, это - стоящая того, чтобы попытаться попытка некоторых инструкций заменить связанные значки (здесь, значки находятся под /usr/lib/firefox/chrome/icons/default/).

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

4
19.06.2013, 12:20
3 ответа

Использовать tr (здесь rot128):

LC_ALL=C tr '\0-\377' '\200-\377\0-\177' < infile > outfile

Для XOR 123 необходимо было бы вычислить соответствие tr строка:

LC_ALL=C tr '\0-\377' '\173\172\171\170\177\176\175\174\163\162\161\160\167\166\165\164\153\152\151\150\157\156\155\154\143\142\141\140\147\146\145\144\133\132\131\130\137\136\135\134\123\122\121\120\127\126\125\124\113\112\111\110\117\116\115\114\103\102\101\100\107\106\105\104\73\72\71\70\77\76\75\74\63\62\61\60\67\66\65\64\53\52\51\50\57\56\55\54\43\42\41\40\47\46\45\44\33\32\31\30\37\36\35\34\23\22\21\20\27\26\25\24\13\12\11\10\17\16\15\14\3\2\1\0\7\6\5\4\373\372\371\370\377\376\375\374\363\362\361\360\367\366\365\364\353\352\351\350\357\356\355\354\343\342\341\340\347\346\345\344\333\332\331\330\337\336\335\334\323\322\321\320\327\326\325\324\313\312\311\310\317\316\315\314\303\302\301\300\307\306\305\304\273\272\271\270\277\276\275\274\263\262\261\260\267\266\265\264\253\252\251\250\257\256\255\254\243\242\241\240\247\246\245\244\233\232\231\230\237\236\235\234\223\222\221\220\227\226\225\224\213\212\211\210\217\216\215\214\203\202\201\200\207\206\205\204'

В более общем плане, чтобы ответить на вопрос, преобразовать файл в массив чисел, которые будут использоваться оболочкой со стандартными командами:

set -- $(od -An -vtu1 < infile)

Можно затем применить преобразования, которые Вы хотите и преобразовываете назад в файл с awk printf("%c").

Это будет очень неэффективным все же.

Как:

for i in $(od -An -vtu1 < infile); do
  echo "$(($i ^ 123))"
done | awk '{printf "%c", $0}' > outfile

Можно использовать od -An -vtu2, чтобы получить числа на 16 битов, но отметить, что это находится в локальном порядке байтов, поэтому при преобразовании назад в символы, необходимо принять это во внимание.

3
27.01.2020, 20:51
  • 1
    Это не делает никакого полезного шифрования. Необходимо варьироваться преобразование с каждым символом. –  Gilles 'SO- stop being evil' 20.06.2013, 02:24
  • 2
    @Gilles, определите "полезный" в этом контексте. –  Stéphane Chazelas 20.06.2013, 09:30
  • 3
    Полезный =, который не может тривиально быть поврежден. Шифрование это тривиально повреждается, не хуже, чем никакое шифрование: это добавило сложность и дает иллюзию безопасности, не обеспечивая безопасности. –  Gilles 'SO- stop being evil' 20.06.2013, 10:15

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

Если Вы имеете xxd:

xxd -b | awk '{ for(i=2 ; i<=NF-1 ; i++) { print $i } }'

Например:

echo -n mayonnaise | xxd -b | awk '{ for(i=2 ; i<=NF-1 ; i++) { print $i } }'
01101101
01100001
01111001
01101111
01101110
01101110
01100001
01101001
01110011
01100101
2
27.01.2020, 20:51
  • 1
    Обратите внимание, что Ваше первое предложение не относится zsh который может сохранить NUL в его переменной. zsh вряд ли будет установлен на машине OP все же. –  Stéphane Chazelas 20.06.2013, 10:11

Я привык эту очень сырую функцию для xor два 128-байтовых файла:

one_time_pad() {
    asrc="$1"
    bsrc="$2"
    dst="$3"

    atmp="`mktemp`"
    btmp="`mktemp`"

    hexdump -v -e '1/1 "%02x" " "' "$asrc" > "$atmp"
    hexdump -v -e '1/1 "%02x" " "' "$bsrc" > "$btmp"

    rm "$dst"
    touch "$dst"

    for i in `seq 1 128`
    do
        a=`awk '{print $'$i';}' < "$atmp"`
        b=`awk '{print $'$i';}' < "$btmp"`

        echo -n -e '\x'`printf "%x" $((0x$a^0x$b))` >> "$dst"
    done
}

one_time_pad in1 in2 out

Производительность, мудрая, это совершенно ужасно (она называет awk дважды для каждого байта!). В моем случае производительность просто не была проблемой. Я уверен, что можно найти намного лучший путь.

2
27.01.2020, 20:51

Теги

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