WPF/Silverlight深度讲解保护Silverlight源码解决方案(2)
方法三:通过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项目的源码混淆工具,如何操作得根据您的项目量身定制,对于大型项目核心代码的保护,这个工作是极其必要的。