65.9K
CodeProject 正在变化。 阅读更多。
Home

防病毒程序 - 第 2 部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2019年8月19日

CPOL

4分钟阅读

viewsIcon

13095

一个使用Yara和局部敏感哈希检测恶意软件的开源杀毒引擎

引言

我曾经写过一个开源杀毒引擎

上述杀毒软件使用消息摘要5(MD5)算法来检测恶意软件。上述杀毒软件是一个巨大的失败。在本文中,我将解释杀毒软件是如何失败的,以及新的实现如何克服了它在检测恶意软件方面的陷阱。

MD5作为恶意软件签名的缺点

之前的杀毒软件使用MD5作为检测恶意软件的主要搜索引擎。其想法是将MD5哈希值与数据库中存储的已知恶意软件的MD5哈希值集合进行比较。如果哈希值匹配,则会通知用户。这种方法简单明了,但有主要的缺点,下面会进行解释。

1. 用TLSH替换MD5

由于MD5是一种加密哈希函数,即使文件发生微小的更改也会生成完全随机的哈希值。因此,恶意软件样本会有不同的签名。这将极大地淹没数据库,产生重复的签名,如果新的哈希值不在数据库中,也可能导致检测失败。

LSH,也称为局部敏感哈希,将为相似的文件生成相似的哈希值。TLSH是由TrendMicro开发的局部敏感哈希

TLSH使用距离分数来计算两个哈希值之间的距离,分数为0表示文件相同或高度相同。距离分数的增加与两个文件之间的差异成正比。我们使用20的相似度距离,这在比较哈希值时会减少误报。TLSH的字符长度为70。下图将向您展示新的杀毒软件能够从其签名数据库中删除重复项。

因此,我们现在已经解决了以前版本的杀毒软件面临的数据重复问题。

2. 使用YARA签名

Yara是由VirusTotal开发的开源模式匹配引擎。可以使用Yara规则检测各种恶意软件。用于检测最常见恶意软件的Yara规则在Github等各种平台上都可用,而且重要的特征是它具有跨平台性,即它可以在Linux、Windows和Mac OS X上运行。

我们从他们的Github存储库构建了Yara库,并使用了Avast制作的包装器。我们的杀毒软件支持yara规则。

3. 杀毒软件服务器

我们的杀毒软件是服务器和客户端模型,即杀毒引擎将在127.0.0.1和端口5660上作为http服务器运行,这意味着您可以根据需要自定义前端。

以下是服务器常用的API调用

1. 请求使用YARA签名扫描文件

您可以请求服务器扫描特定文件以匹配Yara签名。下面是使用Python发出的请求的示例代码。

import requests
r = requests.post("http://127.0.0.1:5660/scan_file_for_yara", 
                   data={"file": "D:/test.eicar", "target": "windows"})
print(r.json())

上述请求将输出以下JSON响应。

{
  "detections": [
    {
      "author": "Visweswaran",
      "description": "EICAR",
      "name": "bot"
    },
    {
      "author": "UNKNOWN AUTHOR",
      "description": "AV-TEST-FILE",
      "name": "example"
    }
  ],
  "message": true
}

2. 在我们的数据库中扫描TLSH

    def scan_for_tlsh(self, path):
        r = requests.post("http://127.0.0.1:5660/get_tlsh", data={"file": path})
        tlsh_hash = r.json()["message"]
        if len(tlsh_hash) != 70:
            return None
        try:
            file_size = os.path.getsize(path)
            file_type = filetype.guess(path)
            mime = file_type.mime
            r = requests.get("http://127.0.0.1:5660/check_threat_db?tlsh={}7&
                min_size={}&max_size={}&type={}".format(
                tlsh_hash, file_size-10000, file_size+10000, mime
            ))
            if r.json()["message"] != -1:
                result = {
                    "name": "Identified Threat",
                    "author": "Undefined",
                    "description": "This application matches known sample 
                                    collected from virussign.",
                    "path": path
                }
                self.detection_signal.emit(result)
        except AttributeError:
            pass

4. 更新

杀毒软件需要不断更新以检测新的恶意软件。我们的杀毒软件从我的开源威胁数据库下载签名。

该存储库有两个文件夹,rulesetthreat_db。ruleset将包含用于下载签名的规则。

这是一个示例ruleset条目

