Bozulan Harddiskim ve uçan 20 senelik çalışmalarım

Pek çoğumuz kaybedene kadar harddiskimizde ne kadar önemli şeyler olduğunun farkına varmayız. Tabi ben muhteşem bir kişilik olduğum için zatı şahanelerimin yıllardır edindiği deneyimden dolayı düzenli backup almaktaydım. İster inanın ister inanmayın aşağıdaki hikaye diskimdeki dosyaları nasıl geri aldığımın sadece kısa bir özetidir. Muhtelif argeler dahil toplam 2 aya yakın sürmüştür.

Backup için yazdığım scripti bir üyenin sorusuna cevap olarak da yapıştırmıştım.
http://www.tahribat.com/Forum-Backup-Senkronizasyon-Programi-Tavsiyesi-182100/2/
Bok varmış gibi bu kadar diskte bugüne kadar hiçbir kayıp yaşamadığım halde en güvendiğim disk bozuldu

En önemli datalarımı, eski fotoğraf albumlerimi hatta (abartmıyorum) ilkokulda basic ile başladığım günden beri yazdığım 20 senelik tüm kodlarımı çok güvenerek aldığım 600 TL civarı verdiğim en yeni Seagate SV35 - 3TB (Bu marka modeli özellikle yazıyorum ki kullanıyorsanız hemen yokedin) diskimde saklamaktaydım. Raid sistemleri tercih etmiyordum çünkü onların da kendine özgü riskleri var.

Bir gece download yapmakta olan PCden gelen tuhaf seslerle uyandım. Gözüm gibi baktığım diskimden sesler gelmekteydi. Hemen aleti restart ettim. Diskten gelen ses kesilmişti fakat PC, diski görmüyordu.

Panik yapmadım tabi bad sector falan vardır yada undelete ederim bi kayıp varsa diye düşündüm. Hiçbir recovery programı çalışmadı. Ben de kısa bir c koduyla diski raw okumayı denedim. diskte hiçbir şekilde okuma yapılmıyordu, sorun donanımsaldı. Alete poweri verince 10 kere spinup yapmaya çalışıyor sonra birkaç click sesinin ardından kendini kapatıyordu.

Sorun hakkında daha iyi bilgi almak için harddiski hyper terminale bağlayıp sorunu daha iyi anlamaya çalıştım. Alet 10 kere spinup yapmayı başaramayınca pes ediyor kapanıyordu fakat daha fazla bilgi alabilmek için terminalden komut girebileceğim aşamaya birtürlü gelmiyordu.

Panik yapmaya gerek yoktu çünkü 2 ay eski de olsa backuplarım vardı. Fakat çok önceden yazdığım backup scriptinde kullandığım passwordu unuttuğumu ve bu scriptin de diğer dosyalarım gibi arşivin içinde olduğundan içine bakıp şifreyi öğrenemeyeceğimi anladığımda iş tatsız bir hal almaya başladı. Şifremi unutmadığıma emindim fakat bir şekilde çalışmıyordu işte.

Güvenlik konusunda muhteşem deneyimlerim sayesinde 7za sıkıştırma yazılımını tercih etmiştim. Bu şeyin özelliği içinde AES-256 şifreleme algoritması olduğundan brute force ile kırılması olduukça güçtü. Bu sebeple kendi şifremi de brute force ile kırma ihtimalim yoktu. (Sanki hayatın sırrı vardı içinde aq bok vardı 7z kullandım)

Evet şimdi panik yapabilirdim fakat tasavvuf insanı olduğum için olağan üstü durumlarda olağanüstü çözümler tarafıma malum olunurdu, bu sebeple panik yapmaya gerek yoktu.

Seçeneklerimi tekrar gözden geçirdim.
İnsan-ı mukaddes olduğum için aynı zamanda sertifikalı solidworkscuydum. Hemen gereken tozsuz ortam glovebox'ımı modelleyip, bir arkadaşımdan öğrendiğim plexiglass kesimi yapan birinin telefonuna ulaştım.

Elleri sokmak için 10 cm çaplı iki boru kesiti buldum ve ölçüm yaptım. plexiglassları parça parça sipariş ettim ve yapıştırıcı malzeme olarak kullandığım kloroform ile evde monte ettim. İlk defa kullandığım bu malzemeden oldukça memnun kaldım fırça ile aralara kloroform sürdüğümde iki plastik adeta tek parça oluyor. montaj birkaç saatimi aldı. Aleti 200 küsür tlye malettim.

