0

基本上是在尝试制作防病毒软件,但是当我尝试将受感染的文件读入缓冲区时,我得到的只是 EOF ......这是一个 jpg,我不知道如何解决这个问题

关于我可以使用的文件函数: 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;
}
4

2 回答 2

1

EOF是一些输入函数返回的特殊整数值,表示已到达文件末尾,但它不是文件数据的一部分。因此,您fread()永远不会将 EOF 字符存储到您提供的输入缓冲区中。但是,如果您的 C 实现具有签名的 default chars,就像许多人所做的那样,那么会有一个char数值等于EOF(通常是 -1)的值。

如果任一文件恰好包含该字节,那么您的代码会将其误解为指定该文件的结尾。如果它恰好是任一文件中的第一个字节,则程序会将文件误解为空。

由于您正在分析二进制文件,

  1. 我建议使用缓冲区unsigned char而不是 default char

  2. 所有可能的字节值都可以出现在文件数据中,因此您无法通过其中任何字节的值来识别数据的结尾。

可能getFile()应该返回一个包含指向缓冲区的指针及其大小的结构。

于 2016-05-21T20:39:02.240 回答
0

正如其他答案所建议的那样,您还应该发送文件长度并对其进行迭代,而不是等待EOF.

此外,在您的getFile()函数中,当您确定不必逐字节读取文件的长度时,您可以filelenfread()这样发送

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

fread现在从filelen流中读取每个字符大小的数据元素(您可以写 1)filebuffer.

于 2016-05-21T21:35:53.733 回答