Yara的100天:.NET恶意软件的写作签名
如果.NET组件的Yara签名仅依赖字符串,则它们非常有限。我们探索更多的检测机会,包括IL代码,方法签名定义和特定自定义属性。即使在相关的恶意软件样本可能无法使用的情况下,有关基础.NET元数据结构,代币和流的知识也有助于制作更精确,有效的签名。
来源:G DATA _恶意软件假设我们想将所有这些信息用于Yara签名。
首先,方法的名称以及参数名称保存在#strings流中。因此,我们知道方法名称和参数名称将以零字节和UTF-8格式包装。如果我们需要基于屏幕截图编写签名,那么这不仅可以很好地为我们服务,而且还可以节省时间,如果有样本可用,因为我们不需要在十六进制编辑器中查找这些名称的表示形式。
其次,IL代码引用的任何字符串都存储在#US堆中编码的UTF-16。
我们已经讨论了案例1的#String和#us字符串。
第三,该方法的身体是实际的IL代码。我们在上一节中讨论了这一部分。
最后,方法签名保存在#BLOB流中。方法签名在此上下文中是指该方法期望的呼叫约定,参数类型和返回类型,不应与检测签名混淆。这种方法签名的构建如下:
method_sig :: = [ [,]*]
ildasm.exe显示了方法签名的字节序列。使用方法的完全合格的名称,显示字节序列的合适命令为:
iLdasm.exe /text /bytes /nobar /item="ns11.class9:: method_22“样本< /div>
以下显示了最后一行中使用方法签名字节序列的示例输出:
.method public hiedBysig实例void method_22(类[System.Drawing] System.Maping.imaging.bitmapdata param_55,类[mscorlib] System.io.memorystream param_56)cil param_56)cil tocaled sig sig:20 02 02 02 01 12 29 12 29 12 2D
方法签名具有以下含义:
此方法签名的最终十六进制模式是: