熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

怎樣保護你的.NET程序

2013-11-13 12:16:10  來源: .NET編程 

  摘要闡述怎樣保護用MicrosoftNet開發的軟件代碼的安全性本人通過一次實際開發總結出一個有效的方法

  眾所周知軟件產品是智力的成果是具有無形價值而軟件又是極其容易復制所以牽涉到版權的問題一個公司或個人辛辛苦苦開發出來的軟件突然發現被別人竊用了那是一件非常令人難過的事

  微軟公司的NET開發效率非常高使用Microsoft Visual Studio NET 開發工具參考NET Framework SDK你很快能開發出實用的程序快速而且高效

  最近我公司開發了一個大型網站開發項目其中包括了一個網站後台管理系統(CMS)是用C#開發整個項目開發效率很高使用Microsoft Visual Studio NET 開發工具自動生成aspx頁面在項目實施階段出現了一個問題因為對方公司項目款還沒完全給付所以需要對相關代碼進行保護防止被竊用損害本公司利益

  但是MSIL本身是很容易被反編譯的利用像 ILDASM(NET Framework SDK 附帶的 MSIL 反匯編程序)這樣的工具或諸如 Anakrino 和 Reflector for NET 這樣的反編譯程序任何人都可以輕松地研究您的程序集並利用反向工程將它們轉換為可讀的源代碼黑客可以搜索可利用的安全漏洞盜取獨特的思想甚至破解程序

  由此我想到了應該對這些代碼進行某種程度的保護想過加密但怕影響程序速度後來決定采用模糊處理它將幫助防止反向工程模糊處理是一種提供程序集中無縫重命名的符號以及阻止反編譯程序的其他技巧的技術正確應用該技術後模糊處理可以極大地增加免遭反編譯的保護而使應用程序不受任何損害模糊處理通常用於 Java 環境中很多年來一直用於公司保護基於 Java 的產品的知識產權很多第三方根據需要創建了適用於 NET 代碼的模糊處理程序Microsoft 在與 PreEmptive Solutions 的合作中將 Dotfuscator Community Edition 包括在 Visual Studio®NET 提供了多種模糊處理程序包

  經過一段時間的研究發現目前有幾種基於NET的模糊工具

   Dotfuscator Community Edition 我最不喜歡的混淆器由於是免費版所以必須混淆所有模塊導致部分功能不能使用但我們不關心那些我們一會將展現被混淆的注冊代碼(因為類和方法都被混淆所以必須要花點時間)
   XeonCode 一個相對強大的混淆工具我一直認為他與某著名的反編譯工具捆綁導至其它工具能反編譯的代碼而它不能反編譯我們把它的強度開到最大勾上所有能勾的選項(它混淆的Windows Application可以正常運行)
   MaxtoCode 這是一個加密器可以與XeonCode疊加使用並且在版中將會加入自混淆功能成為混淆加密一體化的工具(它混淆的 Windows Applicaton 可以正常運行)

  由於Dotfuscator Community Edition是微軟自帶的一個模糊工具而且最主要是免費軟件所以決定采用這個工具對我們寫的代碼進行保護

  先了解一下模糊處理的原理及效果 

  模糊處理是使用一套相關的技術完成的它的目標就是隱藏程序的意圖而不更改其運行時行為它並不是加密但在 NET 代碼的上下文中它可能會更好您可以加密 NET 程序集以使它們完全不可讀但是這種方法會面臨進退兩難的局面 - 因為運行庫必須執行未加密過的代碼而加密密鑰必須保存在已加密的程序中因此可以創建一個自動的實用工具來恢復密鑰解密代碼然後將 IL 以其原始的格式寫入磁盤只要發生這種情況程序就完全暴露於反編譯

  作一個比喻加密就像將六道菜鎖入了一個帶鎖的盒子中只有希望進餐的人(在這個例子中是 CLR)才有鑰匙我們並不想讓其他任何人知道他或她想吃什麼東西遺憾的是就餐時食物將會被所有旁觀者一覽無余模糊處理工作就像是將六道菜放入了攪拌器然後將其放入塑料袋送給進餐者當然每個人都可以看到傳遞中的食物但是除了幸運的豌豆或者某些牛肉色的糊狀物之外他們並不知道原來的菜到底是什麼進餐者仍然獲得了想要的菜肴並且菜肴仍然提供了與以前相同的營養價值(幸好CLR 並不過分挑剔味道如何)模糊處理程序的訣竅就是使觀察者糊塗同時仍然為 CLR 提供相同的產品

  當然模糊處理(或者加密)並不是百分之百的安全即使編譯的 C++ 也可以被反匯編如果黑客足夠有耐力她可以重新生成您的代碼
 先啟動Microsoft Visual Studio NET 〉Visual Studio NET 工具〉Dotfuscator Community Edition我們將得到以下的界面

  我們新產生一個模糊處理項目觸發器選項中選擇一個要進行模糊處理的dll如圖

  然後在重命名項中選擇要進行模糊處理的類如圖所示

  然後點擊生成按鈕生成一個進行了模糊處理的dll

  為了查看處理效果將前後代碼進行對比我用一個現在流行的MSIL反編譯工具進行反編譯

  模糊處理前

  反編譯的效果如

