C# 反编译器如何在没有 PDB 文件的情况下工作?

Posted

技术标签:

【中文标题】C# 反编译器如何在没有 PDB 文件的情况下工作?【英文标题】:How do C# decompiler work without PDB files? 【发布时间】:2019-02-09 05:18:16 【问题描述】:

我从John Robbins blog 知道.NET PDB 文件包含源文件名、行号和局部变量名。但是像ILSpy.Net Reflector 这样的逆向工程软件仍然可以找出大部分代码。

代码流更容易获取。但是这些软件是如何提取函数名、变量名等数据的呢?

【问题讨论】:

您可以在文本编辑器中打开 .exe 以查看纯文本格式。 您应该阅读 Richter 的书“CLR via C#”第 4 版,尤其是第 1 部分,第 1 章。 2. 相关问题有更多参考:***.com/questions/6918270/… 【参考方案1】:

代码流更容易获取。但是这些软件是如何提取函数名、变量名等数据的呢?

程序集在元数据中包含此类信息。如spec 中所述,

新类型——值类型和引用类型——通过元数据中表达的类型声明被引入 CTS(通用类型系统)。此外,元数据是一种结构化方式,用于表示 CLI(公共语言基础设施)用于定位和加载类、在内存中布置实例、解析方法调用、将 CIL(公共中间语言)翻译为本机代码、实施安全性的所有信息,并设置运行时上下文边界。

另外,重要的是要注意,这些信息不仅可以通过这些“逆向工程”工具访问,还可以通过Reflection 提供给您的 C#(或 VB)代码。例如,通过反射可以知道给定类型的方法名称,因为它是元数据的一部分。

这是.Net Guide 的摘录,它解释了元数据中包含的内容:

元数据描述了代码中定义的每个类型和成员 语言中立的方式。元数据存储以下信息:

程序集的描述。

身份(名称、版本、文化、公钥)。

导出的类型。

此程序集所依赖的其他程序集。

运行需要安全权限。

类型说明。

实现的名称、可见性、基类和接口。

成员(方法、字段、属性、事件、嵌套类型)。

属性。

修改类型和成员的其他描述性元素。

现在这不一定包括局部变量名称,这些工具通常不会正确地进行逆向工程。

【讨论】:

除此之外,IL 格式规范是开放和标准化的 (ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf),因此外部工具很容易“逆向工程”(解析),即使这些工具不是基于 .NET 的自身。 谢谢@Paul-Jan。我完全不知道规格。我会尝试在我的回答中包含相关信息。

以上是关于C# 反编译器如何在没有 PDB 文件的情况下工作?的主要内容,如果未能解决你的问题,请参考以下文章

什么是一 .pdb 文件?

《CLR Via C#》Visual Studio编译之后的.pdb文件

何时实际加载 pdb 文件

求c# 通过Debug 文件反编译出其中的代码,能看见编译的代码就可以了,求这样的软件工具???

C#开源项目-二进制文件的反编译器

如何反编译 .dll 文件代码和注释