这个混淆的Perl代码如何工作?

use*_*639 7 obfuscation perl

这段代码怎么样?

#!/usr/bin/perl

$i=4;$|=@f=map{("!"x$i++)."K$_^\x{0e}"}
"BQI!\\","BQI\\","BQI","BQ","B","";push
@f,reverse@f[1..5];@f=map{join"",undef,
map{chr(ord()-1)}split""}@f;{;$f=shift@
f;print$f;push@f,$f;select undef,undef,
undef,.25;redo;last;exit;print or die;}
Run Code Online (Sandbox Code Playgroud)

Leo*_*ans 16

让我们首先通过perltidy

$i = 5;
$| = @f = map { ("!" x $i++) . "9$_*\x{0e}" } ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "";
push @f, reverse @f[ 1..5 ];
@f = map {
    join "",
      map { chr(ord() - 1) }
      split //
} @f;
{
    $f = shift @f;
    print $f;
    push @f, $f;
    select undef, undef, undef, .25;
    redo;
    last;
    exit;
    print or die;
}
Run Code Online (Sandbox Code Playgroud)

第一行是显而易见的.

第二行创建一个列表">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "",并将它们全部隔开,并添加一个星号和一个'Shift Out'(回车后的字符).

第三行将项目5到1(按此顺序)附加到该列表,因此它将是">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "", ">", ">>", ">>>", ">>>E".

地图将所有字符减1,从而创建像8===D ().

第二个循环只需每0.25秒循环打印一次循环中的元素.回车使它们相互覆盖,从而可以看到动画.最后几行永远不会到达,因此是虚假的.


mob*_*mob 14

来自文件的数据被加载到称为Perl解释器的程序中.解释器解析代码并将其转换为一系列"操作码" - 一种字节码语言,它位于Perl代码和代码运行的机器语言之间.如果转换过程中没有错误(称为"编译"),则代码由Perl解释器的另一部分执行.在执行期间,程序可以改变机器的各种状态,例如分配,解除分配,读取和写入存储器,或者使用输入/输出和系统的其他特征.

(CW - 比我欢迎的更多铁杆黑客更正任何错误或误解并添加更多信息)

  • 大声笑.自从我看到一个痛苦的字面阿比盖尔式回答以来,已经有很长一段时间了. (3认同)
  • +1 Stack Overflow eva的最大答案! (2认同)

Joh*_*lla 8

这里没有魔法,只是混淆.让我们采取高层次的观点.首先要注意的是,稍后,字符串中的每个字符都被解释为它是前一个字符:

[1] map{chr(ord()-1)} ...
Run Code Online (Sandbox Code Playgroud)

因此,像"6qD"这样的字符串将导致"5rC"(分别在'6','q'和'D'之前的字符).主要的兴趣点是开头附近的字符串数组:

[2] ">>>E!)",">>>E)",">>>E",">>>",">>",">",""
Run Code Online (Sandbox Code Playgroud)

这将我们稍后将替换的一系列"掩码"定义到此字符串中:

[3] "9$_*\x{0e}"
Run Code Online (Sandbox Code Playgroud)

它们将被插入到该$_点.该字符串\x{0e}表示十六进制控制字符; 请注意,\x{0d}就在它之前的字符是回车.当我们做[1]时,这将被替换为[3].

在[3]字符串汇编之前,我们!在[2]中为每个元素添加一个等于i 的数字.每个连续的元素!比它之前的元素多一个.请注意,其值之前的字符!是空格.

The rest of the script iterates over each of the assembled array elements, which now look more like this:

[4] "!!!!!9>>>E!)\x{0e}",  ---> "     8===D ("
    "!!!!!!9>>>E)\x{0e}",  ---> "      8===D("
    "!!!!!!!9>>>E\x{0e}",  ---> "       8===D"
    "!!!!!!!!9>>>\x{0e}",  ---> "        8==="
    "!!!!!!!!!9>>\x{0e}",  ---> "         8=="
    "!!!!!!!!!!9>\x{0e}",  ---> "          8="
    "!!!!!!!!!!!9\x{0e}",  ---> "           8"
Run Code Online (Sandbox Code Playgroud)

Then the reverse操作反向追加相同的元素,创建一个循环.

此时,您应该能够看到生成动画的模式emerge.现在只需要动画完成动画中的每一步,然后再返回,这是由脚本的其余部分完成的.每个步骤的时间步长延迟由select语句控制:

[5] select undef, undef, undef, 0.25
Run Code Online (Sandbox Code Playgroud)

它告诉我们在每次迭代之间等待250毫秒.如果要查看速度加快或减慢,可以更改此设置.