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文件资源让其暂时表现得束手无策。当然还有第三方混淆工具可以使用的,例如:DeepSea,它可以直接混淆XAP文件,很强大。下面是我通过反编译软件查看混淆后的Silverlight应用程序dll:
不知道大家是否还能看得懂整个项目的框架与方法逻辑? ^ ^
利用方法四,前面的3种方法均可以忽略不计,可谓Silverlight源码的终极保护方案。然而,由于目前还没有一款现成且非常成熟的针对Silverlight的混淆工具,这往往无形的增加了项目开发的工作总量。
下一节,我将为大家讲解WPF/Silverlight应用程序性能优化与提升技巧,敬请关注。
![WPF/Silverlight](http://static.oschina.net/uploads/img/201203/09130954_fx88.jpg)
出处: http://alamiye010.cnblogs.com/
本系列目录及源码下载: 点击进入( 欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。
原文链接: http://www.cnblogs.com/alamiye010/archive/2009/08/29/1556244.html
转载于:https://my.oschina.net/chen106106/blog/43673
WPF/Silverlight深度解决方案:(二)Silverlight源码之自我保护相关推荐
- WPF/Silverlight深度解决方案:Silverlight源码之自我保护
Silverlight应用程序发布时会将所有本地资源及类库dll打包进xap文件中,好处是可以非常方便的在网页中部署及桌面化使用:但是同时带来了高度的源码泄露风险.众所周知,xap文件可以被zip等解 ...
- AFL二三事——源码分析
AFL二三事--源码分析 前言 AFL,全称"American Fuzzy Lop",是由安全研究员Michal Zalewski开发的一款基于覆盖引导(Coverage-guid ...
- 深度学习框架Caffe源码解析
作者:薛云峰(https://github.com/HolidayXue),主要从事视频图像算法的研究, 本文来源微信公众号:深度学习大讲堂. 原文:深度学习框架Caffe源码解析 欢迎技术投稿. ...
- 采用WPF进行开发的酒店管理系统源码
ASP.NET酒店管理系统源码(WPF) 开发语言:C# 数据库: Access 开发工具:VS2013 源码免费分享 一.源码特点 采用WPF进行开发的酒店管理系统源码,界面相当美观,功能齐全. 二 ...
- Android Glide图片加载框架(二)源码解析之into()
文章目录 一.前言 二.源码解析 1.into(ImageView) 2.GlideContext.buildImageViewTarget() 3.RequestBuilder.into(Targe ...
- Android Glide图片加载框架(二)源码解析之load()
文章目录 一.前言 二.源码分析 1.load() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图片加载框架(二)源 ...
- Android Glide图片加载框架(二)源码解析之with()
文章目录 一.前言 二.如何阅读源码 三.源码解析 1.with() Android Glide图片加载框架系列文章 Android Glide图片加载框架(一)基本用法 Android Glide图 ...
- Dubbo系列(二)源码分析之SPI机制
Dubbo系列(二)源码分析之SPI机制 在阅读Dubbo源码时,常常看到 ExtensionLoader.getExtensionLoader(*.class).getAdaptiveExtensi ...
- Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构
Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构 文章目录 Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构 0x00 摘要 0x01 Alink设计原则 0x02 ...
- ViewDragHelper(二)- 源码及原理解读(进阶篇)
声明:本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 本篇为该系列的第二篇,侧重讲解ViewDragHelper 的实现原理和源码逻辑,以及它所提供的Callback. 目录 Vi ...
最新文章
- C++ string字符串的比较是否相等
- 听说你想去大厂看妹子,带你看看字节跳动技术中台后端面试长啥样?
- MATLAB实现实时录音,语音采集与读写用matlab实现录音以及语谱图的绘制.pdf
- matlab中双引号_Octave、SciLab能否替代MATLAB?
- Angular实现图片点击缩放组件
- 组件化网页开发 / 步骤一 · 5-1 课程总结
- kubernetes视频教程笔记 (24)-存储-PV和PVC
- hdu acmsteps 2.1.3 Cake
- 贷中客群评级的场景实现,来试试这些多维的实操方法
- alpha-beta 极大极小值剪枝算法
- python基础:sys模块
- html背景半透明 字不变,css实现背景半透明文字不透明的效果示例
- 圆面积公式积分法推导
- bps和pps各自是什么意思?
- postgresql源码学习(十三)—— 行锁①-行锁模式与xmax
- 不会聊天的程序员,如何开发聊天机器人
- 半乳糖-人血清白蛋白 Gal-HSA,Gal-PEG-HSA 半乳糖修饰人血清白蛋白
- 记录 vue-admin-template 中 npm install 错误解决办法
- AI人脸检测和人脸识别是一个概念吗?有什么区别?
- 全志android平台下的SDK快速移植
热门文章
- OO CSS(面向对象 CSS)
- 自适应卡尔曼滤波的噪声方差怎么推的_带有未知过程噪声协方差阵递推估计的卡尔曼滤波方法...
- 建立循环链表c语言,循环链表C语言实现
- 在电网上使用的储能系统模拟(simulink)
- Qt编译运行提示No rule to make target ‘xxx.h‘ needed by ‘xxx.o‘.Stop
- 真无线什么品牌适合玩游戏?2021新款低延迟游戏专业蓝牙耳机推荐
- python数据分析及可视化(十六)金融量化(金融工具、金融分析、Tushare安装使用、双均线分析)
- propertyeditor java_Spring Boot – 自定义PropertyEditor
- 基于个人信用评分的建模分析和授信决策
- 不超过20位的小数正则_四川最美避暑胜地,夏天最高不超过20度,体验“反季节”旅游...