本篇博客记录学习姜晔老师在恶意程序分析与高级对抗中“脚本查杀”一节,欢迎大家一起去学习!
恶意程序分析与高级对抗技术 - Windows - 看雪学苑-看雪-安全培训|安全招聘|www.kanxue.com
Q:脚本木马有什么特点?
A:编写简单,易于免杀,难以封堵
静态查杀
Q:下载者木马的功能有哪些?
A:连接网站执行下载操作;运行下载下来的文件
Q:如何对下载者木马样本进行处理?
A:
1.确定连接的网站,将网站加入黑名单
2.分析下载下来的文件,归类并提取特征
3.将JS木马样本分类,提取特征
4.分析恶意网站归属,结合社工库,找出木马的编写者
Q:js脚本文件是依托什么运行的呢?
A:wscript.exe
Q:如何在OD中动态调试js文件呢?
A:首先在OD中载入wscript.exe,然后选择 调试——》参数,输入js脚本的路径之后,重新载入
Q:如何确定连接的网址呢?
A:1.在关键函数处下断点,比如说UrlCanonicializeA,该函数用于将url转换为规范格式
2.通过动态监控(wireshark或火绒剑)其网络行为来确定连接的url
JS躲避查杀的方法:
js文件的图标一般无法更改,所以一般在文件名下手,
诸如:invoice、payment、booking、schedule等与财务或行政相关的词汇
针对非安全人员以及需要处理很多业务文件 的员工来说迷惑性就比较高
Q:常见的伪装手段包括哪些?
A:多重后缀,RLO转义字符
Q:如何避免呢?
A:显示文件后缀名,显示文件的详细信息
特征码查杀
Q:特征码查杀常见的两种方式?
A:1.直接对病毒样本进行哈希运算,将哈希值加入病毒库,这也是云查杀技术采用的方式
缺点:即使病毒容易躲避查杀,即使很小的变化也会影响最后的哈希结果
2.在病毒内部提取特征码,结合相应的偏移进行查找
缺点:如果只针对某一局部的偏移很容易被黑客使用注释或其他手段实现修改偏移量,从而躲避掉查杀
解决方案:对文件进行切割,从多个部分来提取特征码
黑客新攻击方法:编写脚本程序在文件中的多处添加注释
启发式查杀
Q:什么是启发式查杀?
A:分析程序指令出现的顺序,或者特定的组合情况以及调用的函数一家参数等是否属于恶意行为特征,来判断目标程序是不是病毒程序。
静态启发查杀本质:可以字符串的选取与匹配工作
实战
import re
def remove_comments(code):
# 正则表达式匹配注释并替换为空字符串
pattern = r"(\".*?\"|\'.*?\')|(/\*.*?\*/|//[^\r\n]*$)"
code = re.sub(pattern, lambda m: m.group(1) if m.group(1) else '', code)
return code
def remove_quotes_plus(code):
# 去除双引号和加号
code = code.replace('"', '').replace('+', '')
return code
def convert_ascii(code):
# 将存在的ASCII转化为字符
code = re.sub(r'\b(\d{1,3})\b', lambda m: chr(int(m.group(1))), code)
return code
def check_for_keywords(code):
# 判断是否存在关键字
keywords = ['get', 'http']
for keyword in keywords:
if keyword in code:
return True
return False
def detect_trojan(filename):
with open(filename, 'r') as file:
code = file.read()
code = remove_comments(code)
code = remove_quotes_plus(code)
code = convert_ascii(code)
if check_for_keywords(code):
print("The file {} contains a trojan.".format(filename))
else:
print("The file {} is clean.".format(filename))
# 测试
detect_trojan('trojan')
注意以上代码知识简单的判断文件中是否存在get和http字符
Q:没有把过滤混淆之后的文件保存,且正常的下载程序中也存在下载操作,也会涉及到get和http关键字,如何把恶意程序和正常下载程序区分开呢?如何减少误报率呢?
A:由于正常的脚本文件不会采用五花八门的混淆手段,而恶意的脚本文件中存在大量混淆,在去混淆之后文件的大小发生了显著的变化,因此可以对比解密前后文件的大小,此处认为如果相差是被以上就认为混淆技术存在。
# -*- coding: utf-8-*-
import sys
import re
import os
# 利用正则表达式修改脚本文件
def RegularModify(fileName):
# 正则表达式匹配注释(/**/)
pattern_notes = re.compile(r'/\*{1,2}[\s\S]*?\*/')
# 正则表达式匹配双引号和加号(“+”)
pattern_plus = re.compile(r'"[\s\S]{0,1}\+[\s\S]{0,1}"')
# 正则表达式匹配ASCII码(\x)
pattern_ascii= re.compile(r'(\\x([0-9][0-9A-Za-z]))')
# 打开原始文件
oriFile = open(fileName)
# 读取原始文件
s = oriFile.read()
# 删除原始文件中的注释
s = pattern_notes.sub('',s)
# 删除原始文件中的双引号和加号
s = pattern_plus.sub('',s)
# 将文件中的ASCII码转换为字符
generateFile = open(fileName + "_Gen",'w')
ret = pattern_ascii.findall(s)
for i in ret:
s = s.replace(i[0], chr(int(i[1],16)))
generateFile.write(s)
generateFile.close()
oriFile.close()
# 文件判定
def FileDetect(fileName):
ori = os.path.getsize(fileName)
after = os.path.getsize(fileName + "_Gen")
generateFile = open(fileName + "_Gen",'r')
download = 0; file = 0;
# 对生成的文件进行关键字的匹配
for lines in generateFile:
if lines.find('GET') != -1 and lines.find('http') != -1:
download += 1
elif lines.find('.exe') != -1 and lines.find('%TEMP%') != -1:
file += 1
# 依据上述对比结果来判断文件是否为木马
if download and file and (ori/after>10):
print (fileName + " detected HEUR:Trojan-Downloader.JS.Notes.gen")
else:
print (fileName + " Clean")
generateFile.close()
def Main():
filename = 'Trojan' # 文件名
RegularModify(filename)
FileDetect(filename)
Main()