3

好的,所以我正在尝试在 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 距离,但我不知道如何将它应用到这个给定的场景中。

提前感谢您的任何输入

4

3 回答 3

1

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

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

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

于 2012-08-20T20:57:29.743 回答
1

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

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

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

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

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

于 2012-08-20T21:17:04.830 回答
0

我建议您查看Levenshtein distanceDamerau-Levenshtein distance

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

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

两篇文章都有代码示例。

于 2012-08-21T05:02:51.783 回答