.NET 和 x86-64 程序集之间的关系是什么?

逆向工程 调试器
2021-06-22 12:35:31

我发现在本机调试器中尝试反转 .NET 应用程序几乎是在浪费时间。但为什么?当然,计算机最终执行的是机器码,而不是 CIL。那么,在运行 .NET 应用程序时,是什么让 x86-64 代码如此混乱?在本机代码和工具(如 .NET 上的 ILSpy)上使用本机调试器是一般规则吗?

2个回答

我认为更多的是您正在调试启动运行时程序集的代码(如果没有找到就会产生错误)然后只是纯粹的 MSIL,它实际上是另一种语言(而不是机器代码),它被解释运行时(把它想象成 Java 字节码)。如果不将其转换为虚拟机将执行的操作,这将毫无意义……一个好的 .NET 反编译器实际上会为您转换为代码。

Microsoft .Net 使用CIL(通用中间语言)。它是一种 - 字节码 - 虚拟机的汇编语言,它是一个抽象的基于堆栈的 CPU - 抽象我的意思是没有在硬件中实现。
因此,x86 gdb 无法理解 .Net 字节码,因为它只知道 x86 程序集。但是,通常您可以轻松地将字节码反转为源代码(因为 VM 状态比硬件 CPU 的状态更具确定性)或使用具有调试功能的 .Net 虚拟机(即 ILSpy)对其进行调试。如果您想了解有关调试器/反编译器/...的更多信息,请查看此链接. 此外,如果您使用 gdb 进行调试,您最有可能调试的是 VM 汇编代码,而不是应用程序的 .Net 字节码。换句话说,你看到的是运行字节码的虚拟机,而不是运行的字节码。