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

下一节,我将为大家讲解WPF/Silverlight应用程序性能优化与提升技巧,敬请关注。

作者:深蓝色右手
出处:http://alamiye010.cnblogs.com
教程目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。

WPF/Silverlight深度解决方案:(二)Silverlight源码之自我保护(加密)相关推荐

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

    Silverlight应用程序发布时会将所有本地资源及类库dll打包进xap文件中,好处是可以非常方便的在网页中部署及桌面化使用:但是同时带来了高度的源码泄露风险.众所周知,xap文件可以被zip等解 ...

  2. AFL二三事——源码分析

    AFL二三事--源码分析 前言 AFL,全称"American Fuzzy Lop",是由安全研究员Michal Zalewski开发的一款基于覆盖引导(Coverage-guid ...

  3. 深度学习框架Caffe源码解析

    作者:薛云峰(https://github.com/HolidayXue),主要从事视频图像算法的研究, 本文来源微信公众号:深度学习大讲堂.  原文:深度学习框架Caffe源码解析  欢迎技术投稿. ...

  4. 采用WPF进行开发的酒店管理系统源码

    ASP.NET酒店管理系统源码(WPF) 开发语言:C# 数据库: Access 开发工具:VS2013 源码免费分享 一.源码特点 采用WPF进行开发的酒店管理系统源码,界面相当美观,功能齐全. 二 ...

  5. Android Glide图片加载框架(二)源码解析之into()

    文章目录 一.前言 二.源码解析 1.into(ImageView) 2.GlideContext.buildImageViewTarget() 3.RequestBuilder.into(Targe ...

  6. Android Glide图片加载框架(二)源码解析之load()

    文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...

  7. Android Glide图片加载框架(二)源码解析之with()

    文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...

  8. Dubbo系列(二)源码分析之SPI机制

    Dubbo系列(二)源码分析之SPI机制 在阅读Dubbo源码时,常常看到 ExtensionLoader.getExtensionLoader(*.class).getAdaptiveExtensi ...

  9. Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构

    Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构 文章目录 Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构 0x00 摘要 0x01 Alink设计原则 0x02 ...

  10. ViewDragHelper(二)- 源码及原理解读(进阶篇)

    声明:本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本篇为该系列的第二篇,侧重讲解ViewDragHelper 的实现原理和源码逻辑,以及它所提供的Callback. 目录 Vi ...

最新文章

  1. ISME:土壤微生物对硫的短期及长期利用的决定因素-基于13C,15N,14C和35S多同位素标记结果...
  2. linux 查看线程数的方法
  3. STM32用USART发送字符串,以USART_FLAG_TXE和USART_FLAG_TC怎么用
  4. c语言二维图形变换程序,【计算机图形学】3-2 二维几何变换根本代码
  5. 牛客网——华为机试(题15:求int型正整数在内存中存储时1的个数)(Java)
  6. Python如何防止sql注入
  7. java apt怎么用_java – APT和AOP在同一个项目中,使用Maven
  8. fdfs往服务器上传文件超时,FastDFS 实现大文件分片上传
  9. Microsoft SQL Server 2008 R2 软件安装
  10. Excel 2010 VBA 入门 121 ActiveX控件
  11. ★【博弈论】【贝蒂定理】取棋子游戏
  12. Mac访达显示隐藏文件
  13. 基于简单MLP模型的加州房价预测
  14. web基础知识回顾(一)
  15. 嵌入式学习硬件篇------初识ARM
  16. C语言 7-7 书号判断与纠错
  17. 魔兽争霸 php文件,[War3]Fdf文件详解,简单的UI教程演示-by CarlosX
  18. 计算机一级b和小高考,小高考B是几分相关内容
  19. python爬取微博数据存入数据库_Python爬取微博数据并存入mysql,excel中
  20. 16.4 温度传感器DS18B20

热门文章

  1. WIN7必须掌握的70个技巧
  2. c语言实现hdr图像合成,系统学摄影:如何拍摄HDR图像?
  3. 区块链入门二:区块不可篡改
  4. 怎样选择一家靠谱的IT培训机构?
  5. php中单例和工厂模式,PHP单例模式和工厂模式小记!
  6. Windows 7 Ultimate with SP1(x64) MSDN 官方简体中文旗舰版原版
  7. 拼团php开发逻辑思维罗振宇_拼团php开发逻辑思维罗振宇_罗振宇的《逻辑思维》怎么样?...
  8. 信捷 XDH Ethercat A_WRITE指令
  9. 牧牛火链,区块链技术将会如何发展
  10. Shell中的if、then、elif、else——流程控制语句