反混淆powershell
字数 1229 2025-08-19 12:40:52
PowerShell反混淆技术详解
1. PowerShell混淆技术概述
PowerShell因其强大的功能和灵活性成为攻击者常用的工具,攻击者常使用混淆技术来隐藏恶意代码。
1.1 常见混淆技术
-
大小写混淆:
- PowerShell变量和名称区分大小写
- 示例:
${dOmAiN}代替$domain
-
变量插入:
- 将变量插入命令声明中混淆字符串组件
- 示例:
&("{2}{1}{0}"-f'Path','est-','T')代替Test-Path
-
反引号(`)使用:
- 用作行连续符或特殊字符标记
- 示例:
${FALSE}代替$FALSE
-
字符串转换:
- 将字符串转化为命令操作
- 示例:
('Term'+'ina'+'ted '+'per'+' '+"$SrNumber")
-
空白字符滥用:
- 添加无关空白使代码难以阅读
-
ASCII码替换:
- 使用ASCII代码表示字符
- 示例:
[CHar]65代替'A'
-
格式处理器:
# 输入 "{1}PSScriptRoot{0}..{0}PSVersionCompare.psd1" -F '\','$' # 输出 $PSScriptRoot\..\PSVersionCompare.psd1 -
替换函数:
# 输入 ("pZyPSScriptRoot\Add-LTUser.ps1").replace('pZy','$') # 输出 $PSScriptRoot\Add-LTUser.ps1
1.2 编码技术
-
ASCII到十六进制:
- 字符A映射为十六进制41
-
ASCII到十进制:
- 字符A映射为十进制65
-
完全编码示例:
.((gET-varIAble '*MDR*').nAME[3,11,2]-JoiN'')([chAR[]] (36,112,97,99,...))
2. 反混淆方法
2.1 反混淆流程
- 分类器构建:确定样本是否被编码、混淆或明文
- 循环应用:解码和反混淆逻辑,检查每次输出
- 清理网络:修正简单逻辑无法处理的特殊位
2.2 分类器构建
使用LSTM(长短期记忆)神经网络构建分类器:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
model = Sequential()
model.add(Embedding(num_encoder_tokens, embedding_vector_length, input_length=sample_len))
model.add(LSTM(100))
model.add(Dropout(0.2))
model.add(Dense(len(classes), activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=64)
2.3 解码技术
使用正则表达式进行模式匹配:
ascii_char_reg = r'([0-9]{1,3})[, \)]+'
ascii_chars = re.findall(ascii_char_reg, file_text)
chars = [chr(int(ac)) for ac in ascii_chars]
file_text = ''.join(chars)
2.4 反混淆技术
-
移除反引号:
def remove_ticks(line): line = line[:-1].replace('`', '') + line[-1] return line -
处理拼接字符串:
def splatting(line): splat_reg = r"""(&$ *['"]{1}(.+)?['"]{1} *?$)""" matches = re.findall(splat_reg, line) for match in matches: line = line.replace(match[0], match[1]) return line -
处理字符串赋值:
def string_by_assign(line): match_reg = r'(?:(
\[[sS][tT][rR][iI][nN][gG] \]
)([
\[ \]
A-Za-z0-9]+)[\),.]+)'
matches = re.findall(match_reg, line)
for match in matches:
replace_str = match[0] + match[1]
line = line.replace(replace_str, "'" + match[1] + "'")
return line
4. **格式处理器反混淆**:
- 找出`-f`或`-F`
- 找出所有`-f`之前的`{[0-9]+}`类型占位符
- 找出所有`-f`之后的字符串和有效非字符串值
- 用值替换占位符
- 在同一行进行多次循环
### 2.5 逆向不可逆函数
使用Seq2Seq(序列到序列)网络学习和记忆变量:
1. 找出混淆和非混淆文件中对应的单词
2. 找出可能被混淆的变量和关键词
3. 用混淆单词作为输入,非混淆单词作为期望输出
4. 用之前的预测和新的输入数据预测下一个字符
## 3. 完整反混淆流程
1. **文件状态分类**:确定文件是否被编码、混淆或明文
2. **解码**:如果是编码文件,先解码
3. **反混淆**:应用反混淆逻辑
4. **清理**:使用清理网络修正剩余问题
### 3.1 示例
**混淆前代码**:
```powershell
param(
[Parameter(Mandatory=$false)] $Domain = 'airtran.com',
[Parameter(Mandatory=$true)] $SrNumber,
[Parameter(Mandatory=$false)] $TargetPath = 'OU=Disabled,OU=Airtran Users,OU=Airtran,DC=airtran,DC=com',
[Parameter(Mandatory=$true)] $User
)
混淆后代码:
param(
[Parameter(MANdAtORy=${FA`L`SE})] ${dO`m`AiN} = ("{2}{1}{0}{3}" -f 'a','rtr','ai','n.com'),
[Parameter(MandatOrY=${tr`UE})] ${Sr`NUM`BER},
[Parameter(mAnDATORY=${F`AL`SE})] ${targET`p`Ath} = ("{10}{11}{1}{2}{9}{14}{3}{12}{5}{7}{4}{0}{8}{13}{6}" -f'=a','=Airtr','a','ir',',DC','a','C=com','n','i','n','OU=Disab','led,OU','tr','rtran,D',' Users,OU=A'),
[Parameter(ManDAtOrY=${T`RUe})] ${us`er}
)
部分反混淆后:
param(
[Parameter(MAndatoRy=${fAlSe})] ${dOMAiN} = "airtran.com",
[Parameter(MaNDATorY=${tRUe})] ${SRNUmBer},
[Parameter(mandaTOry=${FAlsE})] ${tArGETpAtH} = "OU=Disabled,OU=Airtran Users,OU=Airtran,DC=airtran,DC=com",
[Parameter(maNdaToRy=${TRue})] ${UsER}
)
完全反混淆后:
param(
[Parameter(Mandatory=$false)] $domain = "airtran.com",
[Parameter(Mandatory=$true)] $srnUmber,
[Parameter(Mandatory=$false)] $targetPath = "OU=Disabled,OU=Airtran Users,OU=Airtran,DC=airtran,DC=com",
[Parameter(Mandatory=$true)] $User
)
4. 结论
- PowerShell反混淆是一个复杂的过程,需要结合多种技术
- 机器学习方法(特别是LSTM和Seq2Seq网络)能有效提高反混淆效率
- 完整流程应包括:分类、解码、反混淆和清理四个步骤
- 反混淆后的代码虽不一定完全可执行,但极大提高了可读性和可分析性
- 攻击者混淆技术不断进化,防御者需要持续更新反混淆方法
通过系统化的反混淆流程,安全研究人员可以更有效地分析恶意PowerShell脚本,提高威胁检测和响应能力。