我们的程序将从指定的URL密钥中的文件中下载所有指定的签名。

    {
    "files": [
        "00262c8d0aadc3cb4be65879adc90ae0.json",
        "011bf863d4e663aa0c926b22e10de0a0.json",
        "01c330ac6e38efc825392935f5335970.json",
        "02b527d0d835551173d60165295e5760.json",
        "02e47b0abda68b4ec9ba744949b6db50.json",
        "049a75642e9f3e5de016cebb17684060.json",
        "04d26df3f7ab73593e7032e53c47e610.json",
        "052c5d51c394c0b23b705b9dba7d8610.json",
        "05a999c3d1c289dde03b646f4ecf6970.json",
        "066d8931cc808b434e70035252b38400.json",
        "069beb9929025aa2a06ccc92f92ec210.json",
        "07fa346c6e1b527c05956c380e7845f0.json",
        "08dab9ded3f84c38c5bd767ca3b59d70.json",
        "091cf848a11f19d538ae5523863ed610.json",
        "09d69bb9310fad02e61ce5846974ff40.json",
        "0a3955c6421d72c60032d988eb8355c0.json",
        "0a8af0c42c6d2599ce50a3025eaa1ba0.json",
        "0adb76cb764e40cd2a8f3439fa6e85a0.json",
        "0b51f2ee8fc6fb878fedb5965e18ad80.json",
        "0b54a0b4ef49bc43d1cc7e5fd79f9a00.json",
        "0b58dc29370adc52339b4caf8562ad70.json",
        "0ca48e853292a9b619cdb6b0ab1bd440.json",
        "0cdf02304ebfa49679f7db62037872e0.json",
        "0e4ab6462cce4ef7fa31fb4ac57c83c0.json",
        "0ec2c15fdeeb330cafc4a5fe2ffc3e70.json",
        "0eda094271709f4d5a9f19b57c186160.json",
        "0f22fa598186b77206257e48df59c1b0.json",
        "0f59b56edf6748b9f9bc1aa81e325d40.json",
        "0fe64eadbb6ca69ee787111be6438fb0.json",
        "101534723ab369c5ee0f73bedb2f3ae0.json",
        "10cb1a9ee2a44e1942b2b5c63f1d3810.json",
        "11bed948eb05efd18c08bf2eca2bbe30.json",
        "1222b9de991a3b8c400e0254be8b4320.json",
        "133bc9d70764d9aa2d4caa1be5298a70.json",
        "13aaeb6d9731d14b40ddf0dd82097e60.json",
        "13ff5b66db6708a1b401796be9b051c0.json",
        "15822673e074769eb74ae6af83f97bb0.json",
        "163017016b7510494b290f98e61139b0.json",
        "16a476f8b3042e0a3e860484c09747c0.json",
        "17d3069abe6c8851a6265c671e420eb0.json",
        "188b0472f0d29d870c1f7584d02f5140.json",
        "1973cbe3fa6b2dc027b1f8bc397a8410.json",
        "1a58fdc5111b02f7365d9d6fdfec60d0.json",
        "1b45ebd8e310870edd4f75b338856a80.json",
        "1d2e18ebeb166ea4cb46889813275c90.json",
        "1d884a7e4f6b46359d50dac2c5bc7bc0.json",
        "1e76e1805f5538b4eb9621a1447428b0.json",
        "1ea41d3da07ca12b2621669b53c3e0b0.json",
        "1eadef36e46316c7b121cb67b7c5a990.json",
        "1f75807fe3e230383e62bd1361879a40.json",
        "1fa7852cb5597765439cd0f6f4f4ed10.json",
        "1fb699cdf5491940cb18adf69324ce90.json",
        "203b252dad1c4e55737b8d2c6adca720.json",
        "20b44714f3d1bfabbbd8e919aa68f520.json",
        "ce5e29524b19188331c08291334d45c0.json",
        "cec5be08b011d1a64e4592867bd07b30.json",
        "f5f609657dd815f6403b7db5e5870f80.json",
        "f7aaa86433a314d021a88253855d3b80.json",
        "ff898fa4e7710feaf462cf6d3cfa19b0.json",
        "ffe2a48d87eb2611d278a0041d2da9c0.json"
    ],
    "url": "https://raw.githubusercontent.com/VISWESWARAN1998/
            open-threat-database/master/threat_db/"
}

签名看起来像这样

    {
        "tlsh": "8D63E1CA9195EDD4FC5BB839000275FAFB66044C7AEB7201F854ABDDE0D4780D2EC68A",
        "name": "VirusSign Sample",
        "size": 72704,
        "type": "application/x-msdownload"
    }

5. 添加yara

您可以在 yara 文件夹中添加您自己的yara文件,并且杀毒引擎内置了yara的错误检查器。

您可以通过访问此URL来检查编译错误:http://127.0.0.1:5660/check_yara,服务器将删除具有编译错误的文件。运行 http://127.0.0.1:5660/refactor_threat_db 将删除重复的TLSH哈希值。

not found

使用杀毒软件

杀毒软件附带服务器 mrida.exe,您应该首先执行它,这将启动服务器。然后您可以执行 mrida-gui.exe。这将运行一个基本的用户界面来演示杀毒软件的工作原理。它看起来是这样的

No Image

no image

关注点

我仍然必须承认,这并不是一个完美的杀毒软件实现。它仍然存在许多缺点,并且任何免费的商业引擎都会胜过它的检测。然而,它可以用于教育目的并服务于社区。Windows只有一个开源杀毒软件,即clamwin,但现在我们可以再添加一个,尽管它也适用于其他操作系统。

历史

  • 2019年8月19日:初始版本
© . All rights reserved.