.NET Deobfuscating //Ar-Ge Kulübü

Gbmdpof

Kıdemli Üye
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.

U91FLi.png

Ben programın kodlarını incelemek için ILSpy programını kullanacağım. Programın kodlarını ILSpy ile okumaya çalışalım.

w3UKQw.png

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.

27Mlw9.png

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;

yC0pbH.png

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);

8x6OSi.png

Eğer obfuscator bulunduysa DetectInternal fonksiyondaki val değerini 100 arttıracak kodu yazalım.

Kod:
if (stringDecrypter.Detected)
    val += 100;

Ta3p5L.png

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:

copare-opcodes.png

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));
}

PmDEjf.png

Ş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.

wscr8E.png

Şimdi, dosyamızı de4dot ile deobfuscate edelim bakalım stringler düzelecek mi?

osD4Zz.png

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.

osD4Zz.png

Bu bulduğumuz şifreyi programa yazalım. Görüyoruz ki kabul etti.

HMrfC0.png

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:

Altıok

Kıdemli Üye
31 Mar 2013
2,236
2
Ar-Ge adı altında görmekten memnun olduğum işler bunlar işte...
Eline sağlık. :)
 

BackBox

Katılımcı Üye
3 Tem 2007
940
2
Kartepe
Bir ara crack.me paylaşımı çok oluyordu hepsi okulların açılması ile dağıldı ortalık instagramcılara kalmıştı böyle güzel konular görmek gerçekten sevindirici...Eline Emeğine Sağlık...
 
Üst

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.