2011-09-26 21 views
8

Tengo algunos archivos perl que han sido "blanqueados" (no sé si fue de ACME :: Bleach, o algo similar). Al no ser muy fluido en Perl, me gustaría entender lo que el de una sola línea que se inicia el archivo hace para decodificar el espacio en blanco que sigue:¿Qué hace esta línea perl de un archivo "blanqueado"?

$_=<<'';y;\r\n;;d;$_=pack'b*',$_;$_=eval;[email protected]&&[email protected];$_ 

El resto del archivo está espacios en blanco, y el archivo se ejecutable por sí mismo (se coloca en un directorio/bin).

[Solución], gracias a @JB.

La parte pack de esto parece ser la más compleja, y me tomó un tiempo darme cuenta de lo que estaba pasando. El paquete toma el LSB solo de cada 8 caracteres y lo descomprime como un personaje big-endian en binario. Las pestañas se convierten en '0's, y los espacios se convierten en' 1's.

'\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('#') 

Respuesta

10
  • $_ = << ''; lee el resto del archivo en el acumulador.
  • y;\r\n;;d; tiras devoluciones de carro y avances de línea.
  • $_ = pack 'b*', $_; convierte caracteres a bits en $_, LSB primero.
  • $_ = eval; ejecuta $_ como código Perl.
  • [email protected] && die [email protected]; $_ maneja las excepciones y el código de retorno correctamente.
+0

OK, creo que es la función 'pack' la que me está molestando. ¿Puedes aclarar cómo algo como ''\ t \ t \ t' 'se traduce en'' # ''? – JimB

+0

Lo sentimos, parece que los caracteres sin procesar todavía tienen espacios colapsados, esa cadena debe ser 'pestaña tab sp sp sp tab sp sp sp sp'. – JimB

+0

'tab' es' chr (9) ', impar; 'sp' es' chr (32) ', incluso. Así que su cadena se traduce en la secuencia de bits 1, 1, 0, 0, 0, 1, 0, 0, 0, que (LSB primero) es 0x23, el código ASCII para ''#''. (tiene un bit adicional) –

3

Puede usar unbleach.pl para eliminar el blanqueamiento, si eso es lo que realmente está tratando de hacer.

+2

Si bien esto podría responder teóricamente a la pregunta, [sería preferible] (http://meta.stackexchange.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia También protege contra link rot. –

+0

@ 0A0D, bien, fijo. Pensé que era evidente en este caso. – ikegami

+0

Estás siendo rechazado bc Nunca pregunté cómo desbloquear el archivo (además de que unbleach.pl no funcionará directamente en estos archivos sin algunos ajustes). Declaré que quería aprender cómo funciona la línea perl que inicia cada archivo. – JimB