estoy tratando de deobfuscate el siguiente código de Perl (source):¿Cómo deobfusacte correctamente una secuencia de comandos de Perl?
#!/usr/bin/perl
(my$d=q[AA GTCAGTTCCT
CGCTATGTA ACACACACCA
TTTGTGAGT ATGTAACATA
CTCGCTGGC TATGTCAGAC
AGATTGATC GATCGATAGA
ATGATAGATC GAACGAGTGA
TAGATAGAGT GATAGATAGA
GAGAGA GATAGAACGA
TC GATAGAGAGA
TAGATAGACA G
ATCGAGAGAC AGATA
GAACGACAGA TAGATAGAT
TGAGTGATAG ACTGAGAGAT
AGATAGATTG ATAGATAGAT
AGATAGATAG ACTGATAGAT
AGAGTGATAG ATAGAATGAG
AGATAGACAG ACAGACAGAT
AGATAGACAG AGAGACAGAT
TGATAGATAG ATAGATAGAT
TGATAGATAG AATGATAGAT
AGATTGAGTG ACAGATCGAT
AGAACCTTTCT CAGTAACAGT
CTTTCTCGC TGGCTTGCTT
TCTAA CAACCTTACT
G ACTGCCTTTC
TGAGATAGAT CGA
TAGATAGATA GACAGAC
AGATAGATAG ATAGAATGAC
AGACAGAGAG ACAGAATGAT
CGAGAGACAG ATAGATAGAT
AGAATGATAG ACAGATAGAC
AGATAGATAG ACAGACAGAT
AGACAGACTG ATAGATAGAT
AGATAGATAG AATGACAGAT
CGATTGAATG ACAGATAGAT
CGACAGATAG ATAGACAGAT
AGAGTGATAG ATTGATCGAC
TGATTGATAG ACTGATTGAT
AGACAGATAG AGTGACAGAT
CGACAGA TAGATAGATA
GATA GATAGATAG
ATAGACAGA G
AGATAGATAG ACA
GTCGCAAGTTC GCTCACA
])=~s/\s+//g;%a=map{chr $_=>$i++}65,84,67,
71;$p=join$;,keys%a;while($d=~/([$p]{4})/g
){next if$j++%96>=16;$c=0;for$d(0..3){$c+=
$a{substr($1,$d,1)}*(4**$d)}$perl.=chr $c}
eval $perl;
Cuando se ejecuta, imprime Just another genome hacker.
Después de ejecutar el código a través Deparse
y perltidy
(perl -MO=Deparse jagh.pl | perltidy
) el código es el siguiente :
(my $d =
"AA...GCTCACA\n" # snipped double helix part
) =~ s/\s+//g;
(%a) = map({ chr $_, $i++; } 65, 84, 67, 71);
$p = join($;, keys %a);
while ($d =~ /([$p]{4})/g) {
next if $j++ % 96 >= 16;
$c = 0;
foreach $d (0 .. 3) {
$c += $a{ substr $1, $d, 1 } * 4**$d;
}
$perl .= chr $c;
}
Esto es lo que he podido descifrar por mi cuenta.
(my $d =
"AA...GCTCACA\n" # snipped double helix part
) =~ s/\s+//g;
elimina todos los espacios en blanco en $d
(la doble hélice).
(%a) = map({ chr $_, $i++; } 65, 84, 67, 71);
hace un hash con claves como A
, T
, C
y G
y como valores 0
, 1
, 2
y 3
. Normalmente código en Python, por lo que esto se traduce en un diccionario {'A': 0, 'B': 1, 'C': 2, 'D': 3}
en Python.
$p = join($;, keys %a);
une las claves del hash con la $;
subscript separator for multidimensional array emulation. La documentación dice que el valor predeterminado es "\ 034", lo mismo que SUBSEP en awk, pero cuando lo hago:
my @ascii = unpack("C*", $p);
print @ascii[1];
me da el valor 28
? Además, no me queda claro cómo emula esto una matriz multidimensional. ¿Es $p
algo así como [['A'], ['T'], ['C'], ['G']]
en Python?
while ($d =~ /([$p]{4})/g) {
Mientras $d
partidos , ejecutar el código en el bloque de tiempo. pero dado que no entiendo completamente qué es la estructura $p
, también me cuesta entender qué sucede aquí.
next if $j++ % 96 >= 16;
continuar si el la $j
módulo 96 es mayor o igual a 16. $j
incrementos con cada pasada del bucle while (?).
$c = 0;
foreach $d (0 .. 3) {
$c += $a{ substr $1, $d, 1 } * 4**$d;
}
Para $d
en el rango 0
-3
extraer algunos subcadena, pero en este momento estoy completamente perdido. Las últimas líneas concatenan todo y evalúan el resultado.
Awesome question. – Rayfleck
Siempre debe tener cuidado con el código que 'eval's ofusca las cadenas. He visto una pregunta sinuosa aquí en stackoverflow que finalizó con una evaluación de una cadena que resultó ser '" rm -rf/"'. – TLP
Me recuerda a [Acme :: EyeDrops] (http://p3rl.org/Acme::EyeDrops). –