Bunu program haline getirip verseniz tadından yenmez.
...
Bu konu bu kadardı. Eğer ben bunlarla uğraşamam diyorsanız Google'a de4dot moded yazıp modlanmış de4dot'lardan birini indirebilirsiniz.
Ellerinize sağlık hocamMerhabalar. Daha önce Hacknology bir konusunda decompiling ile programın kodlarını bulmayı göstermişti. Fakat bazen hatta çoğunlukla programların kodları şifrelenmiş oluyor. Bu gibi durumlarda programı deobfuscate etmemiz, yani yapılan obfuscate işlemini geri almamız gerekiyor. Bunun için de4dot aracını kullanacağız.
Ben basit bir CrackMe uygulaması yaptım ve bunu Phoenix Protector ile şifreledim.
Ben programın kodlarını incelemek için ILSpy programını kullanacağım. Programın kodlarını ILSpy ile okumaya çalışalım.
Gördüğünüz gibi program kodları şifrelenmiş, stringler okunmuyor ve namespace, değişken vs. adları da değiştirilmiş.
Bunu önce de4dot ile deobfuscate etmeye çalışalım.
Kod:Detected Unknown Obfuscator (C:\Users\***\Desktop\Protected\CanYouCrackMe.exe) Cleaning C:\Users\***\Desktop\Protected\CanYouCrackMe.exe Renaming all obfuscated symbols Saving C:\Users\***\Desktop\Protected\CanYouCrackMe-cleaned.exe
Obfuscator, de4dot tarafından bulunamamış ama en azından değişken, namespace vs. adları daha okunabilir bir hale geldi ve bu yüzden kodları biraz daha rahat okuyabileceğiz.
Hala programın kodları istediğimiz halde olmadığına göre de4dot'a kendimiz ekleyelim bu obfuscatoru.
Öncelikle GitHub üzerinden de4dot kaynak kodlarını indirelim.
GitHub - de4dot/de4dot: .NET deobfuscator and unpacker.
de4dot.code/deobfuscators kısmına girip PhoenixProtector adında bir klasör oluşturalım ve burada Deobfuscator.cs sınıfını oluşturalım.
Önce buraya taban dosyasını yapıştıralım, sonra eklemeleri onun üstüne yaparız.
Eğer farklı bir obfuscator ekleyecekseniz obfuscator adını değiştirmeyi unutmayın.
de4dot.cui/Program.cs dosyasına PhoenixProtector'ı ekleyelim.
Kod:new de4dot.code.deobfuscators.PhoenixProtector.DeobfuscatorInfo()
Şimdi kodumuza geri dönelim. Gördüğümüz gibi stringler şifrelenmiş. O yüzden bir StringDecrypter sınıfı oluşturup içine taban dosyamızı yapıştıralım. Eklemeleri onun üstüne yapacağız.
[url=http://www.mediafire.com/file/3xb15yuabc1o73a/String+Decrpt+Base.txt]String Decrpt Base
Bunlarda kodları kopyala yapıştır yapmıyoruz. Sadece şablonu kopyala yapıştır yapıyoruz. Siz isterseniz elle yazabilirsiniz.
Deobfuscator.cs sınıfına geri dönelim.
String Decrypter'ımızı tanımlayalım.
Kod:StringDecrypter stringDecrypter;
Obfuscator aramak için aşağıya inip ScanForObfuscator fonksiyonunu bulalım. Burada string decypter'ımızı ekleyip, şifrelenmiş string arayacağız.
Kod:stringDecrypter = new StringDecrypter(module); stringDecrypter.Find(DeobfuscatedFile);
Eğer obfuscator bulunduysa DetectInternal fonksiyondaki val değerini 100 arttıracak kodu yazalım.
Kod:if (stringDecrypter.Detected) val += 100;
Stringleri ve PhoenixProtector'ın string decrypter methodunu bulmak StringDecrypter sınıfındaki Find fonksiyonunu bulalım ve bu kodları yazalım:
Kod:foreach (var type in module.GetTypes()) //Tüm Type'ları alalım { foreach (var method in DotNetUtils.FindMethods(type.Methods, "System.String", new string[] { "System.String" })) //String'leri bulalım. { if (method.Body.HasExceptionHandlers) continue; if (DotNetUtils.GetMethodCalls(method, "System.String System.String::Intern(System.String)") != 1) continue; simpleDeobfuscator.Deobfuscate(method); //Gereksiz kodları ve eklenmişse bazı Anti-MSIL kodlarını kaldıralım var instrs = method.Body.Instructions; for (int i = 0; i < instrs.Count - 1; i++) //O anki Methoddaki tüm Instruction'lara bakalım { if (!instrs[i].IsLdarg() || instrs[i].GetParameterIndex() != 0) //IL kodunu StringDecrypter fonksiyonu IL koduyla karşılaştıralım continue; if (instrs[i + 1].OpCode.Code != Code.Callvirt) continue; if (!instrs[i + 2].IsStloc()) continue; if (!instrs[i + 3].IsLdloc()) continue; if (instrs[i + 4].OpCode.Code != Code.Newarr) continue; if (!instrs[i + 5].IsStloc()) continue; if (!instrs[i + 6].IsLdcI4()) continue; if (!instrs[i + 7].IsStloc()) continue; if (instrs[i + 8].OpCode.Code != Code.Br_S) continue; if (!instrs[i + 9].IsLdarg()) continue; if (!instrs[i + 10].IsLdloc()) continue; if (instrs[i + 11].OpCode.Code != Code.Callvirt) continue; stringDecrypterType = type; //Kaldıracağımız gereksiz Type'ı ekleyelim stringDecrypterMethod = method; //Diğer stringleri decrypt eden ve kaldıracağımız String Decrypt methodunu ekleyelim break; } } }
Bu kodun yaptığı şey basitçe tüm methodları tarayıp string'i decrypt eden method ile aynı IL koduna sahip methodu bulduğunda obfuscation methodu bulunduğunu bildirmektir.
Anlamadıysanız şu şekilde göstereyim:
Bulunan stringleri decrypt etmek için ILSpy ile String Decrypter fonksiyonunu alalım ve StringDecrypter sınıfına ekleyelim.
Kod:public static string Decrypter(string CryptedString) { int length = CryptedString.Length; char[] array = new char[length]; for (int i = 0; i < array.Length; i++) { char c = CryptedString[i]; byte b = (byte)((int)c ^ length - i); byte b2 = (byte)((int)(c >> 8) ^ i); array[i] = (char)((int)b2 << 8 | (int)b); } return string.Intern(new string(array)); }
Şimdi, şifrelenmiş dosyamızı editlemiş olduğumuz de4dot'a sürükleyelim ve bakalım obfuscator bulunabilecek mi.
Evet, buldu fakat ben Obfuscator Name kısmını değiştirmeyi unutmuşum. Hemen PhoenixProtector yapalım orayı.
Kod:Detected PhoenixProtector (C:\Users\***\Desktop\Protected\CanYouCrackMe.exe) Cleaning C:\Users\***\Desktop\Protected\CanYouCrackMe.exe Renaming all obfuscated symbols Saving C:\Users\***\Desktop\Protected\CanYouCrackMe-cleaned.exe
Gördüğünüz gibi buldu ama hala Stringleri decrypt etmedik. Tekrar Obfuscator.cs'e geri dönelim ve DeobfuscateBegin fonksiyonunu bulalım. Buraya String'i decrypt eden fonksiyonu ve yukarıda bahsettiğim decrypt yapan ve artık ihtiyacımız olmayan methodu ekleyeceğiz.
Kod:staticStringInliner.Add(stringDecrypter.Method, (method, gim, args) => stringDecrypter.Decrypt((string)args[0]));
Bu fonksiyon Decryption methoduna yapılan tüm çağrıları bulup stringleri decrypt eder.
Şimdi, dosyamızı de4dot ile deobfuscate edelim bakalım stringler düzelecek mi?
Düzeldi, fakat hala decrypt methodu duruyor. Onu da kaldıralım. Bunun için DeobfuscateEnd kısmına aşağıdaki kodları ekleyelim. Type'ımız stringDecrypter sınıfında, kaldırma sebebi de gereksiz olması.
Kod:if (CanRemoveStringDecrypterType) AddTypeToBeRemoved(stringDecrypter.Type, "Unnecessary string decrypter");
Evet, tekrar deniyoruz ve görüyoruz ki o da kalkmış.
Bu sürecin loglarını daha detaylı eklemek için birkaç kod daha ekleyelim. Önce GetStringDecrypterMethods fonksiyonuna aşağıdaki kodu yazalım.
Kod:var list = new List<int>(); if (stringDecrypter.Method != null) list.Add(stringDecrypter.Method.MDToken.ToInt32()); return list;
Burada stringDecrypt methodunu listeye ekledik.
Bir de DeobfuscateBegin fonksiyonuna bu kodları ekleyelim.
Kod:DeobfuscatedFile.StringDecryptersAdded();
Evet, şimdi ILSpy ile decompile edelim ve CrackMe'nin şifresini bulalım.
Bu bulduğumuz şifreyi programa yazalım. Görüyoruz ki kabul etti.
Bu konu bu kadardı. Eğer ben bunlarla uğraşamam diyorsanız Google'a de4dot moded yazıp modlanmış de4dot'lardan birini indirebilirsiniz.
Taa 2017'ye gidip nasıl bu konuyu buldunuz acaba çok merak ediyorum..Elinize sağlık, çok güzel olmuş.
https://tik.lat/LQQPh/url linki açılmıyor. Linkleri yenileyebilir misiniz? (Teşekkürler)
Üstad, die uygulaması ile bir exe dosyasını incelediğimde,
PE32
Protector: Eziriz .NET Reactor(6.x.x.x)[By Dr.FarFar]
Library: .NET(v2.0.50727)[-]
Linker: Microsoft Linker(8.0)[GUI32]
Bu protectoru kaldıramıyorum. Yardımcı olabilir misin? İki haftadır uğraşıyorum, maalesef çözüm bulamadım.
Yardımlarınız için şimdiden çok teşekkür ederim. Saygılar..
Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.