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

Gbmdpof

Kıdemli Üye
23 Eyl 2016
2,001
11
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.

Son satırı bu isteğin geleceğini bildiğimden yazdım. Ben sadece PhoenixProtector ekledim, yani pek bir değişiklik yapmadım. İsterseniz internetten içine çoğu public obfuscator eklenmiş moded versiyonlarını bulabilirsiniz.
 

revanch

Yeni üye
4 Eki 2019
4
1
Çok Başarılı ama kral böyle bi karışık konuyu video üzerinde göstersen anlaşılır olabilirdi sonuç hariç hiçbişey anlamadım
 

tuna3858

Yeni üye
5 Ağu 2022
6
1
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..
 

ERSSE

Katılımcı Üye
6 Kas 2019
465
138
Street
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.

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;

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.
Ellerinize sağlık hocam
 

Blwe

Uzman üye
17 Şub 2021
1,585
1,645
Green/Moderasyon
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..
Taa 2017'ye gidip nasıl bu konuyu buldunuz acaba çok merak ediyorum..
Lütfen eski mesajlara gidip mesaj kasmaya çalışmayınız.
2017'den gönderilen bir gönderide ki tool çalışmıyorsa illa ki vardır bir sebebi dimi ?
Lütfen yardım istemeden önce biraz düşününüz. İyi forumlar.
 

tuna3858

Yeni üye
5 Ağu 2022
6
1
Blwe Bey,
1) Taaaa 2017'ye gidip bakmadım. Google "Obfuscator de4dot" yazıp Yalnızca Türkçe sayfaları getir" şeklinde filitre yaparsanız ikinci sırada çıkıyorsunuz.
2) Ben size tool çalışmıyor demedim. Resimler için referans verdiğiniz link açılmıyor dedim.
3) Size "Üstad" diye hitap ederek, "yardımıcı olabilir misiniz", "teşekkürler", "saygılar" şeklinde kelimeler kullanarak yazdım.
4) Bilgisayar yüksek mühendisiyim. İki fakülte ve bir yüksek lisans bitirdim. Toplamda 10 yıllık bir yüksek eğitimim var.
Bu şekildeki yaklaşımınızı size hiç yakıştıramadım: Kasmak, düşünmek kelimeleri..
Sizden yardım istemiyorum, sizden yardım istediğim için de pişman ettiniz.
İyi çalışmalar dilerim.
 
Ü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.