anonuser23532
Kıdemli Üye
- 9 Ara 2017
- 2,602
- 12
Örnek bir CrackMe üzerinde string decryptor yazalım.
Kullanılan Programlama Dili : C#
Kullanılan 3.Parti Yazılım : dnlib
Kullanılan CrackMe : https://www.turkhackteam.org/zararli-yazilim-analizi/1846699-crack-me-unpack-me.html
Yapacağımız ilk şey bir C# projesi oluşturup içerisine kullanacağımız kütüphaneyi dahil etmek.
Projemi WindowsForm olarak oluşturacağım siz isterseniz Console olarak da oluşturabilirsiniz.
Projemizi oluşturduktan sonra Proje > Nuget Paketlerini Yönet... kombinasyonunu uygulayarak dnlib 'i yükleyelim.
Bu işlemleri sırası ile yaptıktan sonra formumun görünümü düzeltiyorum.
1 TextBox ve 1 Button yeterli.
DEĞİŞKENLER VE FONKSİYONLAR
Bu kısımda tane tane yaptığı her şeyi ayrıntılarıyla anlatmaya çalışacağım anlamadığınız bir kısım olursa sorabilirsiniz.
Bu kütüphaneleri programımıza ekliyoruz.
Form olayının çalıştığı yerin hemen altına ModuleDefMD türünde bir module değişkeni tanımlıyoruz. Burası bizim yüklediğimiz dosyayı tutacak.
Daha sonra public **** olarak bir event tanımlayalım. Ben adını TODO yapacağım.
Buttonumuzun üstüne iki kere tıklayarak Button1_Click eventimize girelim.
İlk başta bir OpenFileDialog tanımladık ve onu sadece exe dosyaları seçebilmesi için filtreledik ve eğer OK tuşuna basılırsa devreye girecek olayları if bloğu içerisine yazdık.
Dikkat ! : Bunları yazarken try catch bloğunu kullandık çünkü herhangi bir hata çıktığında kullanıcıyı bilgilendirmemiz gerekiyor.
1. if bloğu içerisine module adıyla atadığımız değişkene OpenFileDialog'da seçtiğimiz dosyanın atılmasını söyledik.
2. Seçilen dosyanın yolunu textBox1 ' te attık.
3. Asıl işleri yapacak fonksiyonumuzu çalıştırdık.
4.Catch içerisine çıkan hatayı bir messageBox ' da göstermesini isteyerek kullanıcıyı bilgilendirdik.
~ DECRYPTOR ~
Programımızı dnSpy üzerinde açalım ve stringlerin durumuna bir bakalım.
Ve durum beklediğimiz gibi InitializeComponent'e kadar bütün stringlerin decompiler üzerinden okuması zorlaştırılmış.
İşte string çözücüde kullanacağımız fonksiyon karşımızda.Önceki resimlere bakarsanız istenilen stringlerin buradan çağırıldığını göreceksiniz. Dolayısıyla bizim de kullanacağımız fonksiyon bu olacak. Bunu kopyalayıp projemize atalım.
.NET Programlarda bütün string değerler Ldstr OpCode'una sahiptir.
Dolayısıyla yapmamız gerekenler ;
1. Type'lar içerisinde dolaşmak ;
Burada gördüklerinize type deniliyor.
2.Type'ların içerdiği methodların içerisinde dolaşmak ;
Burada gördüğünüz turuncu renkliler methodlardır.
3.Böyle biz dolaşıyoruz hepsinde iyi hoş ancak strings dediğimizde hepsini çekecek programın işine yarayan resources stringini , settings stringini vs. onu engellemek lazım.
4.Bir döngü ile method içerisinde bulunan ldstr opcode'una sahip bütün değerleri çekip "cozucu" fonksiyonuna göndermek.
5. cozucu fonksiyonunun bize geri döndürdüğü string değerini alıp şifreli değerin yerine koymak.
6. Çalıştırdığımızda hata vermemesi için programın tekrar çözücüye göndermesini engellemeliyiz dolayısıyla cozucu fonksiyonunu call ettiği yerde noplayacağız.
İzleyeceğimiz yol bu şekilde olacak arkadaşlar.
Hemen koda dökelim ;
İlk başta foreach ile module'ye attığımız dosyanın typeları içersinde gezdik bunu yaparken aynı anda gezdiğimiz type'ın methodu içerisinde gezdik ve hemen aşağısında method'un bütün kodları içerisinde dolaşarak ldstr' yi bulduğumuz anda cozucu fonksiyonumuza verdik. Eğer stringden sonra çağırılan fonksiyon cozucu ise nopladık ve Dosyamızı kayıt ettik.
Kullanılan Bütün Kodlar ;
https://paste.ubuntu.com/p/JGghpjxWrQ/
Teşekkürler ; @BackBox
Kullanılan Programlama Dili : C#
Kullanılan 3.Parti Yazılım : dnlib
Kullanılan CrackMe : https://www.turkhackteam.org/zararli-yazilim-analizi/1846699-crack-me-unpack-me.html
Yapacağımız ilk şey bir C# projesi oluşturup içerisine kullanacağımız kütüphaneyi dahil etmek.
Projemi WindowsForm olarak oluşturacağım siz isterseniz Console olarak da oluşturabilirsiniz.
Projemizi oluşturduktan sonra Proje > Nuget Paketlerini Yönet... kombinasyonunu uygulayarak dnlib 'i yükleyelim.
Bu işlemleri sırası ile yaptıktan sonra formumun görünümü düzeltiyorum.
1 TextBox ve 1 Button yeterli.
DEĞİŞKENLER VE FONKSİYONLAR
Bu kısımda tane tane yaptığı her şeyi ayrıntılarıyla anlatmaya çalışacağım anlamadığınız bir kısım olursa sorabilirsiniz.
Bu kütüphaneleri programımıza ekliyoruz.
Kod:
using dnlib.DotNet;
using dnlib.DotNet.Emit;[SIZE=3][COLOR=white]
[/COLOR][/SIZE]
Form olayının çalıştığı yerin hemen altına ModuleDefMD türünde bir module değişkeni tanımlıyoruz. Burası bizim yüklediğimiz dosyayı tutacak.
Daha sonra public **** olarak bir event tanımlayalım. Ben adını TODO yapacağım.
Buttonumuzun üstüne iki kere tıklayarak Button1_Click eventimize girelim.
İlk başta bir OpenFileDialog tanımladık ve onu sadece exe dosyaları seçebilmesi için filtreledik ve eğer OK tuşuna basılırsa devreye girecek olayları if bloğu içerisine yazdık.
Dikkat ! : Bunları yazarken try catch bloğunu kullandık çünkü herhangi bir hata çıktığında kullanıcıyı bilgilendirmemiz gerekiyor.
1. if bloğu içerisine module adıyla atadığımız değişkene OpenFileDialog'da seçtiğimiz dosyanın atılmasını söyledik.
2. Seçilen dosyanın yolunu textBox1 ' te attık.
3. Asıl işleri yapacak fonksiyonumuzu çalıştırdık.
4.Catch içerisine çıkan hatayı bir messageBox ' da göstermesini isteyerek kullanıcıyı bilgilendirdik.
~ DECRYPTOR ~
Programımızı dnSpy üzerinde açalım ve stringlerin durumuna bir bakalım.
Ve durum beklediğimiz gibi InitializeComponent'e kadar bütün stringlerin decompiler üzerinden okuması zorlaştırılmış.
İşte string çözücüde kullanacağımız fonksiyon karşımızda.Önceki resimlere bakarsanız istenilen stringlerin buradan çağırıldığını göreceksiniz. Dolayısıyla bizim de kullanacağımız fonksiyon bu olacak. Bunu kopyalayıp projemize atalım.
.NET Programlarda bütün string değerler Ldstr OpCode'una sahiptir.
Dolayısıyla yapmamız gerekenler ;
1. Type'lar içerisinde dolaşmak ;
Burada gördüklerinize type deniliyor.
2.Type'ların içerdiği methodların içerisinde dolaşmak ;
Burada gördüğünüz turuncu renkliler methodlardır.
3.Böyle biz dolaşıyoruz hepsinde iyi hoş ancak strings dediğimizde hepsini çekecek programın işine yarayan resources stringini , settings stringini vs. onu engellemek lazım.
4.Bir döngü ile method içerisinde bulunan ldstr opcode'una sahip bütün değerleri çekip "cozucu" fonksiyonuna göndermek.
5. cozucu fonksiyonunun bize geri döndürdüğü string değerini alıp şifreli değerin yerine koymak.
6. Çalıştırdığımızda hata vermemesi için programın tekrar çözücüye göndermesini engellemeliyiz dolayısıyla cozucu fonksiyonunu call ettiği yerde noplayacağız.
İzleyeceğimiz yol bu şekilde olacak arkadaşlar.
Hemen koda dökelim ;
İlk başta foreach ile module'ye attığımız dosyanın typeları içersinde gezdik bunu yaparken aynı anda gezdiğimiz type'ın methodu içerisinde gezdik ve hemen aşağısında method'un bütün kodları içerisinde dolaşarak ldstr' yi bulduğumuz anda cozucu fonksiyonumuza verdik. Eğer stringden sonra çağırılan fonksiyon cozucu ise nopladık ve Dosyamızı kayıt ettik.
Kullanılan Bütün Kodlar ;
https://paste.ubuntu.com/p/JGghpjxWrQ/
Teşekkürler ; @BackBox
Son düzenleme: