Para aquellos interesados en la auténtica pétreas ... La primera parte, cuando las miradas de-enredada como esto:
$? ? s/;s/s;;$?/ :
s/(.*)/...lots of punctuation.../;
El $?
al comienzo de la línea es el predefinido variable de containing the child error, que sin duda sirve solo como ofuscación. No estará definido, ya que no puede haber ningún error infantil en este punto.
El signo de interrogación después de que es el inicio de un operador ternario
CONDITION ? IF_TRUE : IF_FALSE
que también se añade simplemente para confundir. La expresión devuelta para verdadero es una expresión regular de sustitución, donde el delimitador de barra oblicua /
se ha sustituido por dos puntos s:pattern:replacement:
. Arriba, he retrocedido. La otra expresión, que es la que se ejecutará también es una expresión regular de sustitución, aunque increíblemente larga. El delimitador es punto y coma.
Esta sustitución reemplaza a .*
en $_
- la entrada por defecto y el espacio de búsqueda de patrones - con una cantidad bastante grande de caracteres de puntuación, que representa la mayor parte del código. Desde .*
coincide con cualquier cadena, incluso la cadena vacía, simplemente se conseguirá inserta en $_
, y es para todos los efectos idénticos a simplemente asignar la cadena a $_
, que es lo que hice:
$_ = q;]="&\%[=.*.,-))'-,-# .......;;
La siguiente las líneas son un transliteration y otra sustitución.(Inserté comentarios señalar los delimitadores)
y; -"[%-.:<[email protected]]-`{-}#~\$\\;{\$()*.0-9\;\\_rs}&a-h;;
#^ ^ ^ ^
#1 2 3
(1,2,3 son delimitadores, el punto y coma entre 2 y 3 se escaparon)
La esencia básica de la misma es que varios caracteres y rangos -"
(espacio para comillas dobles), y algo que se parece a las clases de caracteres (con rangos) [%-.:<[email protected]]
, pero no lo es, se transcribe en caracteres más legibles, por ejemplo llaves, signo de dólar, entre paréntesis, 0-9
, etc.
s;(.*);$_;see;
El siguiente sustitución es donde sucede la magia. También es una sustitución con delimitadores ofuscados, pero con tres modifers: see
. s
no hace nada en este caso, ya que solo permite que el carácter comodín .
coincida con la línea nueva. ee
significa evaluar la expresión dos veces, sin embargo.
Para ver lo que estaba evaluando, realicé la transliteración e imprimí el resultado. Sospecho que en algún lugar a lo largo de la línea Tengo algunos caracteres corrompidos, porque había errores sutiles, pero aquí está el corto (limpiado) Versión:
s;(.*);73756220656e6372797074696f6e5f6 .....;; # very long line of alphanumerics
s;(..);chr(hex($1));eg;
s;(.*);$_;see;
s;(.*);704b652318371910023c761a3618265 .....;; # another long line
s;(..);chr(hex($1));eg;
&e_echr(\$_);
s;(.*);$_;see;
Las largas expresiones regulares son una vez más los contenedores de datos, e insertar datos en $_
para ser evaluado como código.
El s/(..)/chr(hex($1))/eg;
está empezando a parecer bastante legible. Básicamente está leyendo dos caracteres en el momento desde $_
y convirtiéndolo de hexadecimal en el carácter correspondiente.
La siguiente a la última línea &e_echr(\$_);
me dejó perplejo por un tiempo, pero es una subrutina que se define en algún lugar de este código evaluado, como Hobbs fue capaz de decodificar. El signo de dólar está precedido de una barra invertida, lo que significa que es una referencia al $_
: I.e. que la subrutina puede cambiar la variable global.
Después de bastantes evaluaciones, $_
se ejecuta a través de esta subrutina, después de lo cual todo lo que está contenido en $_
se evalúa por última vez. Presumiblemente esta vez ejecutando el código. Como dijo Hobbs, se requiere una clave, que se toma del entorno %ENV
de la máquina donde se ejecuta la secuencia de comandos. Que no tenemos
Parece normal Perl para mí ... ¿estás seguro de que este guión no está comercialmente autorizado y ofuscado? No estamos aquí para ayudarlo a violar los acuerdos de licencia. –
Me interesaría saber si eso hace algo, pero realmente no quiero ejecutarlo en el trabajo. Me recuerda a uno de [estos] (http://www.cpan.org/misc/japh) – MattLBeck
Incluso un programador de Perl bastante experimentado se avergonzaría frente a la basura de esa manera. No importa mucho lo que hace; es un código horrible –