首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反编译的C#是否从IL/MSIL逆向工程而来?

反编译的C#是否从IL/MSIL逆向工程而来?
EN

Stack Overflow用户
提问于 2017-04-12 08:38:54
回答 2查看 625关注 0票数 8

当我打开像ILSpy或dotPeek这样的工具时,我可以选择查看反编译的C#或IL。

当您查看反编译源时,反编译器是否将IL反向工程成反编译的C#?

如果是这样的话,那么反编译者将如何推断像下面这样的IL?(请注意,这是第一语言构造的一个微不足道的例子,它很难从IL中推断出来,而不是反编译器的实际输出):

代码语言:javascript
复制
IL_0000: nop                  // Do nothing (No operation)
IL_0001: ldstr "C"            // Push a string object for the literal string
IL_0006: stloc.0              // Pop a value from stack into local variable 0
IL_0007: ret    

翻译为:

代码语言:javascript
复制
public class C {
    public void M() {
        string foo = nameof(C);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-12 08:41:17

是的,反编译工具必须从IL逆向工程。

这就是为什么需要为C#/VB的每个版本更新这些工具,如果您想让它们反编译新引入的语言特性。否则,如果该工具没有更新,它要么放弃对其进行反编译,要么会产生非常复杂的代码,而这个代码可能是疯子用该语言的早期版本编写的,但很可能没有。

一些反编译工具还将尝试定位实际的源代码(通过PDB和source服务器),如果它们在这方面取得了成功,那么您将看到实际的源代码,当然在这种情况下不会进行反编译工作。

票数 6
EN

Stack Overflow用户

发布于 2017-04-12 08:49:14

当然,这些工具将尝试从MSIL逆向工程,但是说到您的特定示例,不可能将MSIL反向工程到

代码语言:javascript
复制
public class C {
    public void M() {
        string foo = nameof(C);
    }
}

没有扩展指导,比如符号(.pdb)文件。尝试在库中编译上述语句,然后删除".pdb“文件并将.dll放入dotPeek中。您将看到它将像预期的那样解压缩:

代码语言:javascript
复制
public void M()
{
    string foo = "C";
}

现在,将.pdb文件放回,您将看到您的nameof(C)表达式返回。

现在将.pbd文件放回原处,但是更改用于编译.dll的源代码的位置(例如,重命名项目文件夹,完全删除它,或者将.dll与.pdb一起移动到不同的机器)。在dotPeek中再次加载它,您将再次看到string foo = "C";。这是因为.pdb符号可能包含指向实际源代码的路径(例如,您可能在异常堆栈跟踪中看到这些路径),然后反编译工具使用这些路径直接显示它,而不需要任何反编译。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43364450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档