我遇到的问题是当我有一个Perl脚本通过STDIN读取数据(PE可执行文件)并且流包含行终止符“0A”时,转换为十六进制错过了它。然后,当我将十六进制数据转换回来时,它已损坏(以十六进制格式丢失0A)。那么如何在Perl中检测换行符“0A”的“windows”版本?
注意:Linux OS(Perl)正在读取Windows PE
!usr/bin/perl
while($line = <STDIN>)
{
chomp($line);
@bytes = split //, $line;
foreach (@bytes)
{
printf "%02lx", ord $_;
}
}
用法示例:
[root@mybox test]# cat test.exe | perl encoder.pl > output
答案 0 :(得分:6)
在循环中,您在每个输入行上运行chomp
。这将删除您行末尾$/
中当前的任何值。这可能是0x0a
,这就是价值的来源。尝试从循环中删除chomp($line)
。
通常,使用面向行的读取对于本身不是面向行的二进制文件没有意义。您应该查看较低级read
函数,该函数允许您从文件中读取一个字节块,而无需关心这些字节是什么。然后,您可以使用块而不是行来处理数据。
答案 1 :(得分: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