Untitled
unknown
plain_text
a year ago
2.8 kB
9
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#define ERROR 1
#define PROC_INDEX 0
#define PATH_INDEX 1
#define SIGN_INDEX 2
#pragma warning(disable : 4996)
int isElf(FILE* file);
int checkInfected(FILE* file, char* sign);
void findSign(char* path, char* sign);
char* getFullPath(char* parent, char* child);
int getFileLength(FILE* file);
int main(int argc, char* argv[])
{
int errorInFiles = 0;
if (argc != 3)
{
printf("Usage: %s <dir path> <virus signature file>\n", argv[PROC_INDEX]);
return ERROR;
}
FILE* virusSign = fopen(argv[SIGN_INDEX], "rb");
if (!virusSign)
{
printf("Error opening signature file!\n");
errorInFiles = ERROR;
}
DIR* path = opendir(argv[PATH_INDEX]);
if (!path)
{
printf("Error opening path directory file!\n");
errorInFiles = ERROR;
}
if (errorInFiles) return ERROR;
findSign(path,argv[PATH_INDEX], virusSign);
fclose(virusSign);
closedir(path);
return 0;
}
int isElf(FILE* file)
{
char* header = malloc(strlen("ELF"));
fread(header, sizeof(unsigned char), strlen("ELF"), file);
if (!strncmp(header, "ELF",3)) return 1;
return 0;
}
int checkInfected(FILE* file, FILE* signFile)
{
int streak = 0, flag = 0;
char fileChar = 0, signChar = 0;
fseek(signFile, 0, SEEK_SET);
fseek(file, 0, SEEK_SET);
int len = getFileLength(signFile);
do
{
fread(&fileChar, sizeof(unsigned char), 1, file);
fread(&signChar, sizeof(unsigned char), 1, signFile);
if (signChar == fileChar)
{
streak++;
}
else
{
if (streak == len) flag = 1;
streak = 0;
fseek(signFile, 0, SEEK_SET);
}
} while (!feof(file) && !feof(signFile) && !flag);
if (streak >= len || flag) return 1;
return 0;
}
void findSign(DIR* currDir,char* path, FILE* sign)
{
struct dirent* entry;
DIR* dir;
FILE* fp;
char* entryPath;
while ((entry = readdir(currDir)) != 0)
{
if (!strcmp(".", entry->d_name) || !strcmp("..", entry->d_name)) continue;
entryPath = getFullPath(path, entry->d_name);
if ((dir = opendir(entryPath)))
{
findSign(dir,entryPath, sign);
closedir(dir);
}
else if ((fp = fopen(entryPath, "rb")))
{
if (isElf(fp))
{
if (checkInfected(fp, sign)) printf("%s is infected!\n", entryPath);
}
fclose(fp);
}
}
}
char* getFullPath(char* parent, char* child)
{
char* fullName = malloc(strlen(parent) + strlen(child) + 1);
memset(fullName, 0, strlen(parent) + strlen(child) + 1);
strncpy(fullName, parent, strlen(parent));
strncat(fullName, "/", 1);
strncat(fullName, child, strlen(child));
return fullName;
}
int getFileLength(FILE* file)
{
int len = 0;
fseek(file, 0, SEEK_END);
len = ftell(file);
fseek(file, 0, SEEK_SET);
return len;
}
Editor is loading...
Leave a Comment