Aletin 3D Pdfine ulaşmak için tıklayınız
Hava geçirmeyecek şekilde kutuyu montajladıktan sonra sıra tozsuz hava üfleyecek mekanizmayı yapmaya geldi. Bunun için gezi parkı eylemlerinde kullandığım gaz maskemin uçlarını sökerek bunlara hava basan bir mekanizma oluşturdum. Bunu yaparken hava kaçmaması için bolca silikon kullandım ve kutuda önceden ayarladığım hava giriş deliğine oturttum.
 

 

Havanın içeride serbestçe dolaşabileceği uygun bir noktayı simulatorde hesaplayıp filtremi oraya yerleştirdim


Artık tozsuz hava üfleyen bir mekanizmam vardı. Fakat kutumun içindeki hava gerçekten dışarıdan daha tozsuzmuydu. Tozu nasıl ölçebilirdim diye düşünürken bana malum oldu. yüksek miliwattlı lazerim havada iz bırakıyordu. Lazerin havada bıraktığı iz elbetteki hava değil, havadaki toz zerreciklerinden yansıyan ışıktı.

o zaman lazeri saydam kutuma tutarsam kutuya kadar ışık görülmeli, içinde kaybolmalı ve dışarı çıkınca tekrar yeşil bir çizki halini almalıydı. Kutum (içine uzunca bir süre hava bastıktan sonra) bu testten geçti. Artık diski açmaya hazırdım. diskin kaymaması için kutunun içine bir adet kayma önleyici (araba için aldığım) mazemeden koydum ve aletin bozuk kafasını onarmak için sökmeye başladım.


Ve sonunda tasarımımı tamamlamıştım...

Ve ne göreyim, son birkaç sayfada okuduğunuz hiçbirşey işe yaramadı. Aletin kafa durupdururken bütün diski çizmişti. Özellikle en içteki sectorleri çizdiği için alet startup prosedurleri geçemiyordu. kahretsindi. mna koyimdi. Hem backup alıp hem şifreyi doğru hatırladığıma emin olup hem en son teknoloji harddiski alıp hemde tüm datamı kaybetmiş gibi görünüyordum. Bu diski fabrikasında bile kurtaramayacaklarını biliyordum. (Datanın bir bölümü raw olarak okunabilse de diskin en içteki sektorleri zarar gördüğünden dosya tablosu geri getirilemezdi) Tek çözüm 7z şifreli backupa geri dönmekti.

Fakat nereden başlayacaktım. Zaten bu şey brute force edilmesin diye baştan düşünüp ona göre arşivleyen bendim. Bundan sonraki 1 haftam Nvidia Geforce 770 ekran kartımda şifreyi brute forcelayarak geçti. Normal bir pc saniyede 4 deneme yaparken bu kart ile 1000 deneme yapabiliyordum.

Bu aletin bütün streamprocessorleri kullanılınca öyle bir çalışıyor ki odayı ısıtıyordu, yanmasın diye bunu çalıştırınca camları açıyordum.

Fakat saniyede 1000 deneme kullandığım şifreye yakın birşeyler denemek için hiç de yeterli değildi. Asla koymayacağım basit şifreleri denemeyi bitirmesini umutsuzluktan bir hafta denedikten sonra şifreli backupımla tekrar baş başaydım.

Sonraki haftasonumu bir textboxa azimle şifre girerek geçirdim. bu kadar uğraştan sonra 20 senelik datamı kaybetmeyiş olmayı kabullenmenin eşiğine gelmiştim, fakat kendimi tekrar toparladım. Dışarı çıkıp bir hava almadan önce 1 saat sonrasına outlookuma kendimle bir toplantı randevusu düştüm (tanıdığım bu işi cozebilecek en muhtesem kisi oldugum icin yada yavaş yavaş sıyırmaya başlamıştım bilmiorum). Toplantı saati geldiğinde kendime sordum. Niçin unutmadığımı düşündüğüm şifre çalışmamaktaydı. Şu cevapları aldım.

  1. 7z Formatı yüksek boyutlu arşivlerde bir şifreleme bugi ihtiva etmekteydi (El ile yüzlerce denemeden sonra bu en mantıklısı görünüyordu)
  2. ŞifŞifreyi tam hatırlamıyordum yada hatırladığımın bir modifikasyonunu uygulamıştım
  3. Backup scriptimde şifreyi yanlış yollayan bir hata olabilirdii
  4. Şifreyi yanlış tuşlamıştım
