搜索模式的二进制文件

时间:2015-06-06 14:06:52

标签: c file binary

我需要在二进制文件中搜索二进制模式, 我怎么能这样做?

我试过" 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);
}

2 个答案:

答案 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;做法。如果您的文件很长,它会变得很慢。有一些先进的搜索算法可以使这个速度更快,但这是一个很好的起点。