关于反编译:哪些类型的可执行文件可以反编译?

关于反编译:哪些类型的可执行文件可以反编译?

What types of executables can be decompiled?

我认为Java可执行文件(jar文件)对于反编译和获取源代码很简单。

那其他语言呢? .net和所有?

哪些所有语言只能编译为可反编译的代码?


通常,像Java,C#和VB.NET这样的语言相对容易反编译,因为它们被编译为中间语言,而不是纯机器语言。以IL形式,与编译为机器语言的C代码相比,它们保留的元数据更多。

从技术上讲,您并没有获得原始的源代码,而是对源代码进行了一些改动,在编译时会将其返回给您。它与源代码不同,因为注释,注释和编译器指令之类的内容通常不会被带入已编译的代码中。


托管语言可以很容易地反编译,因为可执行文件必须包含很多元数据以支持反射。
诸如C ++之类的语言可以编译为本地代码。在编译翻译过程中,程序结构可以完全改变。
编译器可以轻松替换合并删除代码的某些部分。原始代码与已编译(本机)代码之间没有一对一的关系。


.NET非常容易反编译。最好的工具是RedGate最近收购的.NET反射器。


如果将VB6编译为pcode,也可以使用P32Dasm将其反编译为几乎完整的源,还可以使用Flare之类的东西将Flash(或动作脚本)反编译为完整的源


大多数语言都可以反编译,但是某些语言比其他语言更容易反编译。 .Net和Java将有关原始程序的更多信息放在可执行文件中(方法名,变量名等),因此您可以获取更多原始信息。

例如,C ++会将变量和函数等转换为内存地址(是的,我知道这是一个简单的简化),因此反编译器将不知道调用了什么东西。但是,尽管如此,您仍然可以获得程序的一些结构。


推荐阅读