WPF/Silverlight深度解决方案:Silverlight源码之自我保护

Silverlight应用程序发布时会将全部本地资源及类库dll打包进xap文件中,好处是能够很是方便的在网页中部署及桌面化使用;可是同时带来了高度的源码泄露风险。众所周知,xap文件能够被zip等解压软件顺利打开,里面的dll及各类素材资源一目了然; 而后经过****Reflector等工具便可完美的反编译这些dll,就连xaml中的内容也能反射得一清二楚,这不由让我想起了Flash。网页中的swf能够被众多的下载工具下载,并利用相似**闪客精灵等工具反编译获得甚至具体到每一帧,一样的一切资源将变得毫无遮掩。javascript

在法律体系健全的国家,对知识产权的保护是无微不至的;而在中国这个抄袭盛行的年代,咱们该如何应对?html

保护Silverlight源码的最终目标只有一个:保护xap文件。下面是一些我总结的保护方案,但愿能对你们有所帮助:java

方法一:禁止关键文件或文件夹页面缓存浏览器

以IIS为例,咱们能够将架设Silverlight应用程序的网站ClientBin目录设置为禁止页面缓存:

    这样,Silverlight应用程序ClientBin目录下的xap文件将不会被缓存到如C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files目录,其余人将没法经过浏览器缓存拷贝出xap文件。可是,经过“查看源文件”并找到ClientBin/****.xap这句代码,而后使用迅雷等下载工具将网页地址+这句代码粘贴进去,不管权限及端口如何限制,均很难阻止xap文件被下载的厄运;更重要的是,不缓存将致使用户每次访问时均须要从新下载xap文件,不只增大了服务器负担,同时也是很是不友好体验的表现。缓存

方法二:使用Javascript加密关键的html部分代码服务器

为了避免暴露ClientBin/****.xap这句代码,咱们能够作的事情有不少。例如禁止查看源文件、禁止页面另存为、禁止使用某些快捷键及鼠标右键等等,然而这样作一样是很是不友好的,且很是容易被破解,毕竟方法太过古老。这时咱们不妨考虑使用一些欺诈手段:如使用Javascript加密html代码。关于Javascrpit加密的方法很是之多,你们能够自行搜索关键句:“Javascript加密解密”。其中最简单且直接的方式就是使用JScript.Encode加密方式跟escape方式了:

    而后咱们再伪造出一个假的xap载体控件,最终的页面将是以下代码:

    你们注意看,仅仅是多了一行javascript代码其余的几乎如出一辙,从而成功的将真实的AK47.xap文件假装成了假的Silver.xap文件,甚至您还能够在ClientBin目录下真实的放置一个乱七八糟的Silver.xap文件,让下载它的朋友一头雾水,从而达到完美的代码假装。框架

经过此方法能够骗过不少人(固然,看过我文章的朋友除外啦 ^ ^),甚至一些还没怎么接触Silverlight的.NET高手;然而一旦遇到Javascript好手,escape这个单词将当即暴露出html的假装本质,接着轻松的解密更易如反掌。工具

方法三:经过iframe+Javascript阻止用户接触到关键页面网站

此方法须要准备一个额外的页面做为首页,该页面使用iframe来加载包含有Silverlight应用程序的页面,例如:加密

<iframe src="MyGame.aspx" width="820" height="580" frameborder="no" border="0" />

而且,一样的按照方法二的手段将之加密假装。接着就是此方法的关键,在MyGame.aspx页面中添加以下一段Js:

<script type="text/javascript">

if (self.location == top.location) { self.location = "http://www.cnblogs.com/alamiye010" }

</script>

这种处理方式原理很简单:经过判断MyGame.aspx是否为子页面来实现页面保护。你们不妨直接在浏览器地址栏中输入该页面地址,将会发现页面直接跳转到了一个咱们预先设定的页面: http://www.cnblogs.com/alamiye010,从而达到了MyGame.aspx关键页面不被直接打开的目的。一样的,你们能够将此方法结合方法一与方法二更深层次的进行页面保护,就算客户端用户想尽一切办法禁用了浏览器的Js,咱们一样能够将<object>…</object>这段内容在Behind代码中的Page_Load方法中经过相似RegisterStartupScript方式来动态加载,从而使得<object>…</object>这段代码与浏览器Js完美捆绑,你行我行,你禁我禁。

然而强中更有强中手,如今已经有不少工具或插件能够直接提取页面内存中的xap,能够轻松的将里面的血肉乃至每个细胞导出得干干净净。这些家伙的名字我真不想提,我的理解为这是对神圣技术的玷污,它们的存在根本体现不了社会的进步,难道穿透别人的心脏能让你感受到无上的快感?

方法四:源码混淆之乾坤大挪移

针对以上恶劣的恐怖主义行经,咱们不得不使出杀手涧:传统且最具防护性的方法----代码混淆。

.NET代码混淆的工具备不少,VS中集成的Donfuscator Community Edition便是一款简单且实用的代码混淆工具:

    可是目前就算是最新版本的Donfuscator Community Edition仍然没法直接对Silverlight发布的dll直接进行混淆处理,由于里面包含的xaml文件资源让其暂时表现得一筹莫展。那么我给你们两个建议:1)尽可能将方法及对象放到类库中,发布时将全部注释去掉,并使用混淆工具对每一个类库生成的dll进行混淆,最后从新引用混淆后的dll。这样就算MainPage被反编译,里面的逻辑代码仍将极难获知。2)自写一个针对您Silverlight项目的源码混淆工具,如何操做得根据您的项目量身定制,对于大型项目核心代码的保护,这个工做是极其必要的。

下面是我经过反编译软件查看混淆后的Silverlight应用程序dll:

    不知道你们是否还能看得懂整个项目的框架与方法逻辑? ^ ^

利用方法四,前面的3种方法都可以忽略不计,可谓Silverlight源码的终极保护方案。然而,因为目前尚未一款现成且成熟的针对Silverlight的混淆工具,这每每无形的增长了项目开发的工做总量。

相关文章
相关标签/搜索