程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> .NET核心代碼保護策略-隱藏核心程序集

.NET核心代碼保護策略-隱藏核心程序集

編輯:C#入門知識

  經過之前那個道德指責風波過後也有一段時間沒寫博客了,當然不是我心懷內疚才這麼久不寫,純粹是程序員的通病。。怎一個懶字了得,本來想寫一些長篇大論反諷一下那些道德高人的。想想還是算了,那樣估計會引來新一波攻勢,沒什麼實際意義,影響風氣,大家看了也不爽,這次寫點有實際意義的,說說我是怎麼保護我的代碼的,個人心得,如有不妥的地方請見諒。

  我們都知道.NET的代碼容易被反編譯出來,站在破解者的角度來看,破解一個軟件情況可分為幾種:

  1.修改注冊驗證的代碼,達到繞過注冊的效果;

  2.破解出注冊核心算法,寫出注冊機;

  3.完全復制代碼,做成一個可編譯修改的項目;

  從危害是上來看,第三種是最嚴重的,如果你的軟件被實力更強的競爭對手復制了,那簡直是毀滅性的打擊,理論上.NET沒有什麼軟件是不能破解復制的,只要有高手死了心要破你的軟件,保護再好也是無意義的,那時只能認命,當然一般高手也不屑於破解一些沒意義的東西。我們雖然做不到完全保護代碼,但是我們可以增加他們的破解難度,防不了高手,至少我們要防住像我這種普通的程序員,不能隨便什麼阿貓阿狗都能染指我們的代碼,這簡直是對程序員智商的侮辱嘛。

  一般我們保護軟件的幾個重要過程:

  1.設計機器碼;

  2.根據機器碼生成注冊碼;

  3.驗證注冊碼(本地+遠程驗證);

  4.給程序集加強命名;

  5.對程序集進行代碼混淆;

    當然這麼多步驟一次性也說不完,當前我主要就說說怎麼隱藏自己的核心程序集,也就是.DLL動態庫。我們平時寫項目的時候,裡面肯定會有各種各樣的動態庫出現,當我們編譯的時候都會有一個*.DLL的動態庫出現,DLL裡包含了許多元數據,這就很容易被人用反編譯軟件完全看到裡面的代碼,所以隱藏程序集就很重要了,思路是:把程序集存入內存中,到該用的時候才會去用它,這樣反編譯軟件就不能輕易的看到我們的代碼了,但是一個比較大的項目,把全部程序集存入內存是不現實的,我們只能把幾個比較核心的程序集,如注冊驗證過程,登陸過程,核心算法過程等隱藏,由於你隱藏了一些重要的程序集,一些人就算得到了你的其他代碼,想要軟件正確運行還是需要很大的工夫的。by Zengg

  花了一點時間寫了一個隱藏程序集的的小DEMO,如下圖:

 

  

  

  

  這個DEMO的主要功能是:

  1.從外部打開某個DLL,並列出該DLL裡一共有多少個類;

  2.列出某個類裡有多少個可執行的公開方法;

  3.執行某個方法,會顯示執行的返回結果,前提是該方法具有返回值;

  4.把從外部打開的DLL轉換成C#可用的代碼,方便大家存入內存;

  5.從內存裡讀取已經存入內存的程序集,並且執行它的某個類的方法;

下面我們看看項目的VS結構:

  

  我們假設AssemblyTest這個類庫是存放我們注冊驗證的地方,AssemblyWPFDemo就是我們的主程序,一般來說,我們如果要用到AssemblyTest類庫的功能時,肯定要由主程序先引用該類庫,才能使用這個類庫的功能,這裡面就存在一個問題,只要引用了類庫,在本地就會生成該類庫對應的DLL,這個就暴露了我們的代碼,下面的過程就是解釋,如何在不引用的情況下使用該類庫的功能。by Zengg

  AssemblyTest類庫情況:

  有兩個測試類,和一個WPF窗體。 

AssemblyTest1 AssemblyTest2

  WPF窗體預覽

  這個窗體就是上面DEMO圖裡彈出的那個窗口。

下面我們看看主要代碼是怎麼實現的,在這之前你們可能得去了解C# Assembly的應用,裡面我只寫一些簡單的注釋,大家自行去看:

核心代碼:

AssemblyControl

  AssemblyWPFDemo裡的AssemblyTestSource類裡存放的就是我們AssemblyTest類庫的二進制流,這個二進制流是通過我寫的這個DEMO轉換來的,可看上圖,裡面有個“轉換代碼”的按鈕,當你打開了一個DLL後就可以把它轉換為C#代碼,通過加載這個數據流就能獲得AssemblyTest的程序集,有了程序集你就能使用程序集裡的功能。由於AssemblyTestSource的代碼比較多,貼上來會影響排版,大家自行下載DEMO來看。

  其他的就是一些簡單的邏輯處理了,不一一貼上來,我這裡只是起著拋磚引玉的作用,寫得比較粗糙,大家要注意的是,程序集的二進制流要存放的隱蔽,要有藝術,不然別人還是能把二進制流取出來存入文件,這就又變成DLL了,有心研究的可以去研究一下把這些二進制數據進行個加密,盡量增加反編譯的難度。

  這裡我又要唠叨一下破解者和軟件開發者的關系,我們寫軟件保護就是和破解者斗智斗勇的過程,這兩個是良性的競爭關系,如果你輸了只能說明你技不如人,回去回爐一下卷土再來,一味的指責並不能使你的技術提高,你得了解破解人的思路是怎麼想的才能設計出更好的保護手段,我相信一個高明的破解者,也一定是一個高明的軟件開發者,這兩個關系並沒有什麼分明的界限。。。另提前祝大家國慶快樂。。。下篇博客不知道什麼時候才能出來了。。。以後的幾篇我可能會圍繞著保護這個主題來寫..

源碼:http://pan.baidu.com/s/1xc9aW

如果您看了本篇博客,覺得對您有所收獲,請點擊右下角的 [推薦]

如果您想轉載本博客,請注明出處

如果您對本文有意見或者建議,歡迎留言

感謝您的閱讀,請關注我的後續博客 Zengg

作者:Zengg 出處:http://www.cnblogs.com/01codeworld/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved