c - 在二进制文件中搜索模式

标签 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);
}

最佳答案

对于任何二进制处理,您应该永远使用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/

相关文章:

linux - 如何检查文件是否存在于 bash 脚本的特定目录中?

binary - 如果有二进制小数点,则为最低有效位

wix安装包中的二进制文件

c - 简单 strcat() 包装函数的段错误

c - 如何访问双指针样式矩阵中的元素

从 char* 转换为 int

python - 如何使用 python 从文件中分割每一行?

Android 设置文件的最后修改时间