ILDASM ve SuppressIldasmAttribute


MSIL disassembler (ILDASM) aracı, .NET platformu üzerinde geliştirmiş olduğunuz DLL ve EXE assembly'lerinin içindeki kodları gösteren bir uygulamadır. Bu araç, sadece kodları değil, bir assembly içindeki namespace'leri ve tipleri de gösterir. ILDASM aracı, .NET SDK ile birlikte gelmektedir. Ayrıca, VS.NET kurulumundan sonra da VS.NET komut satırından ILDASM.EXE'yi çalıştırabilirsiniz.

 

Pek çok faydası olan bu aracın varlığı, pek çok kişi için "kodların çalınabileceği" bir ortam yaratmaktadır ve ILDASM içinde assembly'lerin görüntülenmesinin nasıl engellenebileceği araştırılmaktadır.

 

.NET 2.0 ve sonrasında, bir assembly'nin ILDASM aracı içinden açılmasını engelleyen bir "attribute" vardır. SuppressIldasmAttribute kullanılarak, bir namespace, class ya da metodun ILDASM içinde görülmesini engelleyebilirsiniz.

 

Örneğin, bir VS.NET içinde windows forms projemiz olsun:

 

using System;

using System.Windows.Forms;

 

namespace ILDASM_Test

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            MessageBox.Show("Test");

        }

    }

}

Bu uygulamamız derledikten sonra, ILDASM aracını açıp (örneğin VS.NET komut satırını açıp, ILDASM yazarak enter’a basalım), File -> Open ile uygulamamızın derlendiği “bin” klasörüne gidelim ve assembly’mizi açalım.

Görebileceğiniz gibi, uygulamamızın içindeki herşeyi ILDASM içinden görebiliriz.

Eğer, bu assembly’nin ILDASM içinde açılmasını engellemek isteseydik, kodumuza aşağıdaki gibi değiştirmemiz yeterli olacaktı:

using
System;
using System.Windows.Forms;
using System.Runtime.CompilerServices; 


[assembly: SuppressIldasmAttribute()]

namespace ILDASM_Test

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            MessageBox.Show("Test");

        }

    }

}

Farkedebileceğiniz gibi, [assembly: SuppressIldasmAttribute()] kullanıyoruz. Bunu kullanabilmemiz için, namespace olarak System.Runtime.CompilerServices servisini de kullanmamız gerekmekte.

Bu işlemlerden sonra derlediğimiz kodu tekrar ILDASM içinde açmaya çalıştığımız zaman karşımıza, bu assembly’nin korunan bir assembly olduğunu ve ILDASM içinde açılamayacağını belirten bir mesaj çıkacaktır.

Burada hemen önemli bir not eklemem gerekiyor. Bu attribute’u kullanmak, kodlarınızın ILDASM içinden açılmasını engelleyecektir. Ancak .NET kodlarınızı “reflector” tarzı programların içinden açılmasını engellemeyecektir. Bu tarz uygulamalara örnek olarak Lutz Roeder’s .NET Reflector uygulamasını gösterebiliriz.

Eğer kodlarınızı mümkün olduğunca gizlemek istiyorsanız, “obfuscator” yazılımları kullanmayı deneyebilirsiniz. Yine de bu tarz uygulamalar genellikle kodlarınızın okunmasını ve anlaşılmasını zorlayacak bazı değişiklikler yapmaktan fazlasını yapamayacaklardır. Bu tarz uygulamalara örnek olarak Dotfuscator uygulamasını gösterebiliriz. Dotfuscator Community Edition, VS.NET’in pek çok sürümü ile birlikte gelmektedir.
 

Geçerli olduğu platformlar:

.NET 2.0 ve sonrası.

Kaynaklar:
 

MSIL Disassembler (Ildasm.exe)
http://msdn2.microsoft.com/en-us/library/f7dy01k1(VS.80).aspx 

SuppressIldasmAttribute Class
http://msdn2.microsoft.com/en-us/library/system.runtime.compilerservices.suppressildasmattribute(VS.80).aspx

Attribute Class
http://msdn2.microsoft.com/en-us/library/system.attribute(VS.80).aspx

Lutz Roeder’s .NET Reflector
http://www.aisto.com/roeder/dotnet/

Getting Started With Dotfuscator
http://msdn2.microsoft.com/en-us/library/ms227276(VS.80).aspx

--
AMB

Comments (2)

  1. nice, but need Google translator to translate to English:-)

  2. @ Ehsan Mohammadi – 🙂 In fact I have started blogging in Turkish first and then I switched to English. The same article is also available in English @ blogs.msdn.com/…/how-to-prevent-ildasm-from-disassembling-my-net-code.aspx, if you are interested in. Thanks for the comment though 🙂

Skip to main content