C#: Hadi Excel şifre kırıcı yapalım...

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
390
Ankara
Heçkırların en çok kullandığı algoritmalardan biri de "brute force", yani kaba kuvvet algoritmalarıdır.

Brute force'un temel mantığı, bilinmeyen bir kodun muhtemel bütün kombinasyonların denenerek bulunmasıdır. Yapılması epey basit programlardır, ama gene de programlama mantığı konusunda güzel örnekler sayılabilirler.

Şifrenin gerek kompleksliği, gerekse uzunluğu arttıkça brute force için gereken süre geometrik olarak arttığından ne yazık ki genelde işe yaramazlar ama, forumdaki bir arkadaşın paylaştığı excel dosyasını gene de kırmayı deneyelim.

Öncelikle Visual Studio'da yeni bir konsol applikasyonu açalım.

.... Sonra uploads.im sitesinin bozulduğunu, artık otomatik resim upload ettirmediğini öğrenelim, bir saat arayıp kek.gg sitesini bulalım, resim kesicimizi düzeltelim...

Ahem! Ne diyorduk... Bir excel dosyasını tekrar tekrar açmaya çalışmanın en kolay yolu interoplardır. Bundan dolayı projemize Excel interopunu yükleyeceğiz. Interoplar, başka sistemlerle çalışmak için bazı applikasyonlarda açılmış kapılardır. Mesela excel'in interopunu kullanarak bir çok dilde Excel programını arkaplanda açıp istediğimiz işlemleri yapabiliriz.

Önce proje adının üstünde sağ tıklayıp, "Add Reference" seçeneğini seçelim.

4Hxm7K.jpg

Soldaki listeden Assemblies'i seçelim. Çünkü Excel interop'u .NET uyumlu bir assembly'dir. Ardından sağ üstteki arama kısmına "excel" yazıp, interop dll'lerinden birini seçelim. Gereken diğer referansları otomatik olarak ekleyecektir.

58N9bw.jpg

Başka bir şeye ihtiyacımız yok.. Şimdi mantığı kurmaya başlayalım.

Bir algoritma kurarken, örneği sadeleştirmek her zaman için iyidir. Mesela diyelim ki sadece a, b ve c karakterlerinden oluşan bütün şifreleri yazmak istiyoruz. Nasıl yazarız?

a
b
c
....

Sonra? Bir karakter daha ekleriz.

aa
ab
ac

... Sonra da aynen sayılarda olduğu gibi, soldaki basamağı bir artırırız.

ba
bb
bc
ca
cb
cc
aaa

Bu mantığı aynen kullanan bir class yazarsak, şifrelerin değişimini çok hızlı bir şekilde hesaplayabiliriz. Ve HIZLI bir şekilde şifre kırmak istiyoruz.

Benim zaten bir class'ım var bu işler için ama, sizinle beraber yenisini yazacağım.

Proje üstünde sağ tıklayalım, yeni bir öğe ekleyelim...

5R_PvV.jpg

Ekleyeceğimiz şey bir Visual C# elemanı, bir "class"...

3P5bp9.jpg

Ekle tuşuna basmadan aşağından ismini "SifreKarakteri" yapıverin tabii.. Resimde göstermeyi unuttum.

