采用Native 引導方式的.Net加密保護_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:ASP.NET2.0服務器控件之創建復雜屬性
      本文詳細講解了一個利用ASP.NET 2.0技術創建復雜屬性的示例。 1、示例應用 本文所實現的示例很簡單,其核心是通過實現自定義服務器控件的連字符形式復雜屬性來說明復雜屬性的實現方法,其中

      這類加密保護方式屬于整體程序集的加密保護.這個方法首要解決的問題就是 native code 和 .Net Code如何交互.這里介紹三種實現方式.

      1. C /CLI 實現.
      這個比較簡單了,會C /CLI一下子就能完成了.
      Loader是由C /CLI實現的.運行時通過解碼程序集通過反射載入然后運行.

      void InvokeAssemblyResource()
      {

      try
      {
      byte[] pBuf = GetDecryptedResource();
      Assembly^ asm = Assembly::Load(pBuf);
      asm->EntryPoint->Invoke(nullptr,nullptr);
      }
      catch(Exception^ ex)
      {
      MessageBox::Show(ex->Message);
      }


      }

      2. 利用C#導出Com接口和native code交互.Loader由C#和native code兩部分組成.

      C#部分代碼

      public interface IInvokeAssembly
      {
      void LoadAndExecute(byte[] pBuf);
      };

      public class CInvokeAssembly : IInvokeAssembly
      {
      public CInvokeAssembly()
      {
      }
      public void LoadAndExecute(byte[] pBuf)
      {
      try
      {
      Assembly asm = Assembly.Load(pBuf);
      asm.EntryPoint.Invoke(null,null);
      }
      catch(Exception ex)
      {
      MessageBox.Show(ex.Message);
      }
      }
      }

      這里導出的 IInvokeAssembly 接口,將在native code中使用.

      native code 部分

      void InvokeAssemblyResource()
      {
      IInvokeAssemblyPtr pInvoker; //COM Pointer to the .Net Interface

      if(FAILED(pInvoker.CreateInstance(CLSID_CInvokeAssembly)))
      {
      MessageBox(NULL,_T("Unable to Create Invoke Assembly Object !!"),_T("Error"),MB_OK|MB_ICONERROR);
      return;
      }

      HRSRC hRC = FindResource(NULL,MAKEINTRESOURCE(IDR_EMBEDDED_ASSEMBLY),"RT_EMBEDDED_ASSEMBLY");
      HGLOBAL hRes = LoadResource(NULL,hRC);
      DWORD dwSize = SizeofResource(NULL,hRC);

      SAFEARRAY* pSA = NULL;

      if(NULL !=(pSA = SafeArrayCreateVector(VT_UI1, 0, dwSize)))
      {
      LPVOID pBuf = NULL;

      if(FAILED(SafeArrayAccessData(pSA,&pBuf)))
      MessageBox(NULL,_T("Unable to Access SafeArray Data"), _T("Error"),MB_OK|MB_ICONERROR);
      else
      {
      LPVOID hAsm = LockResource(hRes);

      memcpy(pBuf, hAsm, dwSize);

      UnlockResource(hRes);

      SafeArrayUnaccessData(pSA);
      }

      pInvoker->LoadAndExecute(pSA); //Invoke the Reflection to load and Execute our Byte[]
      }
      else
      MessageBox(NULL,_T("Unable to Allocate Memory"),_T("Memory Allocate Error"),MB_OK|MB_ICONERROR);

      if(pSA) SafeArrayDestroy(pSA);
      }

      這里還有一個問題,loader是兩部分.加密的程序集可以作為資源簽入到native code loader中.但是C#部分怎么處理?一個比較隱蔽的方式是,在安裝程序時將它安裝到gac中.

      分享:面向服務及其在互聯系統策略中的角
      面向服務的業務環境 面向服務是一種創建分布式系統的方法。在它最抽象的層面,面向服務作為一個服務提供程序,包含了一切——從大型機應用程序到打印機到碼頭工作人員到隔夜交貨公

      共2頁上一頁12下一頁
      來源:模板無憂//所屬分類:.Net教程/更新時間:2008-08-22
      相關.Net教程