【问题标题】:Parsing plain Win32 PE File (Exe/DLL) in .NET在 .NET 中解析普通的 Win32 PE 文件(Exe/DLL)
【发布时间】:2011-02-22 22:35:03
【问题描述】:

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

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

【问题讨论】:

  • Usman,没有“C#.NET”这样的想法。
  • @John : C# 属于.NET ..?我说了一些奇怪的话..?
  • 不,C# 是一种编程语言,它在很大程度上独立于 .NET Framework。还有其他几种编程语言可以像使用 C# 一样使用 .NET Framework。
  • 我认为 C#.NET 是一个合适的规范,考虑到 C# 也可以在 Mono 上运行。 C# 是一门起源于 .NET 的语言,这种说法是完全恰当的。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    更新:如果您的 dll 是由 Microsoft 的 C++ 编译器的最新版本创建的 C++ dll,那么您可以通过调用此函数来取消修饰损坏的名称以获取大部分签名:UnDecorateSymbolName from Debugging Tools for Windows。但是,返回值不包含在损坏的名称中。

    【讨论】:

    • 名字被装饰了。当您取消装饰它们时,您会得到确切的签名(除了参数名称,只是类型)。所以通过这种方式你得到了几乎 90% 的签名。
    • 绝大多数 Windows 的 DLL 都有 C 风格的接口和未修改的名称,没有参数信息。如果您有一些特定的 dll,那么就像我说的那样,您可以使用 dumpbin 检查那些。
    • 是的,这就是实际的答案。。我们可以取消修饰损坏的 C++ 名称,并且可以获得大部分的实际签名,但如果不包括返回类型,那么这里的问题和担忧..:-(
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多