我正在尝试在C中构建防病毒软件。 我这样做:
读取病毒和图片文件的数据进行扫描。
检查病毒数据是否出现在图片数据中。
我读取扫描文件和病毒文件的数据如下:(我通过二进制模式读取文件,因为文件是图片(.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
答案 0 :(得分:2)
首先,请注意fread
,fread(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)
搜索病毒签名的第一个字节,如果找到它,则查看下一个字节是否是签名的第二个字节,依此类推,直到您检查并匹配签名的所有字节为止。然后该文件被感染。如果并非所有字节都匹配,则再次搜索签名的第一个字节。