난독 화 된 및 디버그 빌드에서 사형화 호환성을 어떻게 유지합니까?
-
21-08-2019 - |
문제
내 시스템과 함께 작동하도록 {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과 함께 갈 것입니다.