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的混淆工具,這每每無形的增長了項目開發的工做總量。

相關文章
相關標籤/搜索