[英]Does decompiled C# get reverse engineered from IL/MSIL?
当我打开像ILSpy或dotPeek这样的工具时,我可以选择查看反编译的C#或IL。
当您查看反编译的源时,反编译器是否将IL反向工程为反编译的C#等效文件?
如果是这样,那么反编译器如何推断出下面的IL这样的情况呢? (请注意,这是我想到的第一种语言结构的一个简单例子,它不能从IL中推断出来,而不是反编译器的实际输出):
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
翻译成:
public class C {
public void M() {
string foo = nameof(C);
}
}
是的,反编译工具必须从IL进行逆向工程。
这就是为什么需要为每个版本的C#/ VB更新工具,如果您希望它们反编译新引入的语言功能。 否则,如果该工具没有更新,它将放弃尝试反编译它或者它将产生高度复杂的代码,疯子本可以用该语言的早期版本编写但很可能没有。
一些反编译工具也会尝试找到实际的源代码(通过PDB和源服务器),如果他们在这项工作中取得成功,那么你将看到实际的源代码,当然在这种情况下不会发生反编译工作。
当然,这些工具将尝试从MSIL进行逆向工程,但谈到您的特定示例 - 无法将MSIL逆向工程
public class C {
public void M() {
string foo = nameof(C);
}
}
没有extenal指导,如符号(.pdb)文件。 尝试在库中编译上面的语句,然后删除“.pdb”文件并将.dll放入dotPeek。 您将看到它将按预期反编译:
public void M()
{
string foo = "C";
}
现在放回.pdb文件,你会看到你的nameof(C)
表达式。
现在放回.pbd文件,但是改变你用来编译.dll的源代码的位置(例如,重命名项目文件夹,完全删除它,或者只是将带有.pdb的.dll移动到不同的机器上)。 再次在dotPeek中加载它,你会再次看到string foo = "C";
。 这是因为.pdb符号可能包含实际源代码的路径(例如,您可能会在异常堆栈跟踪中看到这些路径),然后反编译工具使用它直接显示它而不进行任何反编译。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.