2012-01-06 3 views
4

내 Windows Forms 응용 프로그램 프로젝트에서 참조 된 dll을 갖고 싶습니다. 나에게 dll은 처음에는 암호화되고 이후에는 런타임에 암호가 해독되어야한다는 것이 중요합니다.참조 된 DLL을 동적으로 암호 해독

서브 루틴이 원래 암호화되었지만 해독되고 인스턴스화되는 다음 예제를 고려하십시오. 이것은 개념적 아이디어 일뿐입니다. 코드의 관점에서 어떻게해야하는지에 대한 단서가 없습니다.

Class clsSO 
{ 
void myVoid() 
{ 
Console.WriteLine("We are here now ..."); 
} 
} // End class 

위의 코드는 .dll로 래핑되고 참조 된 DLL로 프로젝트에 추가됩니다. DLL은 다음 참조 및 서브 루틴을 호출 할 것이다 :

clsSo myRef = new clsSo(); 

myRef.myVoid(); 

콘솔 출력을 읽

우리는 지금 여기에 있습니다 ...

내가 할 필요가 무엇 done : 래퍼 DLL의 내용이 암호화되어 읽을 수 없거나 클래스를 직접 참조 할 수 없습니다. 따라서 dll은 어떻게 든 해독되어야하며 해독 된 데이터로 동적으로 업데이트되므로 참조 할 수 있습니다.

이와 비슷한 것이 있습니까? 심지어 할 수 있습니까?

모두에게 감사드립니다!

감사합니다,

에반

+0

빠른 답변은 내 대답에 영향을 미치므로 중요한 데이터를 암호화하거나 dll의 라이센스 방법으로 암호화하는 이유는 무엇입니까? 두 가지 모두 타당한 이유가 있지만 다른 "최상의"해결책을 가지고 있습니다. –

+0

내부의 데이터를 보호하고 싶습니다. obfuscator와 매우 비슷합니다. –

답변

4

당신은 당신의 파일의 해독 바이트에 Assembly.Load(Byte[])를 호출해야합니다. 일단 리플렉션을 사용하거나 클래스를 인터페이스에 캐스트해야 메소드에 액세스 할 수 있습니다. 여기

class Example 
{ 
    static void Main(string[] args) 
    { 
     byte[] decryptedLibArray; 
     using (var fs = new FileStream("clsSo.cDll", FileMode.Open, FileAccess.Read)) 
     using (var aesProvider = new AesCryptoServiceProvider()) 
     using (var aesTransform = aesProvider.CreateDecryptor(YourKey, YourIV)) 
     using (var cryptoStream = new CryptoStream(fs, aesTransform, CryptoStreamMode.Read)) 
     { 
      decryptedLibArray = ReadFully(cryptoStream); 
     } 

     var lib = Assembly.Load(decryptedLibArray); 

     IclsSO classInstance = (IclsSO)lib.CreateInstance("clsSO"); //If you use a namespace this will be namespace.clsSO 

     classInstance.myVoid(); 

    } 

    /// <summary> 
    /// Reads data from a stream until the end is reached. The 
    /// data is returned as a byte array. An IOException is 
    /// thrown if any of the underlying IO calls fail. 
    /// </summary> 
    /// <param name="stream">The stream to read data from</param> 
    public static byte[] ReadFully (Stream stream) 
    { 
     byte[] buffer = new byte[32768]; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      while (true) 
      { 
       int read = stream.Read (buffer, 0, buffer.Length); 
       if (read <= 0) 
        return ms.ToArray(); 
       ms.Write (buffer, 0, read); 
      } 
     } 
    } 
} 

interface IclsSO 
{ 
    void myVoid(); 
} 

ReadFullythis posting에서 인 예이다. 읽기 만하면 안되는 이유를 읽어보십시오. cryptoStream.Read(data, 0, decryptedLibArray.Length); 마지막 예제에는 약간의 오류가 있습니다. 그러나 그가 준 메모리 스트림 예제는 완벽합니다.

누군가가 프로그램의 RAM을 덤프하고 해독 된 바이너리를 얻거나, 메인 프로그램을 디 컴파일하여 해독 키를 가져 와서 해독 할 수 있습니다. 그래서 당신은 편집증에 의존하여, 당신은 여전히 ​​obfuscateor에 투자하기를 원할 수 있습니다.

+0

나는 집에 갈 때 이것에 대해 살펴볼 것입니다 - 이것은 내 질문에 대한 뛰어난 대답처럼 보입니다 - 감사합니다! –