5

我有一些被“漂白”的 perl 文件(不知道它是来自 ACME::Bleach 还是类似的东西)。对 perl 不是很流利,我想了解启动文件的单行代码对后面的空格进行解码的作用:

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

文件的其余部分是空白字符,并且文件本身是可执行的(它位于 /bin 目录中)。

[解决方案],感谢@JB。

pack部分似乎是最复杂的,我花了一段时间才注意到发生了什么。Pack仅采用每 8 个字符的 LSB ,并将其解包为二进制中的大端字符。制表符因此变为“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('#')
4

2 回答 2

11
  • $_ = << '';将文件的其余部分读入累加器。
  • y;\r\n;;d;去除回车和换行。
  • $_ = pack 'b*', $_;将字符转换为 中的位$_,首先是 LSB。
  • $_ = eval;$_作为 Perl 代码执行。
  • $@ && die $@; $_优雅地处理异常和返回码。
于 2011-09-26T14:58:08.610 回答
3

unbleach.pl如果那是你真正想要做的,你可以用它来去除漂白。

于 2011-09-26T19:07:18.467 回答