我需要在二进制文件中搜索二进制模式, 我该怎么做?
我尝试使用“strstr()”函数并将文件和模式转换为字符串,但它不起作用。
(该模式也是一个二进制文件) 这就是它尝试过的:
void isinfected(FILE *file, FILE *sign, char filename[], char filepath[])
{
char* fil,* vir;
int filelen, signlen;
fseek(file, 0, SEEK_END);
fseek(sign, 0, SEEK_END);
filelen = ftell(file);
signlen = ftell(sign);
fil = (char *)malloc(sizeof(char) * filelen);
if (!fil)
{
printf("unseccesful malloc!\n");
}
vir = (char *)malloc(sizeof(char) * signlen);
if (!vir)
{
printf("unseccesful malloc!\n");
}
fseek(file, 0, SEEK_CUR);
fseek(sign, 0, SEEK_CUR);
fread(fil, 1, filelen, file);
fread(vir, 1, signlen, sign);
if (strstr(vir, fil) != NULL)
log(filename, "infected",filepath );
else
log(filename, "not infected", filepath);
free(vir);
free(fil);
}
最佳答案
对于任何二进制处理,您应该永远使用strXX
函数之一,因为这些函数仅(并且专门)适用于C风格零终止的字符串。您的代码失败,因为 strXX
函数无法查看它们遇到的第一个二进制 0 之外的内容。
由于您使用 strstr
的基本想法看起来是正确的(并且仅失败,因为它仅适用于以零结尾的字符串),您可以将其替换为 memmem
,它对任意数据执行相同的操作。由于 memmem
是 GNU C 扩展(另请参阅 Is there a particular reason for memmem being a GNU extension? ),因此它可能在您的系统上不可用,并且您需要编写执行相同操作的代码。
对于 memmem
的非常基本的实现,您可以使用 memchr
扫描第一个二进制字符,如果发现某些内容,则使用 memcmp
:
void * my_memmem(const void *big, size_t big_len, const void *little, size_t little_len)
{
void *iterator;
if (big_len < little_len)
return NULL;
iterator = (void *)big;
while (1)
{
iterator = memchr (iterator, ((unsigned char *)little)[0], big_len - (iterator-big));
if (iterator == NULL)
return NULL;
if (iterator && !memcmp (iterator, little, little_len))
return iterator;
iterator++;
}
}
可能有更好的实现,但除非 memmem
是程序中的重要函数,否则它就可以很好地完成工作。
关于c - 在二进制文件中搜索模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30683828/