Kod:
class SifreKarakteri
{
[color="red"]    //Önce bütün kullanacağımız karakterleri, "const" yani sabit bir değer olarak tanımlayalım. Bu değer[/color]
[color="red"]    //programın çalışması esnasında değişmeyecektir.[/color]
    private const string karakterler = "qwertyuıopğüasdfghjklşizxcvbnmöçQWERTYUIOPĞÜASDFGHJKLŞİZXCVBNMÖÇ1234567890";
[color="red"]    //Bütün karakterler "karakterler" string'i içinde ilk değerden başlayacak, sonra yavaş yavaş ilerleyecekler.[/color]
    private byte degeri=0;
[color="red"]    //Başta bu değer "null" olsa da, şifremiz ilerledikçe, kendinden sonraki karakterin ne olduğunu da hatırlamalılar.[/color]
    private SifreKarakteri sonrakiKarakter;
[color="red"]    //String değeri olarak şifremizi istememiz gerekecek.[/color]
[color="red"]    //Standart "ToString()" metodunu override ediyoruz, yani onun yerine kendi özel fonksiyonumuzu yazıyoruz.[/color]
    public override string ToString()
    {
[color="red"]        //?? operatörünü bilmeyenler için; bu operatör soldaki değer NULL ise, sağdaki değeri verir.[/color]
[color="red"]        //Yani sonrakiKarakter boş ise, boş string ile işlem yapıyoruz.[/color]
[color="red"]        //Neden (object) yazıp sonrakiKarakter'i objeye dönüştürdük? Çünkü bilgisayarın kafası karıştı,[/color]
[color="red"]        //"Ne yani SifreKarakteri türünden bir eleman ile boş string aynı türden mi?" dedi.[/color]
[color="red"]        //Biz de dedik ki; "biz sonucu 'object' olarak istiyoruz. Salla gitsin."[/color]
[color="red"]        //Son olarak da bu değere, en son karakterimiz hangi değer ise karakterler arasından seçip onu ekledik.[/color]
        return ((object)sonrakiKarakter??"").ToString() + karakterler[degeri];
    }
[color="red"]    //Bir sonraki şifreyi isteme fonksiyonumuz son fonksiyonumuz olacak...[/color]
    public vo id sonrakiSifreyeGit()
    {
[color="red"]        //Değerini artıralım.[/color]
        degeri++;
[color="red"]        //Eğer bütün karakterleri geçmişsek...[/color]
        if (degeri == karakterler.Length)
        {
[color="red"]            //Öncelikle bu basamak en baştaki değere geri dönmeli...[/color]
            degeri = 0;
[color="red"]            //Sonra da sonraki basamak yoksa oluşturulmalı, varsa ilerletmeli.[/color]
            if (sonrakiKarakter == null) sonrakiKarakter = new SifreKarakteri(); else sonrakiKarakter.sonrakiSifreyeGit();
        }
    }
}

Süper zeki forum filtremiz "vo id" anahtar kelimesini "****" yapıyor, ondan dolayı onu boşluk ile yazıyorum, anlarsınız onu artık.

Süper, şimdi şifre oluşturucu bir class'ımız var. Ana fonksiyonu yazalım...

