【问题标题】:Searching for partial substring within string in C#在 C# 中的字符串中搜索部分子字符串
【发布时间】:2012-08-16 05:05:46
【问题描述】:

好的,所以我正在尝试在 C# 中制作一个基本的恶意软件扫描程序,我的问题是说我有特定代码位的十六进制签名

例如

        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\test.txt");
        }

        //Which will have a hex of 53797374656d2e494f2e46696c652e44656c657465284022433a5c55736572735c5075626c69635c44656c657465546573745c746573742e74787422293b

更改为 -

        {
            System.IO.File.Delete(@"C:\Users\Public\DeleteTest\notatest.txt");
        }
//Which will have a hex of 53797374656d2e494f2e46696c652e44656c657465284022433a5c55736572735c5075626c69635c44656c657465546573745c6e6f7461746573742e74787422293b

请记住,这些位将包含在程序的整个十六进制中 - 我怎样才能获取我的基本签名并寻找部分匹配,说有 90% 匹配因此被标记。

我会做一个通配符,但这不适用于稍微复杂的事情,因为它的编码可能略有不同,但大部分是相同的。那么有没有办法可以对子字符串进行百分比匹配?我正在研究 Levenshtein 距离,但我不知道如何将它应用到这个给定的场景中。

提前感谢您的任何意见

【问题讨论】:

    标签: c# string hex match partial


    【解决方案1】:

    使用编辑距离就可以了。您可以取两个字符串并计算编辑距离,这将是一个整数值,表示将一个字符串带到另一个字符串需要多少次操作。您根据该数字设置自己的阈值。

    例如,您可以静态设置如果距离小于五次编辑,则更改是相关的。

    你也可以取你要比较的字符串的长度并取其中的一个百分比。您的示例长度为 36 个字符,因此 (int)(input.Length * 0.88m) 将是一个有效的阈值。

    【讨论】:

    • 当我要查找的字符串将被正在扫描的文件中的其余代码包围时,我将如何比较它。
    • 对不起,我没有注意到您指定的部分,即您不是尝试在路径上进行编辑距离,而是在哈希本身上。您仍然可以对二进制文件进行编辑距离,但请记住计算要求。为了让您匹配一组 100 个恶意软件签名,您将 (a) 需要机器上存在的实际恶意软件文件,并且 (b) 需要(单独编辑比较的时间)*(签名数量)*(数量计算机上的文件数)进行比较的时间。这将是一项相当昂贵的操作。
    • 好的,谢谢你,我会尝试想出另一种解决方法:)
    • 考虑取而代之的是图像的已知部分,可能是代码在 .text 部分开始后的固定偏移量,并在 8 字节偏移量处对其进行散列以与一组已知散列进行比较,然后是找到匹配项时进行全面比较。请参阅profs.sci.univr.it/~dallapre/MilaDallaPreda_PhD.pdf,了解有关阻止版本之间恶意软件微小变化的一些其他概念。
    【解决方案2】:

    首先,您的程序位应该完全匹配,否则它已被修改或损坏。通常,您会将 MD5 哈希存储在原始二进制文件中,并根据新版本检查 MD5 以查看它们是否“足够相同”(MD5 不能保证 100% 匹配)。

    除此之外,为了检测随机二进制文件中的恶意软件,您必须知道要寻找什么样的模式。例如,如果我知道某个恶意软件注入了带有一些二进制 XYZ 的代码,我将在可执行文件的位中查找 XYZ。当然,模式比这复杂得多,因为恶意软件位可以以块的形式散布。更有趣的是,有些病毒是自我变形的。这意味着每次运行时,它都会修改自己,这意味着扫描仪不知道要找到的确切模式。在这些情况下,扫描器必须知道可以生成的衍生产品的类型并查找所有这些类型。

    就查找百分比匹配而言,此操作非常耗时,除非您有限制。通过比较 2 个字符串,您无法判断哪些部分被删除、添加或替换。例如,如果我有一个起始字符串“ABCD”,那么自从添加内容后,“AABCDD”是否匹配 100% 或更少?那么'ABCDABCD'呢?在这里它匹配了两次。 “AXBXCXD”怎么样? “CDAB”呢?

    现有的许多 DIFF 工具可以告诉您文件的哪些部分已更改(可能导致 %)。不幸的是,由于我上面描述的问题,它们都不是完美的。你会发现你有漏报、误报等。这对你来说可能已经“足够好”了。

    在确定适合您的特定算法之前,您必须确定搜索的限制条件。否则,您的扫描将是 NP-hard,这会导致运行时间不合理(您的扫描仪可能会运行一整天以检查一个文件)。

    【讨论】:

    • Eh md5 只能静态工作 许多病毒具有可以选择和更改选项的构建器,但是基本代码保持几乎相同,但 md5 会完全改变。至于多态病毒,我什至不会尝试这些;)
    【解决方案3】:

    我建议你看看Levenshtein distanceDamerau-Levenshtein distance

    前者告诉你需要多少次添加/删除操作才能将一个字符串变成另一个字符串;后者告诉您将一个字符串转换为另一个字符串需要多少次添加/删除/替换操作。

    在编写用户可以搜索东西的程序时,我经常使用这些,但他们可能不知道确切的拼写。

    两篇文章都有代码示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 2020-01-01
      • 2012-02-10
      • 2020-09-27
      相关资源
      最近更新 更多