反混淆Emotet powershell payload
字数 1198 2025-08-29 08:32:19
Emotet PowerShell Payload反混淆技术详解
一、Emotet概述
Emotet是2014年发现的银行木马,主要通过以下感染链传播:
- 用户收到钓鱼邮件并点击其中的链接
- 下载武器化的Word文档
- 文档诱使用户启用内容和宏
- 执行混淆的VBA代码
- VBA代码最终加载混淆的PowerShell命令
二、混淆技术原理
混淆技术主要有两个目的:
- 规避反病毒软件的签名检测
- 增加人工分析的时间和难度
三、Emotet使用的三种混淆方法
方法1:字符串替换
特征:
- 使用多个PowerShell的replace功能交换无用字符串和关键字
- 最终生成有效的PowerShell代码
示例代码:
('S'+'y'+'s'+'t'+'e'+'m').replace('S','I').replace('y','n').replace('s','v').replace('t','o').replace('e','k').replace('m','e')
反混淆方法:
- 在文本编辑器中进行字符串替换
- 使用正则表达式加速处理
- 编写Python脚本自动化处理
Python反混淆注意事项:
- 处理字符串连接符
+ - 处理字符类型映射(如int转char)
- 使用循环处理嵌套替换
方法2:字符串压缩
特征:
- 使用PowerShell内置的
DeflateStream类解压缩和执行压缩流
示例代码:
[IO.Compression.CompressionMode]::Decompress);$s.Read($b,0,$b.Length)|Out-Null;$d=(New-Object Text.UTF8Encoding).GetString($b);Invoke-Expression $d
反混淆方法:
- 使用PowerShell解压缩字符串
- 手动移除前两个括号中的命令(通常是混淆的Invoke-Expression)
- 使用zlib库处理(需注意DeflateStream不需要zlib文件头)
Python实现:
import zlib
# 使用zlib.MAX_WBITS负值跳过header位
decompressed = zlib.decompress(compressed_data, -zlib.MAX_WBITS)
方法3:ASCII码数组
特征:
- 使用数字数组表示ASCII字符
- 通过切割函数分割字符串进行混淆
示例代码:
$s=('73,110,118,111,107,101,45,69,120,112,114,101,115,115,105,111,110').split(',')
$d='';foreach($c in $s){$d+=[char][int]$c};Invoke-Expression $d
反混淆方法:
- 使用split方法分割字符串
- 使用chr()函数将数字映射为字符
Python实现:
ascii_array = '73,110,118,111,107,101,45,69,120,112,114,101,115,115,105,111,110'
decoded = ''.join([chr(int(c)) for c in ascii_array.split(',')])
# 结果为"Invoke-Expression"
四、Invoke-Expression的混淆技巧
PowerShell中常见的Invoke-Expression混淆方法:
-
使用缩写:
- 完整命令:
Invoke-Expression - 标准缩写:
iex
- 完整命令:
-
字符串拼接:
$vERBOsepreFErEncE.tOStRIng()[1,3]+'X'-JoIn''$verbosepreference默认值为"SilentlyContinue"- 取第2和第4个字符(i和e)加上X组成"iex"
-
变量存储:
$a='Inv';$b='oke';$c='-Exp';$d='ression';$cmd=$a+$b+$c+$d
五、真实Payload分析
解混淆后的典型Emotet PowerShell payload功能:
- 使用
WebClient类连接硬编码域名 - 在
%TEMP%目录下载二进制文件 - 加载下载的文件
- 使用
break和try-catch确保下载完成前能连接到域名
六、分析建议
- 安全环境:始终在隔离的虚拟环境中分析恶意代码
- 分步处理:先识别混淆类型,再针对性解混淆
- 工具辅助:结合文本编辑器、正则表达式和脚本语言提高效率
- 关注IoC:解混淆后重点关注硬编码域名、URL和文件路径等指标
七、自动化反混淆脚本示例
import re
import zlib
def deobfuscate_replace(code):
# 处理字符串替换型混淆
while True:
new_code = re.sub(r"\.replace$'(.)','(.)'$", lambda m:
code.replace(m.group(1), m.group(2)), code)
if new_code == code:
break
code = new_code
return code
def deobfuscate_ascii(code):
# 处理ASCII数组型混淆
matches = re.findall(r"$(.*?)$\.split$'(.*?)'$", code)
for match in matches:
nums, sep = match
decoded = ''.join([chr(int(c)) for c in nums.split(sep)])
code = code.replace(f"({nums}).split('{sep}')", f"'{decoded}'")
return code
def deobfuscate_deflate(code):
# 处理Deflate压缩型混淆
matches = re.findall(r"FromBase64String$'(.*?)'$", code)
for match in matches:
compressed = base64.b64decode(match)
decompressed = zlib.decompress(compressed, -zlib.MAX_WBITS)
code = code.replace(f"FromBase64String('{match}')", f"'{decompressed.decode()}'")
return code
通过系统性地应用这些技术,可以有效分析Emotet等恶意软件使用的混淆PowerShell payload。