防病毒程序 - 第 2 部分





5.00/5 (2投票s)
一个使用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. 更新
杀毒软件需要不断更新以检测新的恶意软件。我们的杀毒软件从我的开源威胁数据库下载签名。
该存储库有两个文件夹,ruleset 和 threat_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哈希值。
使用杀毒软件
杀毒软件附带服务器 mrida.exe,您应该首先执行它,这将启动服务器。然后您可以执行 mrida-gui.exe。这将运行一个基本的用户界面来演示杀毒软件的工作原理。它看起来是这样的
关注点
我仍然必须承认,这并不是一个完美的杀毒软件实现。它仍然存在许多缺点,并且任何免费的商业引擎都会胜过它的检测。然而,它可以用于教育目的并服务于社区。Windows只有一个开源杀毒软件,即clamwin,但现在我们可以再添加一个,尽管它也适用于其他操作系统。
历史
- 2019年8月19日:初始版本