|
||
|
| root > Yazılım Güvenliği |
|
|
| Assembly, ILDASM.exe ve GACUTIL.exe Hakkında | ||||||||||||||||||||||||||||||
|
Assembly, ILDASM.exe ve GACUTIL.exe Hakkında
Bu makalede kavram olarak en çok karıştırılan ve anlaşılması diğer konulara göre zor olan Assembly kavramını ve Visual Studio ile birlikte gelen GACUTIL ve ILDASM gibi önemli araçları inceleyecegiz.
Bu programı notepad "da yazıp derledikten sonra komut satırında "csc assembly1.cs" yazıp assmbly1.exe dosyasını oluşturun. Aynı klasör içine şimdi aşağıdaki assembly2.cs dosyasını oluşturun ve derleyerek assembly2.exe "nin oluşmasını sağlayın.
Yukarıda da bahsettiğim gibi Application Domain sayesinde bir uygulama içerisine değişik assembly"ler yüklenebilir ve çalıştırılabilir. Application Domian kavramını System isim alanında bulunan AppDomain sınıfı temsil eder. Yeni bir Application Domain"i oluşturmak için AppDomain sınıfının overload (aşırı yüklenmiş)edilmiş CreateDomain statik üye fonksiyonları kullanılır. AppDomain sınıfının ExecuteAssembly fonksiyonuyla dışarıdan yeni bir Assembly yüklenir ve o satırdan itibaren yüklenen assembly çalıştırılır. (Yukarıdaki örnekte iki Assembly"nin de aynı klasörde olmasına dikkat edin.)
Assembly"ler private ve shared olmak üzere ikiye ayrılır. Bunları detaylı olarak açıklamaya başlamadan önce Assembly"leri görüntülemek için kullanılan ILDASM.exe aracını inceleyelim. ILDASM.exe MSIL kodu içeren assembly dosyalarını okur ve kullanışlı bir arayüz ile kullanıcıya sunar. ILDASM.exe programını çalıştırmak için komut satırına ILDASM.exe yazmamız yeterlidir. Açılacak pencereden File->Open menüsünü kullanarak görüntülemek istediğiniz Assembly dosyasını seçin.(Aşağıda gördüğünüz ekran görüntüleri Assembly2.exe"nin görüntüleridir.) Bir assembly"deki türler, sınıflar, fonksiyonlar çeşitli sembollerle temsil edilmiştir. Hangi sembollerin ne anlama geldiğini MSDN kitaplığından bulabilirsiniz. ![]() Diğer bölümlerde tıklayarak IL kodlarını inceleyebilirsiniz. Yukarıda bahsettiğimiz gibi Assembly"ler private ve shared olmak üzere ikiye ayrılır. Normal olarak geliştirilen Assembly"ler private Assembly olarak adlandırılır. Bu tür assembly"ler uygulama ile aynı dizinde ya da alt dizinlerde bulunur. Versiyon ve isim uyuşmazlığı sorunu bu tür assembly"lerde olmamaktadır. Shared assembly"ler ise daha çok büyük projelerde mesela bir projenin bir firmaya ait farklı ofislerinde gerçekleştirildiği durumlarda kullanılır. Bu durumda assembly"lerin uyması gereken bazı kurallar vardır. Bunlardan en önemlisi strong name dediğimiz tekil bir isme sahip olmasıdır. Bu sayede shared assembly"ler tekil olduğu için bir sistemde global düzeyde işlem görürler. Yani farklı farklı uygulamalardan aynı anda shared assembly"lere ulaşılabilir. Şimdi shared assembly kavramını biraz açalım. Shared Assembly Assembly"ler varsayılan olarak private"tır. Bu yüzden bu tür Assembly"ler sadece bulundukları dizin içerisindeki uygulamalar tarafından görülür ve çalıştırılırlar. Oysa ki bazı durumlarda bütün programlar tarafından o Assembly"ye birbirlerinden bağımsız olarak erişilmesini isteriz. Bunu sağlamak için Global Assembly Cache denilen bir sistemden faydalanacağız. .NET "in yüklü olduğu bütün sistemlerde Assembly Cache mekanizması vardır. Bu Assembly Cache"ye yüklü olan Assembly"ler bütün uygulamalar tarafından kullanılabilir. Bir assembly"yi GAC"a(Global Assembly Cache) yüklemek için 3 yöntem kullanılır: - Assembly"leri Windows Installer 2.0 ile yüklemek - Gacutil.exe isimli .NET ile gelen aracı kullanmak - /assembly "ye Assembly dosyasını kopyalamak (C:\winnt\assembly\) Şimdi adım adım bir shared assembly oluşturmayı görelim. Bunun için ikinci yöntemi kullanacağım. Başlangıç olarak gacutil.exe programı hakkında bilgi vermek istiyorum. Gacutil(global assembly cache utility) programı .NET ile birlikte gelir. Assembly cache"ye yeni assembly yüklemek varolan assembly"leri listelemek ve silmek için kullanılır. Komut satırından aşağıdaki parametrelerle bu programı çalıştırabiliriz. * gacutil /l ---> GAC "da bulunan bütün assembly"leri listeler. * gacutil /i assemblydll---> assemblydll adlı shared assembly"yi GAC "a yükler. * gacutil /u assemblydll---> assemblydll adlı shared assembly GAC "dan siler. İlk adım olarak bütün shared assembly"lere strong name dediğimiz bir isim vermeliyiz. GAC "da bulunan bütün assembly"lerin farklı bir adı vardır. COM teknolojisindeki globally unique identifier(GUID) "e benzetebiliriz bu isimleri. Peki bu strong name "leri nasıl oluşturacağız? Bu iş için yine .NET ile birlikte gelen sn.exe adlı aracı kullanacağız. sn programı aşağıdaki gibi kullanılarak bir tekil isim oluşturulur ve anahtar.snk adlı dosyaya yazılır. sn -k anahtar.snk anahtar.snk dosyasını oluşturduktan sonra bu anahtar ismi projemizdeki AssemblyInfo.cs dosyasındaki manifeset bölümüne ekliyoruz. Yani AssemblyKeyFile özelliğini anahtar.snk olarak değiştiriyoruz. Sonuç olarak AssemblyInfo.cs dosyası aşağıdaki gibi olacaktır. ............... [assembly AssemblyDelaySign(false)] [assembly AssemblyKeyFile("../../anahtar.snk")] [assembly AssemblyKeyName("")] ............... Bu işlemleri yaptıktan sonra projeyi "Build" edip oluşan Assembly dosyasını gacutil.exe yardımıyla GAC "a ekliyoruz. Bu işlemi komut satırından aşağıdaki gibi yapmalıyız. gacutil /i Assembly1.dll Bu işlemi yaptıktan sonra shared olan bu assembly"ye istediğimiz .NET projesinden ulaşabiliriz. Tabiproject->Add reference menüsünden shared assembly"ye referans verdikten sonra yapabiliriz bunu. Shared assembly olduğu için yeni bir projede bu assembly kullandığımız da lokal bir kopyası oluşturulmaz dolayısıyla GAC üzerinden erişilir. Kaynaklar C# Primer (A Practical Approach) - Stanley Lipman MSDN Kütüphanesi |
|
| Bağlantılar Bg.org.tr |
| CS - Security Expert Network | AUP&TOS |