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

方法签名具有以下含义:

  • 0x20是调用惯例image_cee_cs_callconv_hasthis,这意味着这是一种实例方法,请参见[3]和p.146在[2]
  • 0x02是参数数,是2
  • 0x01是返回类型void,请参见[2]
  • 此方法签名的最终十六进制模式是: