2010-06-12 25 views
11

Dış işlem için C# içinde sanal alan nasıl oluşturulur? Sandbox olarak C# ile başladığım işlem için bir ortam anlıyorum, bu işlem başka bir şeye müdahale etmesini engeller - çekirdek, sistem değişkenleri, sistem yapılandırması, bellek, kayıt defteri, disk, donanım, başlangıç ​​yeri vb.Harici işlem için C# içinde sanal alan nasıl oluşturulur?

Bir yerde yer yürütülebilir istiyor ve burası bu işlemle değiştirilebilir tek yer olduğundan emin olun. Ayrıca, C, C++, C# ve benzeri dosyalarda da yazılabilir.

cevap

2

Bir ölçüde ulaşmak istediğinizi düşündüğümün bir örneği olarak Sandboxie'u kullanın. IMHO, bunu saf yönetilen kodunda yapamazsınız.

ne eylem ve bağımsız bir yönetilen veya yerli ya da hatta Java uygulaması ise bir uygulamanın etkisini sınırlamak için muktedir istiyorum. Uygulama, uygulamanız tarafından gerçekleştirilen her eylemi izlemeniz ve sisteminizi etkilememesini sağlamak için onaylama eylemini gerçekleştirmeniz gerektiğidir. Uygun eylem, uygulama yazımını diskteki alternatif bir konuma yönlendirmeniz, sanal kayıt defterinin gerçek kayıt defterinin etkilenmemesi vb. Şekilde yazılması anlamına gelebilir. Tüm bunlar, yönetilen kodun çok düşük seviyede çalışmasını gerektirecektir. bugün sağlayın.

Not saf yönetilen kod, tabii kodun belli alanların yönetilmeyen uygulanması yararlanmak vb Interop'un Hizmetlerini yararlanabileceğini söyledi, yoksa yönetilen C++ özelliğini kullanabilir. Ancak, sandbox'ınızın yapmasını istediğiniz şeyin tam ayrıntılarına bağlı olarak, korumalı kullanıcı modu uygulamaları için ortamı yeterince sanallaştırabilmeniz için muhtemelen bir çekirdek modu sürücüsünü uygulamanız gerekecektir. Yalnızca yönetilen kod çalıştırmasına isteseydim

+0

başka kayıt veya disk konumuna yeniden yönlendirme hakkında söyledi. Kayıt defterini tam blok kullanımı hakkında ve yeniden yönlendirme ile uğraşma hakkında ne dersiniz? Daha basit mi olacak? Çünkü bu uygulamalar herhangi bir işlevselliğe ihtiyaç duymaz. Sadece onları engellemek istiyorum. – SuitUp

+1

@SuitUp, bu daha kolay olsa da aynı veya benzer mekanizmalar hala çağrıları engellemek ve başarısız olmak için gereklidir. Önemli olan basitleştirme, kayıt defterini vb. Sanallaştırmaya gerek duymamanızdır, ancak kesişimin karmaşıklığı hala var. Duruşma için Detours gibi bir kütüphane kullanabilirsiniz, fakat dürüst olmak gerekirse, bu size sağlam ve güvenilir bir sanal alan çözümü sunacağından kuşkuluyum. Tabi ki, temel çağrı engellemesinden daha fazlasını gerektiren tam bir güvenilir ve güvenli çözümün gerekli olduğunu düşünüyorum. . –

+0

Varsayım doğru. Bana bazı teknik detaylar verebilir misin? – SuitUp

3

, bir uygulama etki alanı kullanarak bir Sandbox ortamı oluşturmak için nispeten kolay w kısıtlı bir izin kümesi /: en kısa sürede yönetilmeyen/güvensiz kapıyı açar açmaz

 PermissionSet ps = new PermissionSet(PermissionState.None); 
     // ps.AddPermission(new System.Security.Permissions.*); // Add Whatever Permissions you want to grant here 

     AppDomainSetup setup = new AppDomainSetup(); 
     Evidence ev = new Evidence(); 

     AppDomain sandbox = AppDomain.CreateDomain("Sandbox", 
      ev, 
      setup, 
      ps); 

     sandbox.ExecuteAssembly("ManagedAssembly.exe"); 

Ama Kod tüm bahisler kapalı ve 3. taraf kodu güvenli hale getirmek çok zor hale geliyor. Bahsedildiği gibi, kısıtlı bir kullanıcı olarak çalıştırılmaya ve sizi korumak için tek başına ACL/UAC'ye güvenmek için yeterli olmadıkça, yürütme kodu ile işletim sistemi arasında yapabilecekleri sınırı sınırlamak zorundasınız.

NOT: Bu kod örneği, çalışan bir örnek değil, yalnızca kodun nasıl görüneceğine dair bir fikirdir. Bazı finagling w/Kanıt ve AppDomainSetup muhtemelen gerekli olacaktır ve kesinlikle güvenlik sonuçları göz önünde bulundurarak, o zaman, onun için araştırma yapmalı/test etmelisiniz. İşte konuyla ilgili iyi bir makale: http://msdn.microsoft.com/en-us/magazine/cc163701.aspx

+1

Yönetilmeyen/güvenli olmayan kod ve bazı kod parçacıklarına ne dersiniz? – SuitUp

+1

Dürüst olmak gerekirse, yönetilmeyen/güvensiz kodlarla nereden başlayacağınızı gerçekten bilmiyorum ve Windows işletim sistemi, Kernel/Sistem çağrıları, Bellek Ayırma ve erişim hakkında derin bir anlayış gerektiren birkaç aylık bir proje olabilir. Microsoft'ta çalışan insanlar bu şeyleri doğru bir şekilde alamıyorlar. –

+1

Tavsiyem: gereksinimlerinizi değiştirin, yalnızca yönetilen kodu kabul edin veya kullanıcılarınıza yalnızca güvendikleri 3. taraf çalıştırılabilirleri kullanmaları gerektiğini anlatın. Sadece bir işlemi farklı bir kullanıcı olarak çalıştırmayı kastetmediyseniz, bu durumda ProcessStartInfo sınıfının Etki Alanı/KullanıcıAdı/Parola özelliklerini gözden geçirin. –

İlgili konular