27/11/2015 12

C# ile CodeDom kütüphanesi - Yazılıma Kod Entegrasyonu

Bu yazıda sizlere C# dili ile CodeDom kütüphanesini anlatacağım. Bu kütüphane ile yazılım içerisindeki kod yapısını veya istediğimiz bir alanı değiştirmeyi anlatacağım. Şunu belirtmek isterim. Bu işlem tamamen legal olup her hangi bir hack işlemi değildir. Bu kütüphane windows tarafından programlarımızda execurable dosyası üzerinden kodları değiştirmemizi sağlar.

Öncelikle Codedom nedir ve nasıl çalışır bundan bahsedeyim sizlere:

Program içerisinde bildiğimiz bir kod alanını değiştirme ve yeniden yazmak için kullanılan bir kütüphanedir. Bu kütüphane ile yazılan bir program aracılığı ile başka yazdığımız bir programın exe dosyası üzerinden kaynak kodlarda istediğimiz değişkenleri veya fonksiyonları bulup değiştirerek yeniden yazma işlemi ile değiştirilmiş bir program ortaya çıkarırız.

Bu kütüphaneyi kullanacağımız programa aşağıdaki kütüphaneyi eklememiz gerekmektedir.

Using System.CodeDom;

Bu kütüphane ile birkaç tane makale mevcut fakat onlar yeniden kod oluşturma üzerine kurulu makaleler. Biz bu yazıda var olan bir kodu değiştireceğiz ve programı yeniden yazdıracağız. İşlemlerimizi yapacağımız kod bloğunu ilk olarak program içerisinde aratacağız ve ardından onlar üzerinde değişiklikler yapacağız.

Şimdi yazımıza başlayalım. İlk olarak basit bir console uygulaması yazalım ve daha sonra bu console uygulamasının kodlarını değiştirelim.


class TheCode
{
   public void yazdir()
   {
      System.Console.WriteLine("The Code Program");
   }
}

static void Main( string[] args )
{
   TheCode the= new TheCode();

   the.yazdir();

   Console.ReadLine();
}

//yukarıda basit bir class ve fonksiyon yazdık.
//bu programı çalıştırdığımızda Ekrana The Code Program yazılır.
Yukarıdaki basit programı yazdığımıza göre şimdide değişim yaptıracağımız programa geçelim. Burada program içerisinde yazdığımız kodu bir string ifadeymiş gibi aratacağız ve bulunduğunda yeni kodumuzuda bir string ifadeymiş gibi yer değiştirttireceğiz. Bunun için CSharp NameSpace kısmından bir kaç nesneye ihtiyacımız olacak.
  • CodeCompiler nesnesi : Yeni Oluşturulan kodları tekrar derlemek için kulanacağımız nesnemiz. Bu nesnenin alt nesneleri ile yeni kodları oluşturacağız ve derleyeceğiz. Ardından yeni exemizi elde edeceğiz.
  • CSharpCodeProvider nesnesi ile yazdırılan kodların C# dilindeki assembly karşılığını getireceğiz ve yeni kodlarıjmızı Assembly olarak yazdıracağız.
  • CompilerParameters nesnesi ile programımıza yazdırdığımız yeni kodlarla çalışacak olan parametreleri oluşturup göndereceğiz.
  • CompilerSource nesnesinin alt nesnesi olan CompilerResults nesnesi ile ise en son programı içine gönderdiğimiz parametreler ve yukarıdaki Provider nesnesi ile oluşturduğumuz assembley kodlarını yeniden derleyeceğiz. Bu şekilde yeni oluşturulan programımızı geri döndüreceğiz.
Aşağıdaki kod bloğu ile programı derlemek ve assembly kodlarını oluşturmak için bir fonksiyon yazdık. Bu fonksiyon bize girilen kod ifadelerini assembly şeklinde geri döndürecek.

private static Assembly CompileSource( string kaynak_kod )
{
   CodeDomProvider cpd = new CSharpCodeProvider();//Kod sağlayıcımızı oluşturduk
   CompilerParameters cp = new CompilerParameters(); //parametrelerin gönderileceği nesnemizi oluşturduk
   cp.ReferencedAssemblies.Add("System.dll"); //işleme yapacağımız referans kütüphanemizi oluşturduk
   cp.ReferencedAssemblies.Add("benim_class.dll"); //kendi oluşturduğum bir class dosyasınıda programa ekledim
   cp.GenerateExecutable = true; //program derlensinmi ayarını yaptım
   CompilerResults cr = cpd.CompileAssemblyFromSource(cp, kaynak_kod);
   // programın assembly diline dönüştürülmüş halini oluşturdum.

   return cr.CompiledAssembly;//oluşturulan assembly kodlarını return ettim...
}
Yukarıdaki assembly kodlarını oluşturan fonksiyonu yazdığımıza göre sırada bu fonksiyonu kullanmamız gerekiyor. Aşağıdaki fonksiyon aracılığı ile yukarıdaki fonksiyonu çağıracağız ve kullanacağız.

