模式搜索二进制数据

时间:2016-05-14 13:27:29

标签: c antivirus

我正在尝试在C中构建防病毒软件。 我这样做:

  1. 读取病毒和图片文件的数据进行扫描。

  2. 检查病毒数据是否出现在图片数据中。

  3. 我读取扫描文件和病毒文件的数据如下:(我通过二进制模式读取文件,因为文件是图片(.png))

    // open file
    file = fopen(filePath, "rb");
    if (!file)
    {
        printf("Error: can't open file.\n");
        return 0;
    }
    
    // Allocate memory for fileData
    char* fileData = calloc(fileLength + 1, sizeof(char));
    
    // Read data of file.
    fread(fileData, fileLength, 1, file);
    

    在我读取文件数据和病毒数据后,我检查病毒是否出现在文件中,如下所示:

    char* ret = strstr(fileData, virusID);
    if (ret != NULL)
        printf("Infetecd file");
    

    即使在我的照片中我有VirusID也不起作用。 我想检查病毒的二进制数据是否出现在图片的二进制数据中。

    例如:我的病毒http://pastebin.com/xZbWA9qu

    的二进制数据

    我的图片(带有病毒)的二进制数据:http://pastebin.com/yjXr84kr

2 个答案:

答案 0 :(得分:2)

首先,请注意freadfread(void *ptr, size_t size, size_t nmemb, FILE *stream);的参数顺序,以便获得字节数,最好是fread(fileData, 1, fileLength, file);。您的代码将返回0或1取决于文件中是否有足够的数据要读取,而不是它已读取的字节数。

其次,strstr是搜索字符串而不是内存块,以便搜索二进制块,您需要编写自己的,或者您可以使用GNU扩展函数memmem

// Allocate memory for fileData
char *fileData = malloc(fileLength);

// Read data of file.
size_t nread = fread(fileData, 1, fileLength, file);

void *ret = memmem(fileData, nread, virusID, virusLen);
if (ret != NULL)
    printf("Infetecd file");

答案 1 :(得分:1)

搜索病毒签名的第一个字节,如果找到它,则查看下一个字节是否是签名的第二个字节,依此类推,直到您检查并匹配签名的所有字节为止。然后该文件被感染。如果并非所有字节都匹配,则再次搜索签名的第一个字节。