2010-03-10 5 views
6

.NET 응용 프로그램에서 응용 프로그램 자체 외부에서 포함 된 리소스를 검색하는 것이 얼마나 어려운가요? 리소스가 압축되고 쉽게 암호화 되더라도 도구를 사용하여 리소스를 검색하는 것이 얼마나 어렵습니까?.NET의 리소스는 얼마나 안전합니까?

내 질문은 오해 한 생각, 그것은 암호화에 대한 적었다 : 편집


(I는 데이터 자체, 자원 자체의 검색의 단지 방법의 보호와 관련 있지 않다) 리플렉터 이외의 검색에 대한 자세한 내용은 무엇을 사용할 수 있습니까?

+2

정확히 어떻게 암호화 되었습니까? –

+0

많은 도구가이를 수행 할 수 있습니다. 예를 들면 ILSpy가 그것을 할 수 있습니다. 자원을 쉽게 검색 할 수 있습니다. 그리고 .NET 어셈블리에서 내부적으로 사용하는 암호 해독 방법은 쉽게 되돌릴 수 있습니다. – BrainSlugs83

답변

8

.NET Reflector 또는 .NET Resourcer과 같은 도구를 사용하여 컴파일 된 .NET DLL에서 리소스를 검색하는 것은 간단합니다.

+0

당신이 알고있는 다른 방법이 있습니까? Resourcer를 테스트 할 예정이지만 Reflector는 현재 문제가 아닙니다. –

+2

음, 약간의 코드를 작성할 수 있습니다. Assembly.GetManifestResourceStream(). –

+0

또한 Visual Studio에서 어셈블리를 열어보십시오. 그냥 궁금해서 반사경에서 추출 할 수 없다는 것을 알았습니까? –

6

응용 프로그램에 포함 된 키를 사용하여 리소스를 암호화하면 리버스 엔지니어링을 통해 키와 리소스를 쉽게 검색 할 수 있습니다.

보안 알고리즘을 사용하여 암호를 암호화하고 사용자에게 암호 입력을 요청하면 암호없이 암호를 추출 할 수 없습니다. 그러나 나는 그것이 당신이 원하는 것이 아니라고 생각합니다. 사용자가 애플리케이션 외부에서 리소스를 사용하지 못하도록하고 싶습니까?

짧은 대답은 : .NET의 리소스가 안전하지 않다는 것입니다.

+3

나는 너를 upvoted; 그러나 ANYTHING의 자원은 안전하지 않습니다. 암호화 키가 응용 프로그램 자체에 포함 된 경우 사용하는 언어는 문제가되지 않으며 나중에 암호화 할 수 있습니다. – NotMe

2

백만 달러가 들어간 금고를 보여준 다음 그 자리를 떠나면 결국 그 금고에 들어갑니다. 그 돈을 보호 할 기술은 없으며, 유일한 진짜 장벽은 시간입니다.

소프트웨어와 동일합니다. 자원을 보호 할 수있는 유일한 방법은 충분한 시간을두고 누군가가 할 수있는 곳에 배치하지 않는 것입니다. 내가 아는 가장 효과적인 옵션은 사용자가 제어하는 ​​서버에 비판적 리소스를 저장하는 것입니다.

물론 많은 사람들이 잘못 생각합니다. 한 가지 또는 다른 방법으로 보안 리소스를 사용자의 컴퓨터에 임시로 복사 할 수 있습니다. 어떤 시점에서 게임이 손실됩니다. 즉, 일시적으로 일시적으로 복제되는 리소스 만 안전하게 보호 할 수 있습니다. 예를 들어 만료되는 보안 토큰 또는 계산 결과가 계산 방법을 나타내지 않습니다.

2

문제는 .NET 리소스 및 보안에 대한 자세한 내용입니다. "내 클라이언트 응용 프로그램에서 내가 역 공학을 원하지 않는 비밀을 저장하고"의도를 변경하지 말라는 질문을 다시 할 수 있습니다.

리소스 파일에는 무엇이 있으며 왜 보안이 필요합니까? 당신은 당신이 클라이언트에 그 비밀을 전혀 저장하지 않는 디자인을 고려 했습니까? 클라이언트 측 보안을 안전하게 유지하기 위해 뱅킹하는 경우 실망하게 될 것입니다.

+1

타사 라이브러리를 사용할 수있는 라이센스 파일은 어떻게됩니까? - 클라이언트에서 해당 타사 라이브러리를 사용하려면 클라이언트에서 해당 라이센스 파일을 가져올 수 있어야하지만 최종 사용자가 라이센스 파일을 가져올 수 없도록하려면 재사용하면 ... - 유출되면 면허가 취소됩니다. 그러면 어떻게 확보 할 수 있습니까? – BrainSlugs83

3

다음은 어셈블리에서 리소스를 가져 오는 몇 가지 간단한 코드입니다. 당신은 그것이 얼마나 쉽고 안전한지 결정합니다 ...

class Program 
{ 
    static void Main(string[] args) 
    { 
     var assemblies = from file in args 
         let assembly = TryLoad(file) 
         where assembly != null 
         from rName in assembly.GetManifestResourceNames() 
         select new { assembly, rName }; 

     foreach (var item in assemblies) 
      using (var rs = item.assembly 
           .GetManifestResourceStream(item.rName)) 
       SaveTo(rs, item.rName); 

    } 

    static void SaveTo(Stream stream, string name) 
    { 
     var buffer = new byte[32*1024]; 
     var bufferLen = 1; 
     using (var fs = new FileStream(name, FileMode.Create)) 
      while (bufferLen > 0) 
       if ((bufferLen = stream.Read(buffer, 0, buffer.Length)) > 0) 
        fs.Write(buffer, 0, bufferLen); 
    } 

    static Assembly TryLoad(string filename) 
    { 
     if (string.IsNullOrEmpty(filename) || 
      !File.Exists(filename)) 
      return null; 
     try 
     { 
      var fullName = Path.GetFullPath(filename); 
      return Assembly.LoadFile(fullName); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex); 
      return null; 
     } 
    } 
} 
관련 문제