【问题标题】:Find pattern in binary file?在二进制文件中查找模式?
【发布时间】:2012-03-10 07:57:26
【问题描述】:

我编写了下面的函数来查找文本中的模式:

bool match(char* patt,char* text){ 

    int textLoc=0, pattLoc=0, textStart=0;  

    while(textLoc < (int) strlen(text) && pattLoc < (int)strlen(patt)){ 

        if( *(patt+pattLoc) == *(text+textLoc) ){     
            textLoc= textLoc+1;          
            pattLoc= pattLoc+1;      
        }   
        else{          
            textStart=textStart+1;  
        textLoc=textStart;           
        pattLoc=0;   
        }     
    }   


    if(pattLoc >=    (int) strlen(patt)) 
        return true;  
    else return false; 

} 

看起来,该函数采用char* 类型的两个参数。我想用这个函数在binary file中找到一个模式,你建议如何执行这个问题?

【问题讨论】:

  • 通过二进制文件,你是自己将文件映射到内存中还是先加载它然后注入DLL?
  • @Mike Kwan 是的,我将通过CreateFilemMapping .. 等将文​​件映射到内存中。
  • 考虑如果你的二进制文件不包含空字节会发生什么。您不能将二进制数据流视为以空字符结尾的字符字符串。

标签: c++ winapi binaryfiles string-matching


【解决方案1】:

这里没有对错。我在这里考虑的唯一区别是使用缓冲区/大小方法而不是字符串。

您还应该考虑您希望如何阅读该文件。您是将整个文件读入内存还是分段读取?

如果您要分段阅读,请始终保存每个部分的最后一部分(搜索模式的大小)并将其附加到下一部分的开头。这样每个部分的截止值也会被评估。

【讨论】:

    【解决方案2】:

    在我看来,您试图自己实现流行的strstr 函数。但这对您没有帮助,因为您要求找到 binary 模式。在这种情况下您应该使用的函数称为memmem

    【讨论】:

    • 是 linux 的吗?我使用 Windows。
    • 你说得对,memmem 函数并非随处可用。但是 git 项目有一个很好且简单的实现,称为gitmemmem。你可以使用它而不是自己做。
    【解决方案3】:

    您听起来更像是在寻找在文件中查找模式的最佳方法。如果是这样,有一个非常好的文档用于单个和多个模式检查:

    给定一个模式 P = a1a2...an,在文本 T = 中查找所有出现的 P b1b2...bm。

    多模式案例的扩展:给定一组模式,P1,P2,..., ,

    查找文本 T = b1b2...bm 中所有出现的 P。

    您可以查看document 以获得简单的解释,查看this one 以获得更详细和不同的实现/代码。

    【讨论】:

    • @Adban 抱歉。立即更新链接。
    猜你喜欢
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    相关资源
    最近更新 更多