namespace assembly_kod_olustur
{
   class Program
   {
      static void Main( string[] args )
      {
          olustur();
      }
      private static void olustur()
      {
         string kaynak_kodum= @"
            class TheCode
            {
               public void yazdir()
               {
                  System.Console.WriteLine("The Code Program");
               }
            }";

         Assembly assembly_kod = CompileSource(kaynak_kodum);
         object yeni_kod = assembly_kod.CreateInstance("değiştirilecek kod buraya yazılacak");
      }
   }
}
Yukarıdaki kodu çalıştırdığımızda en üstteki yazdığımız fonksiyonu alttaki yazdığımız alan ile değiştiriyoruz. Yani kodları string olarak değiştiriyoruz.

Burada artık yukarıdaki programımız çalışmayacaktır. Çünkü derleme hatası olacaktır. Nendeni ise program çalıştığında TheCode classı içerisindeki yazdir fonksiyonunu çağırıyor. Fakat artık program içerisinde yazdir diye bir fonksiyon bulunmamaktadır. ununla birlikte TheCode diye bir classta bulunmamaktadır. Çünkü o verileri sildik ve yerine başka birşeyler yazdık.

Burada yeni oluşan assemly kodumuz bir nesnedir. Ondan dolayı object değişken türü olarak çağırdık.

Peki executable programımız üzerindeki değişikliği nasıl yapacağız. Bu konu ile ilgili bir örnek yapalım ve yazımızı bitirelim.

 

Aşağıdaki örnek ile Codedom Uygulaması yapacağız ve girilen exe üzerinde değişiklik yapacağız.


public static bool programi_derle(string exe_yolu, string degisecek_kod)
        {
            CodeDomProvider derleyici= CodeDomProvider.CreateProvider("CSharp");
            //Derleyicimizi oluşturduk ve hangi dilde olacağını belirledik
            CompilerParameters parametreler= new CompilerParameters();
            //parametrelerin nesnesini oluşturduk
            CompilerResults cikti= default(CompilerResults);
            //birde çıktı nesnesi oluşturduk

            parametreler.GenerateExecutable = true;
            parametreler.OutputAssembly = exe_yolu;
            parametreler.ReferencedAssemblies.Add("System.dll");
            parametreler.CompilerOptions = " /target:winexe";
            parametreler.TreatWarningsAsErrors = false;
            // derlerken kullanacağımız parametreleri ayarladık

            cikti= derleyici.CompileAssemblyFromSource(parametreler, degisecek_kod);
            //programı derleme işlemine gönderdik :D

            if (cikti.Errors.Count > 0) //derleme ile ilgili hata varmı kontrol ettik
            {
                foreach (var item in cikti.Errors)
                {
                   MessageBox.Show(item.ToString()); //hata varsa ekranda gösterelim diye
                }
                return false;
                // hata varsa false değişkenini döndürdük
            }
            else if (cikti.Errors.Count == 0)
            {
                return true; hata yoksa true değişkenini döndürdük ve işlemi tamamladık
            }
            return true;
        }

Yukadıdaki fonksiyonu çağıradağız ve seçtiğimiz exe yi dönüştüreceğiz ve yeniden bir exe dosyası oluşturacağız. Fonksiyonuda aşağıdaki şekilde çağıralım. Bir form uygulaması olsun ve bu işlemi yapalım.


OpenFileDialog dialog = new OpenFileDialog();
            dialog.FileName = "";
            dialog.Filter = "Exe Dosyaları|*.exe|DLL dosyaları|*.dll";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                programi_derle(dialog.FileName.ToString(), "yeniden yazılacak kod");
            }

Bu şekilde yeniden hazırladığımız kodlarla exe dosyamızı yeniden oluşturduk ve programımızı yeniden yazmış olduk. Derleme ile ilgili herhangi bir hata almazsanız program başarılı bir şekilde derlenecektir. Ve exe dosyamız yazdığımız kodlarla yeniden oluşacaktır.

Tekrar söyleyeyim arkadaşlar bu işlem kesinlikle bir hack işlemi değildir. Microsoftun sağladığı kütüphaneler aracılığı ile exe dosyalarının içeriğini değiştiriyoruz ve yeniden oluşturuyoruz

Bu yazımızda bu kadar arkadaşlar -- Takipte kalın

İyi Çalışmalar

Burak Hamdi Tufan


Tags

Share this Post



Post a Comment

Success! Your comment sent to post. It will be showed after confirmation.
Error! There was an error sending your comment.

Comments

    There is no comment. Be the owner of first comment...