我需要在二进制文件中搜索二进制模式, 我怎么能这样做?
我试过" 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);
}
答案 0 :(得分:2)
对于任何二进制处理,你应该从不使用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
是您程序中的重要功能,否则它将完成任务。
答案 1 :(得分:1)
基本想法是检查>>> test()
[499982, 500018]
>>> test()
[499528, 500472]
>>> test()
[500307, 499693]
是否与vir
的开头匹配。如果它没有,那么你再次检查,从fil
的第二个字节开始,然后重复,直到找到匹配或直到你到达fil
的末尾。 (这基本上是fil
的简单实现,除了strstr
将0字节视为特殊情况。)
strstr
这是&#34;蛮力&#34;做法。如果您的文件很长,它会变得很慢。有一些先进的搜索算法可以使这个速度更快,但这是一个很好的起点。