一、反编译原理是什么?
C++、C语言一般不能反编译为源代码,只能反编译为asm(汇编)语言,因为C较为底层,编译之后不保留任何元信息,而计算机运行的二进制实际上就代表了汇编指令,所以反编译为汇编是较为简单的。
C#、Java这类高级语言,尤其是需要运行环境的语言,如果没有混淆,非常容易反编译。原因很简单,这类语言只会编译为中间语言(C#为MSIL 微软中间语言,Java为Bytecode 字节码),而中间语言与原语言本身较为相似,加上保留的元信息(记录类名、成员函数等信息)就可以反向生成源代码,注意是由反编译器生成,不会与源码完全相同,但可以编译通过。这些特性本身是为反射技术准备的,却被反编译器利用,现在的C#反编译器IL Spy甚至可以反向工程。
二、C# 反编译破解工具
常用两种:.NET Reflector 和ILSyp 工具。
三、C# 反编译防范措施:
① 设置项目代码反汇编属性(弊大于利,不推荐使用,具体用法:https://www.cnblogs.com/caokai520/p/7711136.html)
② 混淆(重点讲解)
四、混淆代码对比
未使用混淆工具,反编译出的源码:
使用混淆工具,反编译出的源码:
优点:效果很明显,C#代码通过混淆工具生成后,增加了很多转换过程。这使得反编译工具无法很直观看到源码真正逻辑。
缺点:但源码代码过多转换会使软件本身运行效率降低,甚至会出现报错情况。
五、总结
通过与源码对比得出,未被混淆的.dll 和.exe程序,可以通过IL Spy反编译工具获得大部分源码;而被混淆的.dll 和.exe程序,不能被IL Spy反编译工具破解源码。
来源:oschina
链接:https://my.oschina.net/u/4313343/blog/3906217