2016-05-14 81 views
-1

的搜索我想在C 打造杀毒我是这样做的:模式二进制数据

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

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

予读取扫描的文件和病毒文件这样的数据:(I读取由二进制模式文件,因为该文件是图像文件(.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); 

i之后读出的文件数据和病毒数据如果病毒出现类似这样的文件在我检查:

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

即使在我的图片,我有VirusID它不工作。 我想检查病毒的二进制数据是否出现在图片的二进制数据中。

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

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

+0

什么是'fileLength'? –

+0

如果文件是二进制文件呢? – stark

+0

@SouravGhosh它的变量,我检查一步一步的长度是正确的。 –

回答

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"); 
+0

您认为它的工作是检查病毒的二进制数据是否出现在图片的二进制数据中? –

+1

@YairB。你能改说你的问题吗?我以为那是你想要做的。 – fluter

+0

我建立了一个杀毒软件,可以通过二进制数据检查图片文件。 我有一个病毒的二进制数据,我想检查病毒的二进制数据是否出现在图片的二进制数据。 –

1

搜索病毒特征码的第一个字节,如果你找到它,然后看看下一个字节是签名的第二个字节,依此类推,直到你已经检查和匹配签名的所有字节。然后该文件被感染。如果不是所有字节匹配,则再次搜索签名的第一个字节。