2009-02-05 6 views
5

내 시스템에서 작동하도록 {smartassembly} .NET obfuscator를 얻으려고합니다. 현재 일련의 사전 식 클래스에 사용자 데이터를 저장 한 다음 해당 클래스를 deserialize하여 데이터를 다시 가져옵니다. 나는 이미 어셈블리 버전 정보를 무시하고 있습니다. 왜냐하면 삶이 고통 스럽기 때문입니다. 그 코드는 adapted from MSDN입니다 :난독 화 및 디버그 빌드간에 직렬화 호환성을 유지하려면 어떻게해야합니까?

//to avoid cross-versioning problems 
public sealed class CrossVersionDeserializationBinder : SerializationBinder { 
    public override Type BindToType(string assemblyName, string typeName) { 
     Type typeToDeserialize = null; 

     typeToDeserialize = Type.GetType(String.Format("{0}, {1}", 
      typeName, assemblyName)); 

     return typeToDeserialize; 
    } 
} 

문제는 지금 내 난독 응용 프로그램은 그 반대의 경우도 마찬가지 버전 관리 정보를 무시하지만, 비 난독 응용 프로그램에 의해 저장된 데이터를 읽을 수 있으며,입니다. 애플리케이션을 디버깅하기 위해 난독 화되지 않은 버전이 필요할 것입니다. 따라서 이것은 우리에게 상당히 큰 쇼 스트 스토퍼입니다. 이 문제를 해결할 수있는 방법은 없습니까? 데이터 클래스를 난독 화하지 않아야합니까? 꽤 큰 보안 구멍처럼 보입니다.

답변

6

유형 및 필드 이름에 연결되지 않은 직렬기를 고려해야할까요? 예를 들어, protobuf-net은 2 진 시리얼 라이저이지만 각 구성원에 대해 (속성을 통해) 숫자 태그 세트를 사용합니다. 이는 :

  • 직렬화 필드 이름 정보 (위로) 직렬화 된 파일
  • 에없는 모든
  • 에서 어셈블리 버전에 연결되지는 코드 여부를 중요하지 않습니다 난독
  • (과) 파일이 (암호화되지 않는 데이터가 여전히 의도를 제안 할 수도 있지만) 사소 예를 들어

난독을 깰 사용할 수 없습니다

[ProtoContract] 
public class Foo { 
    [ProtoMember(1)] 
    public string Bar {get;set;} 
} 

여기서 1은 파일에서 해당 회원을 식별 한 것입니다. 여기에서 핵심은 계약 기반이므로, 관련없는 타입 나중에 탈 직렬화 될 수있다 :

[ProtoContract] 
public class a12 { 
    [ProtoMember(1)] 
    public string a {get;set;} 
} 

(난처 메타 IIRC 보존 때문에 미세하다).

명암이 다른 계약 기반 시리얼 라이저 (예 : XmlSerializer 또는 DataContractSerializer 등) - 당신이 속성에 멤버 이름을 넣어 강제 것, 거의 난처 무의미 렌더링 것 :

[DataContract] 
public class a12 { 
    [DataMember(Name="Bar")] 
    public string a {get;set;} 
} 
-1

난독 화는 보안을 처음부터 제공하지 않습니다. 그래서, 당신은 그것을 놓기를 고려할 수 있습니다. 내가 볼

두 가지 옵션은 다음과 같습니다

  1. 그 유형을 당황하게하지 마십시오. 이것은 일을 그냥 일하게 만들 것입니다.
  2. 사용자 고유의 시리얼 라이저 코드를 작성하십시오.

난독 화로 인해 아무 것도 얻지 못하기 때문에 # 1로 갈 것입니다.

+0

I 혼란이 없기 때문에 동글 호출을 제거하기가 쉽기 때문에 동글 작업을하기 위해 난독 화해야합니다. – mmr

+0

Newsflash : 난독 화로도 동글 통화를 제거하는 것이 정말 쉽습니다. – MichaelGG

+0

어쩌면 - 모든 앱 관련 정보가있는 경우에도 동글에 넣을 것입니다.헌신적 인 해커를 막을 의도는 아니며, 키를 제거하고 소프트웨어를 계속 사용할 수있는 유휴 상태의 사람을 막을 수 있습니다. – mmr