2012-06-16 11 views
7

Como el título - por favor alguien puede explicar cómo funciona los próximos guionesDeparsing/Decomposing - paso a paso este script Perl ofuscado

este imprime el texto: "Perl chicos son inteligentes"

''=~('(?{'.('])@@^{'^'-[).*[').'"'.('-[)@{:__({:)[{(-:)^}'^'}>[,[]*&[[[[>[[@[[*_').',$/})') 

este imprime sólo "b"

use strict; 
use warnings; 
''=~('(?{'.('_/).+{'^'/]@@_[').'"'.('=^'^'_|').',$/})') 

el Perl -MO = Deparse muestra sólo esto:

use warnings; 
use strict 'refs'; 
'' =~ m[(?{print "b",$/})]; 

pero no tengo idea de por qué ...; (

¿Cuál es la manera recomendada de descomponer como los scripts? ¿Cómo empezar?

así, probado esto:

'' =~ 
(
     '(?{' 
     . 
     (
       '])@@^{'^'-[).*[' 
     ) 
     . 
     '"' 
     . 
     (
       '-[)@{:__({:)[{(-:)^}'^'}>[,[]*&[[[[>[[@[[*_' 
     ) 
     . 
     ',$/})' 
) 

varias partes se concatenan por .. Y el resultado de la bit a bit ^ probablemente da las partes de texto. Los:

perl -e "print '-[)@{:__({:)[{(-:)^}'^'}>[,[]*&[[[[>[[@[[*_'" 

impresiones "chicos Perl son inteligentes" y la primera generación de ^ "imprimir".

Pero cuando, vuelvo a escribir a:

'' =~ 
(
    '(?{' 
    . 
    (
     'print' 
    ) 
    . 
    '"' 
    . 
    (
     'Perl guys are smart' 
    ) 
    . 
    ',$/})' 
) 

Mi Perl me dijo:

panic: top_env 

extraño, primera vez que vi como mensaje de error ...

Eso significa: no está permitido reemplazar el 'str1'^'str2' con el result, (no entiendo por qué) y por qué el perl imprime el mensaje de pánico?

mi Perl:

This is perl 5, version 12, subversion 4 (v5.12.4) built for darwin-multi-2level 

Sal: ejemplos se generan here

+0

"Learn Perl" es la respuesta obvia. –

+2

Pero realmente, nadie debería escribir código como este, por lo que no hay razón para tener que entenderlo. –

+0

gracias por la explicación;) – cajwine

Respuesta

5

En la línea

.('_/).+{'^'/]@@_[ 

cuando se evalúa ']'^'-', el resultado será la carta p.^ es una operación de cadena bit a bit, así que después de eso seguimos letra por letra para obtener cadena de resultados.

Compruebe mi secuencia de comandos, funciona como su ejemplo. Espero que te ayude.

use v5.14; 

# actually we obfuscated print and your word + " 
# it looks like that (print).'"'.(yor_word") 
my $print = 'print'; 
my $string = 'special for stackoverflow by fxzuz"'; 

my $left = get_obfuscated($print); 
my $right = get_obfuscated($string); 

# prepare result regexp 
my $result = "'' =~ ('(?{'.($left).'\"'.($right).',\$/})');"; 

say 'result obfuscated ' . $result; 
eval $result; 

sub get_obfuscated { 

    my $string = shift; 
    my @letters = split //, $string; 

    # all symbols like :,&? etc (exclude ' and \) 
    # we use them for obfuscation 
    my @array = (32..38, 40..47, 58..64, 91, 93..95, 123..126); 

    my $left_str = ''; 
    my $right_str = ''; 

    # obfuscated letter by letter 
    for my $letter (@letters) { 

     my @result; 
     # get right xor letters 
     for my $symbol (@array) { 

      # prepare xor results 
      my $result = ord $letter^$symbol; 
      push @result, { left => $result, right => $symbol } if $result ~~ @array; 
     } 

     my $rand_elem = $result[rand $#result]; 
     $left_str .= chr $rand_elem->{left}; 
     $right_str .= chr $rand_elem->{right}; 
    } 

    my $obfuscated = "'$left_str'^'$right_str'"; 
    say "$string => $obfuscated"; 

    return $obfuscated; 
} 
3

El truco para la comprensión de lo que está pasando aquí es mirar a la cadena que se construyeron los XORs y concatenaciones:

(?{print "Perl guys are smart",$/}) 

Esta es una característica de expresión regular experimental del formulario (?{ code }). Así que lo que se ve se imprime en el terminal es el resultado de

print "Perl guys are smart",$/ 

ser invocado por ''=~.... $/ es el separador de registros de entrada de Perl, que por defecto es una nueva línea.

Cuestiones relacionadas