문제

내 시스템과 함께 작동하도록 {SmartAssembly} .NET Obfuscator를 얻으려고합니다. 나는 현재 일련의 직렬화 된 사전 클래스에 사용자 데이터를 저장 한 다음 해당 클래스를 필사적으로 저장하여 데이터를 다시 얻습니다. 나는 이미 어셈블리 버전 정보를 무시하고 있습니다. 그 코드입니다 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;
    }
}

문제는 이제 내 난독 화 된 앱이 버전 설정 정보를 무시하지만, 비포 보이지 않는 앱에서 저장된 데이터를 읽을 수 없으며 그 반대도 마찬가지입니다. 응용 프로그램을 디버깅하려면 객관화되지 않은 버전이 있어야하므로 이것은 우리에게 꽤 큰 쇼 토퍼입니다. 이 문제를 해결하는 방법이 있습니까? 데이터 클래스를 난독 화해서는 안됩니까? 그것은 꽤 큰 보안 구멍처럼 보입니다.

도움이 되었습니까?

해결책

아마도 유형과 필드 이름에 묶이지 않은 시리얼 라이저를 고려할 수 있습니까? 예를 들어, protobuf-net 이진 시리얼 라이저이지만 각 멤버에 대해 숫자 태그 세트 (속성을 통해)를 사용합니다. 이것은 다음을 의미합니다.

  • 직렬화는 어셈블리 버전과 전혀 관련이 없습니다
  • 필드 이름 정보는 직렬화 된 파일에 없습니다
  • (위) 코드가 난독 화되었는지 여부는 중요하지 않습니다.
  • (및) 파일은 사소한 난독 화를 끊는 데 사용될 수 없습니다 (데이터는 암호화되지 않는 한 여전히 의도를 제안 할 수 있지만)

예를 들어:

[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. 이러한 유형을 난독 화하지 마십시오. 이것은 단지 일을 작동시킬 것입니다.
  2. 자신의 시리얼 라이저 코드를 작성하십시오.

난독 화하여 아무것도 얻지 못하기 때문에 #1과 함께 갈 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top