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

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

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

使用Microsoft可移植可执行规范文档可以解析PE文件。 但是,正如Logan所说,签名包含在PE文件中; 仅包含导出函数的名称。

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

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

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

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