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

x8goxv8g  于 2023-03-24  发布在  .NET
关注(0)|答案(1)|浏览(183)

我从John Robbins blog中知道,.NET PDB文件包含源文件名、行号和局部变量名,但像ILSpy.Net Reflector这样的逆向工程软件仍然可以找出大部分代码。
代码流更容易获得。但这些软件如何提取数据,如函数名,变量名?

2ul0zpep

2ul0zpep1#

代码流更容易获得。但这些软件如何提取数据,如函数名,变量名?
程序集在元数据中包含此类信息。
CTS中引入了新的类型-值类型和引用类型(公共类型系统)通过类型声明以元数据表示。此外,元数据是一种结构化的方式来表示CLI(公共语言基础结构)用于定位和加载类、在内存中布置示例、解析方法调用、转换CIL(公共中间语言)转换为本机代码、实施安全性以及设置运行时上下文边界。
此外,重要的是要注意,这些信息不仅可以通过这些“逆向工程”工具访问,而且可以通过Reflection访问C#(或VB)代码。例如,通过反射可以知道给定类型的方法的名称,因为它是元数据的一部分。
以下是.Net Guide的摘录,解释了元数据中包含的内容:
元数据以非特定语言的方式描述代码中定义的每个类型和成员。元数据存储以下信息:

  • 程序集的说明。
  • 标识(名称、版本、区域性、公钥)。
  • 导出的类型。
  • 此程序集依赖的其他程序集。
  • 运行所需的安全权限。
  • 类型的描述。
  • 名称、可见性、基类和实现的接口。
  • 成员(方法、字段、属性、事件、嵌套类型)。
  • 属性。
  • 修改类型和成员的其他描述性元素。

这并不一定包括局部变量名,这些工具通常不能正确地对局部变量名进行反向工程。

相关问题