public static DataTable DeleteData(DataTable table int templateid ArrayList deletelist ref ArrayList RowIDS)
{
      TemplateInfo info = DataTemplateGetTemplate(templateid);
      DataTable table = tableCopy();
      ArrayList list = (ArrayList) RowIDSClone();
      string text = EnvGetIndustryDbConnStr(DataTemplategetIndustry(infoDeptID));
      ArrayList list = DataTemplateGetDeleteTables(table infoDeptID);
      for (int num = ; num < deletelistCount; num++)
      {
            int num = ConvertToInt(deletelist[num]);
            Hashtable hashtable = (Hashtable) RowIDS[num];
            RowIDSRemoveAt(num);
            for (int num = ; num < listCount; num++)
            {
                  string text = list[num]ToString();
                  int num = ConvertToInt(hashtable[text]);
                  if (((text != Product) && (text != Area)) && (text != Company))
                  {
                        for (int num = ; num < RowIDSCount; num++)
                        {
                              Hashtable hashtable = (Hashtable) RowIDS[num];
                              int num = ConvertToInt(hashtable[text]);
                              if (num == num)
                              {
                                    tableRowsRemoveAt(num);
                                    RowIDSRemoveAt(num);
                              }
                        }
                        string text = stringConcat(new string[] { Delete from text where DataTemplateGetTableID(text infoDeptID) = numToString() });
                        int num = ;
                        try
                        {
                              SqlHelperExecuteNonQuery(text CommandTypeText text);
                        }
                        catch (Exception exception)
                        {
                              string text = exceptionMessage;
                        }
                  }
            }
      }
      return table;
}

 可以看出和原始代碼相差無幾
 
 對模糊處理後進行反編譯代碼如下
 
 public static DataTable DeleteData(DataTable table int templateid ArrayList deletelist ref ArrayList RowIDS)
 {
       d d = DataTemplatec(templateid);
       DataTable table = tableCopy();
       ArrayList list = (ArrayList) RowIDSClone();
       string text = oa(DataTemplatea(dh));
       ArrayList list = DataTemplateb(table dh);
       for (int num = ; num < deletelistCount; num++)
       {
             int num = ConvertToInt(deletelist[num]);
             Hashtable hashtable = (Hashtable) RowIDS[num];
             RowIDSRemoveAt(num);
             for (int num = ; num < listCount; num++)
             {
                   string text = list[num]ToString();
                   int num = ConvertToInt(hashtable[text]);
                   if (((text != Product) && (text != Area)) && (text != Company))
                   {
                         for (int num = ; num < RowIDSCount; num++)
                         {
                               Hashtable hashtable = (Hashtable) RowIDS[num];
                               int num = ConvertToInt(hashtable[text]);
                               if (num == num)
                               {
                                     tableRowsRemoveAt(num);
                                     RowIDSRemoveAt(num);
                               }
                         }
                         string text = stringConcat(new string[] { Delete from text where DataTemplatef(text dh) = numToString() });
                         int num = ;
                         try
                         {
                               vd(text CommandTypeText text);
                         }
                         catch (Exception exception)
                         {
                               string text = exceptionMessage;
                         }
                   }
             }
       }
       return table;
 }

  可以看出模糊處理對相應的類方法進行了重命名同時增加了代碼機密性

  使用該工具對我們公司所有的代碼進行了模糊處理保護了我們公司人員的辛苦工作成果極大地維護了本公司的利益希望上述經驗能對大家有點幫助


From:http://tw.wingwit.com/Article/program/net/201311/15537.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.