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 文件的情况下工作?的主要内容,如果未能解决你的问题,请参考以下文章
《CLR Via C#》Visual Studio编译之后的.pdb文件