如何使用Perl从WinNT可移植可执行文件中读取标头?

时间:2009-09-13 21:15:17

标签: perl portable-executable

我想在Perl中使用PE文件并且没有找到模块,所以我想我会编写自己的(已经在delphi中做过一次)。

我只遇到一个问题,当将可执行文件映射到缓冲区时,如何搜索像0x00004550(IMAGE_NT_SIGNATURE)这样的八进制文件,将它们转换回可写字符串等?

2 个答案:

答案 0 :(得分:9)

一个Perl模块来操作可移植的可执行文件:Win32::Exe

我对您的确切问题一无所知,但如果您仍想编写自己的库,Win32::Exe可能是一个很好的参考。

答案 1 :(得分:2)

要将该值转换为字节字符串表示形式,请使用pack。您处理的常量是一个小端32位值,因此模板中的“V”。

$ perl -e 'print pack q[V], 0x00004550' | hd
00000000  50 45 00 00                                       |PE..|
00000004

有关详细信息,请参阅perldoc -f pack

您可能不需要搜索“PE \ 0 \ 0”之类的字符串,只需使用它们来验证您正在读取的文件是否是PE文件。 'PE'部分通常位于DOS('MZ')部分后面,该部分有自己的长度字段。

(我同意Win32::Exe可能值得一看,具体取决于你想做什么。)