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

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

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

保护Silverlight源码的最终目标只有一个:保护xap文件。下面是一些我总结的保护方案,希望能对大家有所帮助:

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

以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的混淆工具,这往往无形的增加了项目开发的工作总量。

时间: 2024-10-12 21:05:32

WPF/Silverlight深度解决方案:Silverlight源码之自我保护的相关文章

豆瓣Redis解决方案Codis源码剖析:Proxy代理

豆瓣Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy based high performance Redis cluster solution written in Go/C, an alternative to Twemproxy. It supports multiple stateless proxy with multiple redis instan

豆瓣Redis解决方案Codis源码剖析:Dashboard

豆瓣Redis解决方案Codis源码剖析:Dashboard 1.不只是Dashboard 虽然名字叫Dashboard,但它在Codis中的作用却不可小觑.它不仅仅是Dashboard管理页面,更重要的是,它负责监控和指挥各个Proxy的负载均衡(数据分布和迁移).并且,所有API都以RESTFul接口的形式对外提供,供Proxy和codis-config(Codis的命令行工具)调用.下面就来看一下数据分布和迁移的代码执行流程. Dashboard涉及到的知识点比较多,包括Martini框架

【【分享】深入浅出WPF全系列教程及源码 】

因为原书作者的一再要求,在此声明,本书中的部分内容引用了原书名为<深入浅出WPF>的部分内容,假设博文不能满足你现有的学习须要,能够购买正版图书! 本人10月份提出离职,可是交接非常慢,预计年底才会交接完,趁着交接之际,自学了一下WPF,由于这是微软未来的发展趋势,自WIN7以来包含前不久公布的WIN8,核心还是WPF,在此,将自己的学习成果做一个总结,同一时候将自己学习积累的东西和广大博友分享,希望大家能共同进步.在文章的结尾我会将全系列的源码地址提供给大家,有须要的朋友能够下载下来自己研究

深度解剖dubbo源码

-----------学习dubbo源码,能给你带来什么好处?----------- 1.提升SOA的微服务架构设计能力   通过读dubbo源码是一条非常不错的通往SOA架构设计之路,毕竟SOA的服务治理就是dubbo首先提出来的,比起你去看市面上的SOA微服务架构的书籍,学到的架构原理要更丰富更有深度. 2.提升自己在部门团队的技术影响力   你所在的部门团队如果使用了dubbo框架,必然需要懂dubbo底层核心的人:如果你把dubbo源码的架构原理掌握好,一般出现dubbo的疑难杂症,只要

t-io 集群解决方案以及源码解析

t-io 集群解决方案以及源码解析 0x01 概要说明 本博客是基于老谭t-io showcase中的tio-websocket-showcase 示例来实现集群.看showcase 入门还是挺容易的,入坑(入门)请看老谭写的用t-io来写一个网页聊天室或客服是个怎样的体验. 要深入理解具体实现原理后续的业务扩展,把t-io玩6起来还需要耐心看看源码,看了之后我相信你一定会有收获的,祝你好运. 其实t-io 在2.4的版本中已加入的集群实现的逻辑代码,只是官方没有写文档以及完整的示例而已,在此不

【分享】深入浅出WPF全系列教程及源码

本人10月份提出离职,可是交接非常慢,预计年底才会交接完,趁着交接之际,自学了一下WPF,由于这是微软未来的发展趋势,自WIN7以来包含前不久公布的WIN8,核心还是WPF,在此,将自己的学习成果做一个总结,同一时候将自己学习积累的东西和广大博友分享,希望大家能共同进步.在文章的结尾我会将全系列的源码地址提供给大家,有须要的朋友能够下载下来自己研究研究.由于之前申请WPF博客专栏一直没有申请下来,所以用一篇文章来结束我的学习,同一时候也给初学的人提供一个学习文件夹,提高学习效率,废话不多说,直接

POI导出大量数据的简单解决方案(附源码)-Java-POI导出大量数据,导出Excel文件,压缩ZIP(转载自iteye.com)

说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M 我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出.由于Excel 一个sheet允许的最大行数是65536这时我们想到分sheet进行导出:但是这种情况也不能解决内存溢出的问题.毕竟数据还是一次性在内存中进行保存的.这时我们想是不是可以导出多个excel呢?下面我就尝试着按照导出多个excel 首先:我们要确定数据量有多大,然后确定一个excel导出多少条数据,这

Spring源码深度解析-《源码构建》

1.导入spring-framework-3.2.x\spring-beans之前先导入源码spring-framework-3.2.x\spring-core,否则报错: 2.导入spring-asm-repack-5.0.4.jar和spring-cglib-repack-3.1.jar https://blog.csdn.net/baidu_19473529/article/details/79518685 https://blog.csdn.net/ywb201314/article/d

Java之hashCode与equals深度剖析与源码详解

1. 当向ArrayList添加一个对象时,实际上就是将该对象放置到了ArrayList底层所维护的数组当中:当向LinkedList中添加一个对象时,实际上LinkedList内部会生成一个Entry对象,该Entry对象的结构为: Entry { Entry previous; Object element; Entry next; } 其中的Object类型的元素element就是我们向LinkedList中所添加的元素,然后Entry又构造好了向前与向后的引用previous.next,