2010-11-23 18 views
2

Das Problem, das ich habe, ist, wenn ich ein Perl-Skript lesen Daten (PE Executable) über STDIN und der Stream enthält einen Zeilenabschluss "0A" die Konvertierung in Hex fehlt. Dann, wenn ich die Hex-Daten zurückkonvertiere, ist es beschädigt (fehlende 0A im Hex-Format). Wie kann ich die "Windows" Version des Zeilenvorschubs "0A" in Perl erkennen?Perl konvertieren binären Stream zu hex

Hinweis: Linux-Betriebssystem (Perl) liest ein Windows PE

!usr/bin/perl 

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

Anwendungsbeispiel:

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

Antwort

6

In der Schleife, die ausgeführt werden chomp auf jeder Eingangsleitung. Dadurch wird der aktuelle Wert $/ vom Ende der Zeile entfernt. Wahrscheinlichkeiten sind 0x0a, und das ist, wo der Wert geht. Versuchen Sie, chomp($line) aus Ihrer Schleife zu entfernen.

Im Allgemeinen ist die Verwendung von zeilenorientiertem Lesen für binäre Dateien, die selbst nicht zeilenorientiert sind, nicht sinnvoll. Sie sollten sich die Funktion read auf der unteren Ebene ansehen, mit der Sie einen Block von Bytes aus der Datei lesen können, ohne sich darum kümmern zu müssen, um welche Bytes es sich handelt. Sie können Ihre Daten dann in Blöcken statt in Zeilen verarbeiten.

+0

Wow, das ist peinlich. Ich tauchte direkt in "binmode()" und sah nicht einmal den "chomp". –

+2

Außerdem finden Sie 'entpacken (' H * ', $ binary_string) 'ist _much_ effizienter als' split' und 'printf'% 02x''. – cjm

+0

eine Änderung vorgenommen #!/Usr/bin/perl Binmodus (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