Что делает эта строка perl из "отбеленного" файла? - PullRequest
7 голосов
/ 26 сентября 2011

У меня есть некоторые perl-файлы, которые были "отбелены" (не знаю, было ли это из ACME :: Bleach или что-то подобное). Не очень хорошо разбираясь в perl, я хотел бы понять, что делает однострочный файл, запускающий файл, для декодирования следующих пробелов:

$_=<<'';y;\r\n;;d;$_=pack'b*',$_;$_=eval;$@&&die$@;$_

Остальная часть файла состоит из пробельных символов, и файл является исполняемым сам по себе (он помещается в каталог / bin).

[Решение], спасибо @ JB.

Эта часть pack кажется наиболее сложной, и мне потребовалось некоторое время, чтобы заметить, что происходит. Пак берет LSB только из каждых 8 символов и распаковывает его как двоичный символ с прямым порядком байтов. Следовательно, табуляция становится «0», а пробелы - «1».

    '\t\t   \t  ' => '#'
in binary:
    00001001 00001001 00100000 00100000 00100000 00001001 00100000 0100000
every LSB:
    1 1 0 0 0 1 0 0
convert from from big-endian format:
    0b00100011 == 35 == ord('#')

Ответы [ 2 ]

10 голосов
/ 26 сентября 2011
  • $_ = << ''; считывает остаток файла в аккумулятор.
  • y;\r\n;;d; удаляет возврат каретки и перевод строки.
  • $_ = pack 'b*', $_; преобразует символы в биты в $_, сначала LSB.
  • $_ = eval; выполняет $_ как код Perl.
  • $@ && die $@; $_ обрабатывает исключения и код возврата изящно.
3 голосов
/ 26 сентября 2011

Вы можете использовать unbleach.pl для удаления отбеливания, если это то, что вы действительно пытаетесь сделать.

...