Neler yeni
Türkiye'nin En Güncel Forum Sitesi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı yada giriş yapmalısınız. Forum üye olmak tamamen ücretsizdir.

C ile rar şifresi kırma dosya parçalama ve bölme

ByOnur58

Kayıtlı Üye
MFC Üyesi
  • Üyelik Tarihi
    7 Ocak 2015
  • Mesajlar
    2,113
  • MFC Puanı
    10
  • MFC Seviyesi

Geçen senelerde ilk öğrendiğim zamanlarda yaptığım uygulama. Dosya parçalama bölümü yok çünki yapasım gelmedi dosya parçalamayı yaptıktan sonra. Yeni başlayan veya ilerletmek isteyenler için iyi bir uygulama olduğunu düşünüyorum.

Rar şifre kırma özelliği rar algoritmaları kullanılmadan yapıldığı için yavaş çalışıyor. Önemli olan kodu anlamak. Winrar programının dos komutlarını while döngüsüne sokmak temel algoritmamız.


Kod:
#include<stdio.h>
#include<stdlib.h>
#define MAKS_ISIM 100                                                           /*Dosya icin maksimum isin sabiti*/
#define TEK_ISIM 30

FILE *ilk, *cikti;                                                              /*Dosya degiskenleri*/

int main()
{    
    float a;
    int ye=0;
    short i=0,x=0,c=1,d, secim1, secim2 ,secim3,secim4, birbas=48, ikibas=48;
    char  fonk[MAKS_ISIM],dosyayolu[MAKS_ISIM],al, isim[TEK_ISIM];
    unsigned long int krkter_sayi=0,aktarilan=1;                                /*krkter_sayi değişkeni yüksek sayı tutabileceğinden böyle*/
    
    bas:
    
    printf("1-Dosya Bolmek(En fazla 99 parca)\n2-Dosya birlestirmek\n3-Rar sifresi kirmak");
    scanf("%d", &secim1);
    
    if (secim1 == 1)
    {
               system("cls");                                                   /*Ekran siler*/
               tekrar1:
                       
               fflush(stdin);                                                   /*Bu fonksiyon klavye girişini temizler.*/
                       
               printf("Dosyayi Yolu, Ismi ve Uzantisiyla Giriniz: (Ornek C:\\Yeni\\naber.txt): \n");
               gets(dosyayolu);
               
               if((ilk = fopen(dosyayolu, "rb"))==NULL)
               {
                          system("cls");
                          printf("Dosya acilamiyor. Lutfen tekrar deneyiniz\n\n");                       
                          goto tekrar1;                                            
               }               
              
               
               while(dosyayolu[i]!='\0')                                        /*strlen yazmadım mantık anlaşılsın. bu ise aklıma geldi :)*/
               {                                                                /*dosyayolu değişkeninin kaç karakter olduğunu yazar*/
                          i++;                   
               }
               
               c=i;
               
               while(dosyayolu[i-1]!='\\')                                      /*Burada girilen dosya yolundan dosyanın ismini alıyoruz.*/
               {
                          isim[x]=dosyayolu[i-1];                               /*Kullanıcı uzantısı olmayan dosya girerse diye önlemimiz var */
                          x++;
                          i--;
                          if(i==0)                                                 
                          break;                                                   
               }
               isim[x]='\0';                                                    /*Yukarıdaki işte bu yüzden gerekmiyordu '\0' deyince */
               
               a=(float)(x-1)/2;
               
               for(i=0;i<a;i++)
               {                                                                /* strrev kullanılabilir mantık açısından böyle yaptım*/
                          isim[i]^=isim[x-i-1];
                          isim[x-i-1]^=isim[i];
                          isim[i]^=isim[x-i-1];                              
               }  
               system("cls");
                                   
               printf("Dosyanizin ismi \"%s\" ise devam etmek icin 1 e basin.",isim);
               scanf("%d",&secim2);
               
               if(secim2==1)       {}
               else                {return 0;}
               
               while(dosyayolu[c-1]!='\\' )                                     /* Bu döngü örneğin dos.txt dosyasını dos00.txt yapar.*/
               {
                          
                          if(dosyayolu[c-1]=='.')  
                          {
                                     dosyayolu[c+5]='\0';
                                     dosyayolu[c+4]=dosyayolu[c+2]; 
                                     dosyayolu[c+3]=dosyayolu[c+1]; 
                                     dosyayolu[c+2]=dosyayolu[c];   
                                     dosyayolu[c+1]='.';  
                                     dosyayolu[c]=birbas; 
                                     dosyayolu[c-1]=ikibas;           
                                     d=c;
                                     break;
                          }
                          
                          c--;   
                          
                          if(c==1)                                              
                          break;                                              
               }
               
               system("cls"); 
              
               printf("Parcalanmis %s dosyalarinin isimleri ve kayit yerleri \n%s olacak.",isim,dosyayolu);
               printf("\n\nKblara bolmek icin normal sayi girin. Mb bolmek icin 1024 kati girin: ");
               scanf("%d",&secim3);
                          
               krkter_sayi=secim3*1024;                                         /*Girilen syıyı kb a çevirir. 1024 girilirse 1 mb olur.*/
               
               cikti=fopen(dosyayolu,"wb");                                     /*örnek dos00.txt wb modunda açılır*/
                     
               while(!feof(ilk))                                      /*dos.txt "ilk" e aktarılmıştı. dosya sonuna kadar karakter oku */
               {
                          al=fgetc(ilk);          
                          if(krkter_sayi>aktarilan)                             /*Burada bizim verdiğimiz sınır belirleniyor*/
                          {
                                     fputc(al, cikti);                          /*yeni cıktıya koyuluyor.*/
                                     aktarilan++;          
                          }
                                          
                          if(krkter_sayi==aktarilan)                            
                          {
                                     fputc(al, cikti);                          /*son karakteride koyduk*/
                                     fclose(cikti); 
                                     printf("\n%s olusturuldu",dosyayolu);      /*ekrana bittiğini yazdık*/
                                     dosyayolu[d]=++birbas;                     /*dos00.txt idi ya ilk basamağı arttırıyoruz. dos01.txt*/
                                                     
                                     if(birbas==58)                             /*57 asci kodu 9 idi yukarda 9 döndürülmesi lazımdı bu yüzden 58*/
                                     {
                                                dosyayolu[d-1]=++ikibas;        
                                                birbas=48;
                                                dosyayolu[d]=birbas;            /*burda mesela dos10.txt yaptık*/                     
                                                
                                                if(ikibas==58)                  /*iste programımızın demo özelliği :) 99 parça olcaktı*/
                                                {
                                                           system("cls");
                                                           printf("99 parca destekliyoruz daha parcalama yapamayiz.\n1-Basa don.\n2-Cıkıs");
                                                           scanf("%d",&secim4);
                                                           
                                                           if(secim4==1)       {goto bas;}
                                                           else                {return 0;}
                                                }
                                     }
                                     
                                     cikti=fopen(dosyayolu,"wb");               /*yukarıda oluşan yeni isimli parçalı dosyayı burda açıyoruz*/
                                     aktarilan=1;                               /*aktarılan ı 1 yapalım demi :)*/
                          }
               }
               fclose(ilk);                                                     /*işlem bitti dosyamızı kapatalım*/
    }
    
    /*Dosya birlestirme islemleri*/
    
    else if (secim1 == 2)
    {
               system("cls");
               printf("Simdilik yapim asamasinda :) ");
    }
    
    else if (secim1 == 3)
    {
               system("cls");
               
               printf("Pc nizde Winrar kurulu olmasi gerekmektedir ve lütfen winrar C:\\Program Files\\Winrar yerinde olsun.\n\n");
               printf("Sifresi cozulecek rar dosya yolunu ismi ve uzantisiyla giriniz. (D:\\dosya.rar):\n");
               scanf("%s",dosyayolu);
               
               for(ye=0;ye<100000 && c!=0;ye++)
               {
               sprintf(fonk,"C:\\Progra~1\\winrar\\rar.exe t -inul -p%d %s",ye,dosyayolu);
               c=system(fonk);
               
               printf("%d\n",ye);
                       
               }
               system("cls");
               printf("sifreniz %d",ye-1);
               scanf("%s",dosyayolu);
    }
    
    
    
    
    
    else
    {
        printf("Galiba cikmak istion. Bas bir tusa cik hadi\n\n");
        return 0;
    }
        
    return 1;
}
 
Üst Alt