2009-02-05 7 views
5

Sistemim ile çalışmak için {smartassembly} .NET obfuscator'ı almaya çalışıyorum. Şu anda kullanıcı verilerini bir dizi serileştirilmiş sözlük sınıfında saklıyorum ve daha sonra verileri geri almak için bu sınıfları deserialize ediyorum. Montaj versiyonu bilgisini zaten görmezden geliyorum, çünkü bu şekilde hayatı acıtıyor. Bu kod adapted from MSDN geçerli:Saptırılmış ve hata ayıklama yapıları arasında seri hale getirme uyumluluğunu nasıl koruyabilirim?

//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; 
    } 
} 

Sorun şimdi benim Karartılmış uygulaması tersi bilgiyi sürüm göz ardı eder, fakat olmayan Karartılmış uygulama tarafından kaydedilen verileri okuyamaz ve vardır. Uygulamanın hatalarını ayıklamak için gizlenmemiş bir versiyona ihtiyacımız olacak, bu bizim için oldukça büyük bir showtopper. Bu problemi aşmanın bir yolu var mı? Veri sınıflarını karıştırmamalı mıyım? Bu oldukça büyük bir güvenlik deliği gibi görünüyor.

cevap

6

Tür ve alan adlarına bağlı olmayan bir serileştirici olabilir mi? Örneğin, protobuf-net ikili bir toplayıcıdır, ancak her üyeye karşı sayısal etiket kümesi (bir özellik aracılığıyla) kullanır. Bunun anlamı şudur:

  • seri alan adı bilgisi (yukarıda) tarafından tefrika dosyası
  • bulunmayan tüm
  • de montaj sürümüne bağlı değildir o kod olmadığı önemli olmayacaktır gizlenmiştir;
  • (ve) dosyası (şifreli takdirde veriler yine niyet önerebilir rağmen) trivially Örneğin

gizleme kırmak için kullanılamaz:

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

Burada 1, dosyanın içindeki üyeyi tanımlayan her şeydir. Burada anahtar o sözleşmeye dayalı, yani alakasız bir tip daha sonra seriden çıkarılabilir olmasıdır:

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

(gizleme meta IIRC korur beri gayet).

Kontrast bu diğer sözleşmeye dayalı serileştiricileri (örneğin XmlSerializer veya DataContractSerializer gibi) - Eğer özelliklerdeki üye adını koymak zorunda kalacak, hemen hemen kandırma anlamsız kılacak:

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

Obfüsasyon ilk etapta güvenlik sağlamaz. Yani, bırakmayı düşünmek isteyebilirsiniz, dönem. Gördüğüm

iki seçenek vardır:

  1. o tür allak vermeyin. Bu işlerin işe yarayacak.
  2. Kendi serializer kodunuzu yazın.

Şaşkınlık yaparak hiçbir şey kazanamadığınız için # 1 ile giderim.

+0

ben Bir dongle çalışması yapmak için dikkat çekmek gerekir, çünkü gizleme olmadan, dongle aramaları kaldırmak kolay olacaktır. – mmr

+0

Newsflash: gizleme ile bile dongle çağrılarını kaldırmak çok kolay olacak. – MichaelGG

+0

Belki de, uygulamaya özel şeyler ile bile dongle'a gideceğiz.Bu özel bir hacker durdurmak için değil, anahtarı kaldıran ve yazılımı kullanmaya devam edebilirsiniz avara durdurmak anlamına geliyordu. – mmr

İlgili konular