Kod:
class Program
{
[color="red"]    //Şifrenin bulunduğunu bütün diğer thread'lere bildirmemiz lazım değil mi?[/color]
[color="red"]    //Bu değişkenimiz "volatile".. Yani bilgisayara "önüne gelen thread değiştirebilir[/color]
[color="red"]    //bunu, ona göre önlemi sen al, ben almayacağım" diyoruz.[/color]
    private static volatile bool sifreBulundu = false;
[color="red"]    //İlk şifre karakterimizi oluşturmuş oluyoruz. Böylece ilk şifremiz de oluşuyor. "q"...[/color]
    private static SifreKarakteri sifremiz = new SifreKarakteri();
    static vo id Main(string[] args)
    {
[color="red"]        // 20 kez...[/color]
        for (int i = 0; i < 20; i++)
        {
[color="red"]            //Yeni bir thread oluştur, bu thread "sifreKir" fonksiyonunu çalıştırsın.[/color]
            System.Threading.Thread thread = new System.Threading.Thread(sifreKir);
[color="red"]            //Bu thread Single Thread Apartment Model üstünden çalışacak.[/color]
[color="red"]            //O ne demek?[/color]
[color="red"]            //Yani modası geçmiş COM objelerinin sadece tek thread üstünde çalışabildiği[/color]
[color="red"]            //zamanlarda olduğu gibi, bilgisayar bu thread için hafızada sabit, değişmez[/color]
[color="red"]            //bir alan atayacak.[/color]
[color="red"]            //Bunu yapmak zorundayız. Excel applikasyonu bir GUI'dir, yani grafiksel[/color]
[color="red"]            //kullanıcı arayüzüdür. Bütün grafiksel kullanıcı arayüzleri STAThread[/color]
[color="red"]            //üstünden çalışır, çünkü windows onlardan değişmez bir "handle" ister.[/color]
[color="red"]            //Bazı windows kütüphanelerinin istediği HWND değerleri diğer thread türü[/color]
[color="red"]            //olan MTA - Multi Thread Apartment Model - çok threadli apartman modeli[/color]
[color="red"]            //için oluşturulmaz.[/color]
            thread.SetApartmentState(System.Threading.ApartmentState.STA);
[color="red"]            //Çok konuştuk başlasın işlem....[/color]
            thread.Start();
        }
    }
    private static vo id sifreKir()
    {
[color="red"]        //Önce bu thread'e özel bir Excel Applikasyonu açalım.[/color]
        Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
        Microsoft.Office.Interop.Excel.Workbook book;
[color="red"]        //Görünmez olsun bu applikasyon.[/color]
        app.Visible = false;
[color="red"]        //Bize uyarı muyarı da göstermesin...[/color]
        app.DisplayAlerts = false;
[color="red"]        //Şimdi şifremizi, başka thread'ler değiştirmeden alıp, sonra hemen biz ilerletelim.[/color]
        string suankiSifre;
[color="red"]        //Doğru şifreyi bulmadıkça denemeye devam etmek için sonsuz döngüye giriyoruz.[/color]
        while (true)
        {
[color="red"]            //"Şifremize başka thread ben kullanırken dokunamasın, onu kilitle"[/color]
[color="red"]            //diyoruz.. Yani "lock" ediyoruz.[/color]
            lock (sifremiz)
            {
[color="red"]                //Lokal bir değişkene aktardık...[/color]
                suankiSifre = sifremiz.ToString();
[color="red"]                //Sonra şifreyi ilerlettik ve kilitten çıktık.[/color]
                sifremiz.sonrakiSifreyeGit();
            }
[color="red"]            //Hata bloğu açıyoruz. Şifre yanlış ise, COM objesi hata verecek. O zaman sonrakini deneyeceğiz.[/color]
            try
            {
[color="red"]                //Workbook'u açmaya çalışıyoruz. İlk parametre dosya adı, 2. parametre excel kitabı içindeki[/color]
[color="red"]                //linklerin yenilenip yenilenmeyeceği, 3. dosyayı sadece okunur şekilde açıp açmayacağımız,[/color]
[color="red"]                //5. parametre de şifredir.[/color]
[color="red"]                //Aradaki 4. parametre yerine Type.Missing, yani "girilmemiş değer" olarak algılanan sabit[/color]
[color="red"]                //değeri giriyoruz. Bizi ilgilendirmiyor, formatı kendi bulsun.[/color]
                book = app.Workbooks.Open("d:\\deneme.xlsx", false,true, Type.Missing, suankiSifre);
[color="red"]                //Buraya geldiysek hata gelmedi! Şifremiz doğru! Önce bulduğumuzu belirtelim.[/color]
                sifreBulundu = true;
[color="red"]                //Sonra şifreyi ekrana yazalım..[/color]
                Console.WriteLine("Şifre: " + suankiSifre);
[color="red"]                //Sonra da kullanıcının enter'a basmasını bekleyelim.[/color]
                Console.ReadLine();
[color="red"]                //Sonra da excel'i kapatıp bu thread'den çıkalım.[/color]
                app.Quit();
                return;
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
            }
[color="red"]            //Acaba şifreyi başkası buldu mu?[/color]
            if (sifreBulundu)
            {
[color="red"]                //Diğer thread şifreyi bulmuş, bizdeki gereksiz excel'i kapatalım.[/color]
                app.Quit();
[color="red"]                //.... sonra da çıkalım bu thread'den.[/color]
                return;
            }
[color="red"]            //Yok bulunmadı ise denediği şifreyi yazsın...[/color]
            Console.WriteLine(suankiSifre + " denendi...");
        }
    }
}

