问题(略)
无法理解main.ndb(clamav官方16进制特征码库)中的内存偏移含义,希望有懂行人解释。
我正在使用的数据库:https://wws.lanzoub.com/iSvXz0a1bcoj
问题(详)
我试图将clamav中的main.ndb(十六进制恶意软件特征码)取出并用于我的程序中,但是在使用中,我发现了这样一些问题:
- 我成功的提取出了病毒名称、病毒平台与病毒特征码,并了解了通配符的作用。但是,由于python的性能问题,在匹配时性能十分低下。
- 我无法理解所谓的Offset(内存偏移)。因为虽然有文档表示,EP为入口点(通常为.text),S0、S1、S2分别表示第几个字段,但是我不清楚后面的+N或者+N,n(逗号分割两个数)时什么意思。我给出以下几个具有代表性的数据:
Win.Trojan.Crypted-30:1:EP+0,5:9060909090
Win.Downloader.Small-2870:1:S1+4267:十六进制码(过长)
并且,"+"后面的数字表示什么,我无法理解。因为我试图从文件的全部十六进制码中进行匹配(使用python,因此,在匹配大文件时性能十分差),生成了一个Metasploit Meterpreter的有效载荷并进行检测,我得到了Win.Trojan.Crypted-30的结果。我不清楚这是否正确,但我确实在文件中找到了此特征码(9060909090,WinHex Hex 查找与程序查找)。它的位置在572B,距离入口点1000(.text段内存开始地址)相差了许多。我无法理解"EP+0,5"在告诉我应该在哪里查找此特征。
3. 在检查特征时,我设置了快速查找选项与常规查找选项。目前的情况下,快速查找我会在.text段中匹配特征码,而常规查找我正在以从全文中检索特征来代替。原因如上。但是python对于大文件的处理并不是很迅速。在我使用了多进程(由于GIL,多线程反而会降低查找速度)后,我不得不使用文件来交换主进程与子进程的数据,因为我无法调试好Process的Manager传参,它不是无法拿到数据并抛出异常,就是修改数据后没有在主进程生效,希望大家可以为我指点。
4. 在性能方面,我观察到了很可怕的现象。
10G的内存占用!天哪!
此时,由于我使用了硬盘中的文件来传递多进程之间的参数,导致硬盘上会出现一个2G的临时文件。其次,每一个进程都要读取一次文件到内存中,所以导致了2G*5(5进程,主进程不工作)=10G的内存占用!天哪,有人知道怎么解决这个问题吗?
附上我的储存结构:
file_list 列表 其中的每一个元素为一个字典 存放一个待扫描文件的全部信息 包括它的全部字段数据
file_list[i]['file_path'] 储存路径
file_list[i]['file_md5'] 储存md5值,在检查过一个文件后,将md5值添加到表,下次可以直接得出结果
file_list[i]['file_hex'] 也是一个字典,其中存储了该文件全部的字段16进制值
file_list[i]['is_virus'] 判断是否为病毒的依据,便于总结
file_list[i]['file_type'] 判断文件类型,减少数据库检索量
file_list[i]['virus_infomarion'] 如果是病毒,关于它的病毒说明
其中,file_hex是最占据内存空间的。我不知道该怎样压缩它。我试图将他们替换为一个文件地址保存于硬盘中,在需要时读取并覆盖一个临时变量,这也许会改善内存,但硬盘问题依然无法解决,并且我会遇到硬盘读取速度的门槛,处理速度会进一步下降。
我的解答思路和尝试过的方法
第一个问题我试图优化,但是提升不大,我不太懂算法。
第二个问题我由于缺少相关文档与样本,无法实践获得信息。
第三个问题由于网上的教程太鱼龙混杂,不利于短时间内学习。
第四个问题我也许可以解决内存占用,但是硬盘问题我无法改善。因为你知道我不可能在使用时临时分析PE文件(我使用pefile库来分析pe文件,并自行造函数解析16进制文本。遭遇稍大的文件,就需要等候许久。所以我认为将信息提前获取是最好的办法) 希望有人给予指点,也许是我的认知太浅了一些。
我想要达到的结果
如上。