我正在尝试写一个简单的Python脚本; 最好用pefile,可以告诉我,如果一个exe或dll文件编译.NET。 我知道我可以查找string“BSJB”来查看程序是否是用.NET编写的,但是我正在尝试以比python更强的方式来执行此操作。 运行pefile.PE('my.exe')。dump_info()给了我一些很好的信息,但是不足以查明它是否实际上是dot Net还是什么版本的dot Net。
谢谢!
您可以通过检查是否填入IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR(即,其VirtualAddress和Size不为零)来标识.NET程序集。 该条目的名称令人困惑,但它是用于.NET元数据的名称; 请参阅PE目录的名称 。
如果您需要程序集所需的框架版本,那么您将不得不自己分析元数据结构,pefile似乎不支持。 如果你能做到这一点,那么根据http://www.ntcore.com/files/dotnetformat.htm你会发现字段在那里称为MajorRuntimeVersion和MinorRuntimeVersion,虽然我不知道这些应该如何解释。
最终的代码最终是:
isDotNet = pe.OPTIONAL_HEADER.DATA_DIRECTORY[14] if isDotNet.VirtualAddress == 0 and isDotNet.Size == 0: print colors.RED + 'Not a .NET executable' else: print colors.BLUE + 'Is a .NET executable'