teggr234
teggr234

Reputation: 11

trying to read a file

basically trying to make an anti virus but all I get when trying to read the infected file into a buffer is EOF... it's a jpg and I have no idea how to fix this

about the file functions I'm allowed to use: fread/fwrite fgets fputs fclose fopen fgetc fputc fscanf fprintf

int fullScan(FILE* sign, FILE* infected);
char* getFile(FILE* file);

int main(int argc, char** argv)
{
    FILE* sign = fopen("KittenVirusSign", "rb");
    FILE* infected = fopen("kitten_frog.jpg", "rb");
    int j = 0;
    if (infected == NULL)
    {
        printf("couldn't open the file (suspicious file)");
        return -1;
    }
    if (sign == NULL)
    {
        printf("couldn't open the file (virus signature)");
        return -1;
    }

    j = fullScan(sign, infected);
    return 0;
}

int fullScan(FILE* sign, FILE* infected)
{
    char* sign_c = NULL;
    char* infec_c = NULL;
    int infect_res = -1;
    int sign_len = 0;
    int infec_len = 0;
    int i = 0;
    int j = 0;
    sign_c = getFile(sign);
    infec_c = getFile(infected);
    while (1)
    {

        if (*(infec_c + i) == *(sign_c + j))
        {
            infect_res = 1;
            if (*(sign_c + j) == EOF)
            {
                break;
            }
            else if (*(infec_c + i) == EOF)
            {
                infect_res = -1;
                break;
            }
            i++;
            j++;
            continue;
        }
        else if (*(infec_c + i) != *(sign_c + j))
        {
            if (*(infec_c + i) == EOF || *(sign_c + j) == EOF)
            {
                break;
            }
            i++;
            j = 0;
            infect_res = -1;
        }

    }
    fclose(infected);
    free(sign_c);
    free(infec_c);
    return infect_res;
}


char* getFile(FILE* file)
{
    char* buffer;
    long filelen;
    int i;
    fseek(file, 0, SEEK_END);
    filelen = ftell(file);
    fseek(file, 0, SEEK_SET);
    buffer = (char *)malloc((filelen + 1)*sizeof(char));
    for (i = 0; i < filelen; i++)
    {
        fread(buffer + i, sizeof(char), 1, file);
    }

    return buffer;
}

Upvotes: 0

Views: 450

Answers (2)

smrdo_prdo
smrdo_prdo

Reputation: 236

As other answer suggested, you should also send the file length and iterate over that, rather than waiting for a EOF.

Also, in your getFile() function, when you determine the length of the file you don't have to read byte by byte, you can just send the filelen to fread() like so

fread(buffer, sizeof(char), filelen, file);

fread now reads filelen elements of data each the size of a char (you can write 1 instead) from the stream file to buffer.

Upvotes: 0

John Bollinger
John Bollinger

Reputation: 180058

EOF is a special integer value returned by some input functions to indicate that the end of the file has been reached, but it is not part of the file data. Your fread() will therefore never store an EOF character into the input buffer you provided. However, if your C implementation features signed default chars, as many do, then there is a char value that is numerically equal to EOF (usually -1).

If either file happens to contain that byte, then your code will misinterpret it as designating the end of that file. If it happens to be the first byte in either file then the program will misinterpret the file as being empty.

Since you are analyzing binary files,

  1. I recommend using buffers of unsigned char rather than default char.

  2. All possible byte values can appear in the file data, so you cannot identify the end of the data by the value of any byte within.

Probably, getFile() should return a struct that contains both a pointer to the buffer and its size.

Upvotes: 1

Related Questions