2010-11-23 35 views
2

Le problème que j'ai est quand j'ai un script Perl lisant des données (PE exécutable) via STDIN et le flux contient un terminateur de ligne "0A" la conversion en hexa manque. Ensuite, quand je convertis les données hexadécimales, il est corrompu (0A manquant dans le format hexadécimal). Alors, comment puis-je détecter la version "windows" du saut de ligne "0A" en Perl?Perl convertissant le flux binaire en hexadécimal

Note: Linux OS (Perl) est en train de lire un Windows PE

!usr/bin/perl 

while($line = <STDIN>) 
{ 
    chomp($line); 
    @bytes = split //, $line; 
    foreach (@bytes) 
    { 
     printf "%02lx", ord $_; 
    } 
} 

Exemple d'utilisation:

[[email protected] test]# cat test.exe | perl encoder.pl > output 

Répondre

6

Dans votre boucle, vous utilisez chomp sur chaque ligne d'entrée. Cela supprime la valeur qui est actuellement $/ à la fin de votre ligne. Les chances sont que c'est 0x0a, et c'est là que la valeur va. Essayez de supprimer chomp($line) de votre boucle. En général, l'utilisation de la lecture orientée ligne n'a aucun sens pour les fichiers binaires qui ne sont pas eux-mêmes orientés ligne. Vous devriez jeter un oeil à la fonction de niveau inférieur read qui vous permet de lire un bloc d'octets à partir du fichier sans se soucier de ce que sont ces octets. Vous pouvez ensuite traiter vos données en blocs au lieu de lignes.

+0

Wow, c'est embarrassant. J'ai plongé directement dans 'binmode()' et je n'ai même pas vu 'chomp'. –

+2

De plus, vous trouverez 'unpack ('H *', $ chaîne_binaire)' est beaucoup plus efficace que 'split' et' printf '% 02x''. – cjm

+0

a effectué une modification #!/Usr/bin/perl binmode (STDIN); while () { #print $ _; push (@bytes, $ _); } foreach (@bytes) { printf "% 02lx", ord $ _; } – ekronnenburg

1
#With split 
cat magic.exe | perl -e 'print join("", map { sprintf("\\x%02x", ord($_)) } split(//, join("", <STDIN>)))' > hex_encoded_binary 

#With pack 
cat magic.exe| perl -e 'print join("", map { "\\x" . $_ } unpack("H*", join("", <STDIN>)) =~ /.{2}/gs)' > hex_encoded_binary