目前代码保护的主要方法

目前代码保护的方法主要有五种:
强名称签名
代码混淆

代码隐藏

代码加密

代码本地化

添加水印

强名称签名

原理:这种方法,用通俗的话说就是对文件按照Microsoft的算法对文件进行Hash,然后将hash出来的数据(publickeytoken )写入文件。在运行或者对文件进行调用的时候,SDK会检查publickeytoken ,若不符合则抛出异常,退出。

弱点:反编译后将publickeytoken 部分去掉即可。

代码混淆

表面混淆(layout)

把类或者变量的名字修改成晦涩的长名字、特别简单的单个字母或者不可显示的字符来实现

控制混淆(control)

<行号> br.s <行号+2>

<行号+1> break

<行号+2> …………

数据混淆(data)

对于字符串进行加密,在运行的时候再进行解密还原,从而增加破解的难度

弱点:无法隐藏调用的系统的函数

代码隐藏

.NET的程序集包括代码文件和资源文件两部分,此方案就是将代码文件的核心部分作为资源文件隐藏。运行时核心程序集不会在硬盘上留下任何痕迹,它只在内存中解密并被加载

弱点:内存有完整的代码,利用软件可以将内存dump出来,得到完整的代码

代码加密

原理:改变MSILJIT的通信,根据底层的需要来解密代码

优点:破解的难度大,较安全,内存无完整代码

缺点:编程的难度大,若利用专门的加密软件,则会加大系统的开发成本

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_s1026" style="VISIBILITY: visible; WIDTH: 162pt; HEIGHT: 72.55pt; mso-position-horizontal-relative: char; mso-position-vertical-relative: line" fillcolor="window" type="#_x0000_t75"><imagedata o:title="aa" src="file:///C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/01/clip_image001.png"></imagedata><wrap type="none"></wrap><anchorlock></anchorlock></shape>

代码本地化 及添加水印

代码本地化

将代码完全编译成本机代码,同win32下的应用程序一样,完全失去了.NET的优越性。

添加水印

简单的说,就是让特定的字符串以图片的形式,绘制在程序的界面上,用来提示软件是否注册,这种保护方法,关键的地方就是对图片绘制条件的判断,如果仅仅是用true 或者false 来判断,就形同虚设了。

你可能感兴趣的:(代码)