2010-02-23 20 views
7

¿Cómo funciona este código?¿Cómo funciona este código Perl oscurecido?

#!/usr/bin/perl 

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

Cuál es el problema, excepto la fealdad extrema? – anthares

+0

Ruido de línea ejecutable :-D – Krab

+0

Las mágicas hadas de Perl hacen que todo suceda. – Ether

Respuesta

8

Aquí no pasa nada mágico, solo ofuscación. Tomemos una vista de alto nivel. La primera cosa a notar es que más tarde, todos los personajes de cuerdas se interpreta como si fuera el carácter anterior:

[1] map{chr(ord()-1)} ... 

Por lo tanto, una cadena como "6QD" dará lugar a "5RC" (los caracteres antes ' 6 ',' q 'y' D ', respectivamente). El principal punto de interés es la matriz de cadenas cerca del comienzo:

[2] ">>>E!)",">>>E)",">>>E",">>>",">>",">","" 

Esto define una secuencia de "máscaras" que vamos a sustituir más adelante, en esta cadena:

[3] "9$_*\x{0e}" 

van a se inserta en el punto $_. La cadena \x{0e} representa un carácter de control hexadecimal; Observe que \x{0d}, el carácter justo antes, es un retorno de carro. Eso es lo que será sustituido en [3] cuando lo hagamos [1].

Antes de ensamblar la cadena [3], anteponemos un número de ! igual a i a cada elemento en [2]. Cada elemento sucesivo obtiene uno más ! que el elemento anterior. Tenga en cuenta que el carácter cuyo valor es justo antes de ! es un espacio .

El resto de las iteraciones de script más de cada uno de los elementos de la matriz ensamblados, que ahora se parecen más a esto:

[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" 

Entonces la operación reverse anexa los mismos elementos a la inversa, la creación de un bucle.

En este punto, debería poder ver el patrón emergente que produce la animación. Ahora solo se trata de avanzar en cada paso de la animación y viceversa, lo cual se logra con el resto del guión. El retraso de paso de tiempo de cada paso se rige por la instrucción de selección:

[5] select undef, undef, undef, 0.25 

que nos dice que espere 250 milisegundos entre cada iteración. Puede cambiar esto si quiere ver que se acelere o reduzca la velocidad.

+0

Reemplacé la fuente original con un código aproximadamente equivalente, que es seguro para el trabajo. Solo te hago saber en caso de que quieras modificar tu respuesta. –

16

permite poner primero esto a través de 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; 
} 

La primera línea es obvia.

La segunda línea hace una lista ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "", y los espacia a todos para que sean igualmente largos y agrega un asterisco y un 'Shift Out' (el caracter después de un retorno de carro).

La tercera línea agrega los artículos 5 a 1 (en ese orden) a esa lista, por lo que será ">>>E!)", ">>>E)", ">>>E", ">>>", ">>", ">", "", ">", ">>", ">>>", ">>>E".

El mapa disminuye todos los caracteres por uno, creando así elementos como 8===D().

El segundo ciclo simplemente imprime los elementos en la lista en un bucle cada 0.25 segundos. El retorno de carro hace que se sobrescriban entre sí para que se vea una animación.Las últimas dos líneas nunca se alcanzan y, por lo tanto, son falsas.

+0

Reemplacé la fuente original con un código aproximadamente equivalente, que es seguro para el trabajo. Solo te hago saber en caso de que quieras modificar tu respuesta. –

14

Los datos del archivo se cargan en un programa llamado intérprete de Perl. El intérprete analiza el código y lo convierte en una serie de "códigos de operación", un lenguaje de códigos de bytes que está a medio camino entre el código de Perl y el lenguaje de máquina en el que se está ejecutando el código. Si no hubo errores en el proceso de conversión (llamado "compilación"), entonces el código es ejecutado por otra parte del intérprete de Perl. Durante la ejecución, el programa puede cambiar varios estados de la máquina, como asignar, desasignar, leer y escribir en la memoria, o usar la entrada/salida y otras características del sistema.

(CW - los piratas informáticos más graves de lo que son bienvenidos para corregir cualquier error o conceptos erróneos y para añadir más información)

+3

LOL. Ha pasado mucho tiempo desde que vi una respuesta dolorosamente literal de Abigail. –

+2

+1 La mejor respuesta individual en Stack Overflow eva! – Sampson

Cuestiones relacionadas