在.NET中解析普通的Win32 PE文件(Exe / DLL)

时间:2010-05-23 14:27:04

标签: c# .net-3.5 assemblies marshalling portable-executable

我需要解析普通的Win32 DLL / Exe并从中获取所有导入和导出以在控制台或GUI(即Win Forms)上显示。是否可以通过读取其导出/导入表并从中获取托管类型来解析C#.NET中的Win32 DLL / Exe?由于它是非托管PE,.NET不允许您将非托管PE文件转换为托管.NET程序集,它只生成COM托管程序集。

如何解析这些表并以托管形式获取所有方法(签名)。 (例如,如果char *作为参数,它应显示为IntPtr)。

3 个答案:

答案 0 :(得分:4)

查看.Net的PeNet库。它可以解析并列出DLL的所有导出/导入。您可以从github或直接作为NuGet包获取它。 https://github.com/secana/PeNet https://www.nuget.org/packages/PeNet/

(免责声明:我是该项目的作者)

答案 1 :(得分:2)

关于问题的第二部分,获取方法签名,作为一般规则,这是不可能的。该信息通常不存储在PE本身中。对于C ++函数,它是可能的,因为受损的名称将编码该信息,但许多DLL不公开C ++接口。对于COM接口,此信息存储在类型库中,通常作为资源嵌入到PE中。要查看您是否可以考虑特定的dll,可以使用dumpbin和undec来查看这些函数是否是C ++损坏的名称。如果没有,您将需要一些其他信息源(如头文件)来创建正确的P / Invoke签名(在这种情况下,您可能不需要解析PE文件)。

答案 2 :(得分:2)

使用Microsoft Portable Executable Specification Document可以解析PE文件。但是,正如Logan所指出的那样,签名是包含在PE文件中;只包含导出函数的名称。

更新:如果您的dll是由最新版本的Microsoft C ++编译器创建的C ++ DLL,那么您可以通过调用此函数来解除损坏的名称以获得大部分签名:UnDecorateSymbolName来自{{3} }。但是,返回值不包含在受损名称中。