【.com速译】本文介绍如何编写YARA规则,以发挥其最大功效。从空模板开始YARA规则是遵循基本但功能强大的语法的文本文件。YARA规则由三部分组成:Meta部分:这部分包含不经过处理但有助于用户理解内容的一般或特定信息。Stringssection:这个部分包含了所有需要在文件中搜索的字符串。条件部分:此部分定义匹配的条件。它可以只匹配一个或多个字符串,但也可以更复杂,我们将在本文后面看到。我强烈建议创建一个空模板,您将始终使用它来开始编写新规则。这样,您只需填充几个变量,添加所需的条件。rulesamplerule{meta:author="CedricPernet"version="0.1"date="2021/05/12"reference="anyusefulreference"strings:condition:}使用此模板,您可以快速编辑元数据和规则名称(在此示例中名为采样规则)。元数据可以是用户想要放在那里的任何东西。我总是使用版本号、日期、对可能的恶意软件散列的引用或提到我想要检测的内容的博客报告,以及作者字段。现在元数据已经写入,让我们开始编写我们的第一条规则。第一条规则,YARA规则,结合了字符串元素和条件。字符串可以是文本字符串、十六进制字符串或正则表达式。条件是布尔表达式,就像在其他编程语言中一样。最著名的条件是AND、OR和NOT。也可以使用关系、算术和按位运算符。这是第一条规则:rulenetcat_detection{meta:author="CedricPernet"version="0.1"date="2021/05/12"reference="netcatisafreetoolavailablefreelyonline"strings:$str1="gethostpoopfuxored"//thisisveryspecifictothenetcattool$str2="nc-l-pport[options]"condition:$str1or$str2}不妨解释一下这个名为netcat_detection的规则。在我们常用的元数据之后,字符串部分包含两个变量:str1和str2,当然可以随意命名。同样为了说明如何添加注释,第一个变量在末尾有一个注释。条件部分包含以下条件:str1或str2必须匹配。这可以写成更舒适的方式:condition:anyof($str*)如果我们有许多不同的变量并且只想匹配其中的任何一个,这将很有用。运行第一个规则现在让我们运行规则,我们将把它保存为一个名为rule1.yar的文件。我们想针对包含多个不同文件的文件夹运行它,其中两个是netcat软件的32位和64位版本(图A)。我们用于测试的系统是UbuntuLinux发行版,但这没关系,因为Yara可以轻松安装在Linux、Mac或Windows操作系统上。图A.在文件夹上运行YARA规则以检测特定软件正如预期的那样,YARA运行并返回与规则匹配的所有文件的名称。当然,您可以将任意数量的YARA规则放在一个文件中,这比拥有许多不同的规则文件更方便。使用-s选项运行YARA会显示与这些文件匹配的确切字符串(图B):图B.使用-s选项运行YARA会显示匹配的字符串可以在普通用户计算机上找到,因为它允许计算机在特定端口上连接和交换数据,可能被攻击者使用。当然,它也可能被IT或红队人员使用,因此请调查以确定为什么它会出现在公司网络的一台机器上。匹配基本字符串的更复杂的字符串足以在系统上查找文件。但是,该字符串在不同系统上的编码可能不同,或者可能会被攻击者轻微触发。例如,一个微小的变化可能会改变使用随机大小写的字符串的大小写。幸运的是,YARA可以轻松处理这个问题。在下面的YARA字符串部分,无论使用何种大小写,字符串都将匹配:strings:$str1="thisisit"等等。如果字符串使用每个字符两个字节进行编码,则可以使用“wide”修饰符,当然还可以相互组合。strings:$str1="thisisit"nocasewide想搜索ASCII和宽格式字符串,修饰符"ascii"可以和wide结合使用。strings:$str1="thisisit"asciiwidehexstringhexstring可以很方便的使用:strings:$str1={7572656C6E20}$str2={7572656C??20}$str3={7572[2-4]656C}这三个不同的十六进制变量。第一个搜索十六进制字符串上的精确序列。第二个通配符,由两个?字符,将搜索带有??的字符串任何十六进制值。第三个字符串搜索前两个字节,然后跳过两到四个字符,最后是最后两个字节。当某些序列在不同文件中不相同时,这很方便,但在两个已知序列之间显示可预测数量的随机字节。正则表达式就像在任何编程语言中一样,正则表达式对于检测可以用不同方式编写的某些内容非常有用。在YARA中,它们是通过使用以斜杠(/)字符开头和结尾的字符串来定义的。让我给你一个有意义的例子。在恶意软件二进制文件中,开发人员留下了调试信息,尤其是众所周知的PDB字符串。内容如下:D:\workspace\Malware_v42\Release\malw.pdb现在的想法是不仅要创建一个匹配该恶意软件的规则,还要创建它的所有不同版本,以防版本号发生变化。此外,我们决定从规则中排除“D”驱动器,因为开发人员也可能将它放在另一个驱动器上。我们给出了正则表达式(图C):图C.根据其PDB字符串和结果匹配所有版本的恶意软件的规则。出于演示目的,我们构建了一个名为newmalwareversion.exe的文件,其中包含三个不同的PDB字符串,每个字符串都有不同的版本号。我们的规则匹配所有这些。请注意,我们字符串中的\字符被加倍,因为\是需要转义的特殊字符,就像在C中一样。更复杂的条件条件可能比只匹配单个或多个字符串更聪明。您可以使用条件来评估字符串,指定字符串中的偏移量以查找、匹配文件大小,甚至使用循环。下面是我评论解释的几个例子:condition:2of($str*)//willmatchon2ofseveralstringsnamedstrfollowedbyanumber($str1or$str2)and($text1or$text2)//exampleofBooleanoperators#a==4and#b>6//stringaneedstobefoundexactlyfourtimesandstringbneedstobefoundstrictlymorethasixtimes$strat100//stringstrneedstobelocatedwithinthefileatoffset100$strin(500..filesize)//stringstrneedstobelocatedbetweenoffset500andendofffile.filesize>500KB//Onlyfileswhicharemorethan500KBbigwillbeconsidered原文标题:如何编写YARA规则以提高安全性和恶意软件检测,作者:CedricPernet,坑洼译【转载请注明原译者和出处为.com]
