我想遍历一个给定的目录,并查找该目录的任何常规文件中是否存在给定的文件签名.

以下是我的代码:

char* given_signature = "981d0000ec33fffffb06000000460e10";

int file_sign(char* path){

    FILE* file = fopen(path, "rb");

    if(!file){
        printf("error with file opening");
        return -1;
    }

    fseek(file, 0, SEEK_END);
    long filelen = ftell(file);
    fseek(file, 0, SEEK_SET);
    char* buffer = malloc(filelen);

    if(buffer)
        fread(buffer, 1, filelen, file);
    
    fclose(file);

    for(int i = 0; i < filelen - 16; i++){
        if(memcmp(buffer + i, given_signature, 16) == 0){
            printf("Signature found in %s\n", path);
        }
    }

    free(buffer);

    return 0;

}

void traverse_dirs(char* base_path){

    char path[_MAX_LINE_];
    struct dirent* dp;
    DIR* dir = opendir(base_path);

    if(!dir)
        return;

    while((dp = readdir(dir)) != NULL){
        if(strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
            continue;
        
        strcpy(path, base_path);
        strcat(path, "/");
        strcat(path, dp->d_name);

        if(dp->d_type == DT_REG){
            file_sign(path);
        }
        
        traverse_dirs(path);

    }

    closedir(dir);

}

遍历是正确的,因为它适用于其他函数.所以问题出在file_sign()函数,但我找不到我做错了什么.

会不会是我执行的签名错误了?我可以这样做吗?

char* given_signature[] = {"98", "1d", "00", "00", "ec", "33", "ff", "ff", "fb", "06", "00", "00", "00", "46", "0e", "10"}; 

然后逐字节解析文件如果是的话,我该怎么做?

有什么 idea 吗?

推荐答案

你显然混淆了字符串和二进制数据.

您显示的字符串文字长度为33个字节(包括null终止符),由纯十六进制数字组成.这些与您试图表示的字节无关.

类似地,您展示的数组是指向3字节字符串文字的16个指针.也与你试图找到的二进制数据无关.

你想要的是:

char given_signature[] = {
    0x98, 0x1d, 0x00, 0x00,
    0xec, 0x33, 0xff, 0xff,
    0xfb, 0x06, 0x00, 0x00,
    0x00, 0x46, 0x0e, 0x10
};

C++相关问答推荐

使用sd-设备列举设备导致seg错误

C/C++中的状态库

C指针算法在函数参数中的应用

C:二进制搜索和二进制插入

预先分配虚拟地址空间的区域

为什么我会收到释放后堆使用错误?

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

==284==错误:AddressSaniizer:堆栈缓冲区下溢

如何在GDB中查看MUSL的源代码

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

Wcstok导致分段故障

为什么WcrTomb只支持ASCII?

对于STM32微控制器,全局偏移表.get和.Got.plt必须为零初始化

赋值两侧的后置增量,字符指针

在C中使用字符串时是否不需要内存分配?

从系统派生线程调用CRT

令人困惑的返回和 scanf 问题相关

将数组中的所有元素初始化为 struct 中的相同值

子进程不会修改父进程中的统计信息

用于内存布局的size命令(文本、数据、bss)