- 23 Eyl 2016
- 2,001
- 11
Merhabalar. 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.
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.
https://github.com/0xd4d/de4dot
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.
Ş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.
Obfuscator aramak için aşağıya inip ScanForObfuscator fonksiyonunu bulalım. Burada string decypter'ımızı ekleyip, şifrelenmiş string arayacağız.
Eğer obfuscator bulunduysa DetectInternal fonksiyondaki val değerini 100 arttıracak kodu yazalım.
Stringleri ve PhoenixProtector'ın string decrypter methodunu bulmak StringDecrypter sınıfındaki Find fonksiyonunu bulalım ve bu kodları yazalım:
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.
Ş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ı.
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.
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ı.
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.
Burada stringDecrypt methodunu listeye ekledik.
Bir de DeobfuscateBegin fonksiyonuna bu kodları ekleyelim.
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.
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.
https://github.com/0xd4d/de4dot
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.
Moderatör tarafında düzenlendi: