【问题标题】:Check if a content of a binary file is in a part/whole binary file (C lang)检查二进制文件的内容是否在部分/整个二进制文件中(C lang)
【发布时间】:2021-05-10 16:47:33
【问题描述】:

我有两个文件:

    FILE* fileToScan = fopen("c:/fileToScan.png", "rb");
    FILE* contentFile = fopen("c:/virusFile.jpg", "rb");

我想检查 contentFile 的内容是否在(/部分)fileToScan 中。 有什么帮助吗?

【问题讨论】:

  • strstr 在您阅读两个文件后即可使用。 “最难”的部分是通过适当的内存分配读取两个文件
  • 我会在内存中映射文件并使用 memmem()(或任何 Windows 等价物,如果有的话)
  • @Jean-FrançoisFabre strstr 仅适用于文本文件。想要memmem 获取二进制数据
  • strstr() 对于二进制数据来说是非常错误的函数。
  • 我不能使用 memmem

标签: c binaryfiles


【解决方案1】:

“简单”解决方案:

  1. 读取整个文件以在内存中扫描。您可以使用变量char *haystack; 大小为size_t haystack_len;
  2. 读取内存中的整个内容文件。您可以使用变量char *needle;,大小为size_t needle_len;
  3. 使用 needle 的第一个字符在 haystack 上运行 memchr()
  4. 如果您找到第一个字符,请从该点开始尝试memcmp()
  5. 如果 memcmp() 失败,您可以将 haystack 指针更新为超过 memchr() 结果并返回第 3 步

这根本没有使用优化!你肯定能找到更好的实现,比如the glibc one

如果文件不适合内存,事情就会变得更加困难。你基本上需要分块工作。

【讨论】:

    猜你喜欢
    • 2018-10-04
    • 1970-01-01
    • 2011-03-06
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多