1. seçenekten başladım. Öncelikle open source olan 7z formatını biraz kurcaladım, başta bir encrypted header olduğunu, şifrenin son 40 byteda tutulduğunu öğrendim. yakalayabildiğim bariz bi hata yoktu. Sonra developerları buldum ve böyle birşeyle daha önce karşılaşıp karşılaşmadıklarını sordum ve bilgi aldım. Sağolsun çok yardımcı oldular fakat daha önceden bu problemin yaşanmadığını söylediler.

2. seçeneğe gelmiştim. bir c# projesi açıp iki tane text dosyasından birine hatırladığım şifreleri, ikincisine ise muhtemelen sonunda kullanmış olabileceğim !!!, 111, /*- gibi ek stringleri girdim ve bunları çeşitli case modifierlar ile çapraz denettim. Bir başka deyişle kendi şifre kullanım metodlarımı kırmayı hedefleyen custom bir hybrid attack metodu yazdım.

archivename = "Archive.7z";
        string exename = "7za.exe";

        bool usecache = true  ;
        object filewrt = new object();

        CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;

        private void button1_Click(object sender, EventArgs e)
        {
           
            string foundpass = "";
            int lim = 4;
            HashSet pretested = null;
            if (usecache) pretested = new HashSet(System.IO.File.ReadAllLines("pretested.txt"));
//7z şifresinin denenmesi çok uzun sürdüğünden denediklerimin bir kopyasını listede tutuyorum, böylece yeni şifreleri önceden deneyip denemediğime kolayca bu listeden baktırıyorum.
            string[] w1 = new string[] { "" };
            string[] w2 = new string[] { "" };


            TextInfo textInfo = cultureInfo.TextInfo;


                w1 = System.IO.File.ReadAllLines("password1.txt").Distinct().ToArray();
                w2 = System.IO.File.ReadAllLines("password2.txt").Distinct().ToArray();

            Parallel.For(0, w1.Length, i =>    //8 Corelu işlemcimde daha hızlı olsun diye paralel çalıştırdım
            {
             for (int j = 0; j < w2.Length; j++)
             {
                
                 for (int n = 0; n < lim; n++)
                 {
                     string pwd = "";
                     if (n == 0) pwd = w1[i] + w2[j];

                     else if (n == 1) pwd = w1[i] + w2[j] + w1[i] + w2[j];

                     else
                         if (n == 2) pwd = textInfo.ToTitleCase(w1[i] + w2[j]);
                         else
                             if (n == 3)
                                 pwd = w1[i];
                     Console.WriteLine(pwd);
                     if (pretested != null) if (pretested.Contains(pwd)) continue;

                     System.Threading.Thread.Sleep(2);
                     int exitcode = 0;
                     System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
                     psi.FileName = exename;
                     psi.Arguments = "x " + archivename + " -p" + pwd; // -mhe

                     psi.RedirectStandardOutput = true;
                     psi.RedirectStandardError = true;
                     psi.UseShellExecute = false;

                     Process process = System.Diagnostics.Process.Start(psi);
                     if (process.WaitForExit(5000))
                     {
                         string result = process.StandardOutput.ReadToEnd();
                         if (result == null)
                         {
                             MessageBox.Show("Result null:" + pwd);

                         }
                         else
                         {
                             Console.WriteLine("Result:" + pwd + ">>" + result.TrimEnd());
                             if (!result.EndsWith("Wrong password?\r\n\r\n"))
                             {
                                 MessageBox.Show("diffrent ending " + pwd);
                                 foundpass += pwd + ",";
                             }
                             else
                             {
                                 if (pretested != null) lock (filewrt)
                                     {
                                         pretested.Add(pwd);
                                         System.IO.File.AppendAllText("pretested.txt", pwd + "\r\n");
                                     }
                             }
                         }
                     }
                     else
                     {
                         foundpass += "wf:" + pwd + ",";
                     }

                     while (!process.HasExited)
                     {
                         System.Threading.Thread.Sleep(100);
                         //strOutput = strOutput + myProc.StandardError.ReadToEnd();
                     }
                     exitcode = process.ExitCode;
                     if (exitcode != 2)
                     {
                         MessageBox.Show(String.Format("Exitcode is :{0} for password {1}", exitcode, pwd));
                         Console.WriteLine(String.Format("Exitcode is :{0} for password {1}", exitcode, pwd));
                     }
                 }

             }

         }
             );
            Console.WriteLine("Finished.");
            if (!String.IsNullOrEmpty(foundpass)) Console.WriteLine(foundpass);
        }