İşte bu kadar... Ne yazık ki, düşündüğümden çok daha yavaş çalışıyor.. Ama yine de son çare olursa, kullanılır...

Tabii bunu denedikten sonra, görev yöneticisinde ayrıntılar sekmesine gelip, görünmez 20 tane excel.exe'yi kapatmayı unutmayın :D
 
Son düzenleme:

l4xx0rz

Katılımcı Üye
30 Eyl 2017
430
0
Yalova
Ellerinize sağlık üstadım hazır boş vakit varken bende sizinle beraber ilerliyeyim.
 

Socialmm

Katılımcı Üye
8 Ocak 2017
854
1
zztri hocam size ulaşacak bi yer olmayınca ufak b konu içinde konu açmak istemeyince size burdan ulaşmak durumunda kaldım

ben c# de bruteforce kodluyorum ama sorunum brute force ile ilgili değil bi sitedeki captchada açık var mesela sitedeki captcahyı 1 kere çözüp sayfayı yenilemeden verileri istediğimiz kadar çok gönderebiliyoruz bende ilk açıldığında kullanıcı 1 captchayı doldurucak ve progamı başlatacak bişey kodlayayım dedim ancak şöyle ki xnet get kullanarak captchanın adresinden veriyi aldığımda resimin kodları geliyor ����JFIF` şeklinde ben bu kod kısmını picturebox gibi bişeyde nasıl resim olarak gösterebilirim acaba bayağı araştırdım yapmaya çalıştım ama beceremedim..
 

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
390
Ankara
zztri hocam size ulaşacak bi yer olmayınca ufak b konu içinde konu açmak istemeyince size burdan ulaşmak durumunda kaldım

ben c# de bruteforce kodluyorum ama sorunum brute force ile ilgili değil bi sitedeki captchada açık var mesela sitedeki captcahyı 1 kere çözüp sayfayı yenilemeden verileri istediğimiz kadar çok gönderebiliyoruz bende ilk açıldığında kullanıcı 1 captchayı doldurucak ve progamı başlatacak bişey kodlayayım dedim ancak şöyle ki xnet get kullanarak captchanın adresinden veriyi aldığımda resimin kodları geliyor ����JFIF` şeklinde ben bu kod kısmını picturebox gibi bişeyde nasıl resim olarak gösterebilirim acaba bayağı araştırdım yapmaya çalıştım ama beceremedim..

System.Net.WebClient oluştur bir tane, DownloadFile de, direkt olarak resim dosyası olarak download et. Veya System.IO.MemoryStream içine koy, sonra bu stream'den System.Drawing.Bitmap oluştur.
 

Socialmm

Katılımcı Üye
8 Ocak 2017
854
1
System.Net.WebClient oluştur bir tane, DownloadFile de, direkt olarak resim dosyası olarak download et. Veya System.IO.MemoryStream içine koy, sonra bu stream'den System.Drawing.Bitmap oluştur.

bende oyle dusundum ama cookie yi xnete aktarmam lagzim ayni cookie ustunden calismalilar ki captchada farklilik olmasin
 

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
390
Ankara
WebClient'a cookiecontainer koyabilirsin.

Aha bunun için konu yazayım ben...
 

gharmori

Uzman üye
6 Kas 2011
1,950
1
Andromeda G.
search.nasa.gov'u istediğimde çökertebiliyorum zaten...

Hay hay, bir ara 3-4 kişi birleşirsek nasa.gov'un kendisini çökertelim. Ama bana zaman verin, Türkiye'ye yeni geldim sayılır.

Slowloris?
Ben de o sayfaya dalıyorum ama sayfa kendisi hata sayfası çıkarıyor yani 5xx internal error alamıyorum nerden anlayabiliriz çökerttiğimizi
 
Ü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.