Saatlerce denememin sonunda başarılı olduğumu söylemek isterdim fakat bu da bi boka yaramadı.

3. Seçeneği (Backup alan scriptimde bir hata olmasını) elemem fazla uzun sürmedi, HolyOne bugli kod yazmazdı... Kendi de bu konuda hemfikirdi zaten.

4. Seçeneğe gelmiştim. Durup düşündüm. Bir insan nasıl yanlış şifre girebilirdi? yanlış şifre nasıl girilir?

o zaman doğru şifreyi bulmak için yanlış şifreyi üretmeliyim dedim. ve yanlış şifre üreten bir program yazmaya koyuldum. Yanlış basılabilecek tuşların çeşitli olasılıkları ile bir listesini yaparak başladım. her satırdaki ilk harfin yanında çevresindeki karakterler olacak şekilde bir sözlük oluşturdum.

 
dic := TDictionary<char, string>.Create;
dic.Add('q','w21');
dic.Add('w','qes23');
dic.Add('e','wrd34');
dic.Add('r','etf45');
dic.Add('t','ryg56');
dic.Add('y','tu67h');
dic.Add('u','yıhj78');
dic.Add('ı','iou89k');
dic.Add('o','pı90l');
dic.Add('p','oğ0*ş');
dic.Add('ğ','pü*-i');
dic.Add('a','qwsz');
dic.Add('s','adwexz');
dic.Add('d','sferxc');
dic.Add('f','dgrtvc');
dic.Add('g','fhtybv');
dic.Add('h','gjyubn');
dic.Add('j','hkuınm');
dic.Add('k','jlıomö');
dic.Add('l','kşopöç');
dic.Add('ş','lipğç.');
dic.Add('i','ış,ğü.');
dic.Add('z','&lt;xas');
dic.Add('x','zcsd');
dic.Add('c','xvdf');
dic.Add('v','fgcb.');
dic.Add('b','vngh');
dic.Add('n','bmhj');
dic.Add('m','nöjk');
dic.Add('ö','mçkl');
dic.Add('ç','ö.lş.');
dic.Add('.','çş');
dic.Add('"','1');
dic.Add('2','13qw');
dic.Add('3','24we');
dic.Add('4','35er');
dic.Add('5','46rt');
dic.Add('6','57ty');
dic.Add('7','68yu');
dic.Add('8','79uı');
dic.Add('9','80uı');
dic.Add('0','9*op');
dic.Add('!','é''');
dic.Add('''','^!');
dic.Add('?','=_');
dic.Add('#','£$');
dic.Add('$','#½');

Daha sonra çeşitli şekillerde yanlış şifre yazacak şekilde metodları yazdım. çok merak edenlere kaynak kodunu veriyorum.

HolyOne Typo Generator Source + Executable

Son olarak da girmiş olabileceğim tüm şifrelerin tüm kombinasyonlarını buraya girip çıktısını önceki denemelerde kodladığım hybrid brute forcera takarak kullandığım şifreyi yakaladım ve arşivi açtım.

Uzun ve ızdıraplı bir sürecin arkasından datalarımı geri getirmiştim. Şükürler olsun ki o 2 aylık kayıp da hiç önemli değildi çünkü çoğunda tbt serverında minecraft oynamıştım =)

Bu uzun dökümandan çıkarmanız gereken anafikir şudur güzel kardeşlerim... önemli datalarınız varsa backup alın. doğru şekilde alın. birden fazla alın. Aldığınız backuptan sonra o dosyayı extract etmeyi mutlaka deneyin. Backup alın HEMEN! ne duruyosunuz amq??