反混淆powershell
字数 1229 2025-08-19 12:40:52

PowerShell反混淆技术详解

1. PowerShell混淆技术概述

PowerShell因其强大的功能和灵活性成为攻击者常用的工具,攻击者常使用混淆技术来隐藏恶意代码。

1.1 常见混淆技术

  1. 大小写混淆

    • PowerShell变量和名称区分大小写
    • 示例:${dOmAiN} 代替 $domain
  2. 变量插入

    • 将变量插入命令声明中混淆字符串组件
    • 示例:&("{2}{1}{0}"-f'Path','est-','T') 代替 Test-Path
  3. 反引号(`)使用

    • 用作行连续符或特殊字符标记
    • 示例:${FALSE} 代替 $FALSE
  4. 字符串转换

    • 将字符串转化为命令操作
    • 示例:('Term'+'ina'+'ted '+'per'+' '+"$SrNumber")
  5. 空白字符滥用

    • 添加无关空白使代码难以阅读
  6. ASCII码替换

    • 使用ASCII代码表示字符
    • 示例:[CHar]65 代替 'A'
  7. 格式处理器

    # 输入
    "{1}PSScriptRoot{0}..{0}PSVersionCompare.psd1" -F '\','$'
    
    # 输出
    $PSScriptRoot\..\PSVersionCompare.psd1
    
  8. 替换函数

    # 输入
    ("pZyPSScriptRoot\Add-LTUser.ps1").replace('pZy','$')
    
    # 输出
    $PSScriptRoot\Add-LTUser.ps1
    

1.2 编码技术

  1. ASCII到十六进制

    • 字符A映射为十六进制41
  2. ASCII到十进制

    • 字符A映射为十进制65
  3. 完全编码示例

    .((gET-varIAble '*MDR*').nAME[3,11,2]-JoiN'')([chAR[]] (36,112,97,99,...))
    

2. 反混淆方法

2.1 反混淆流程

  1. 分类器构建:确定样本是否被编码、混淆或明文
  2. 循环应用:解码和反混淆逻辑,检查每次输出
  3. 清理网络:修正简单逻辑无法处理的特殊位

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 反混淆技术

  1. 移除反引号

    def remove_ticks(line):
        line = line[:-1].replace('`', '') + line[-1]
        return line
    
  2. 处理拼接字符串

    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
    
  3. 处理字符串赋值

    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. 结论

  1. PowerShell反混淆是一个复杂的过程,需要结合多种技术
  2. 机器学习方法(特别是LSTM和Seq2Seq网络)能有效提高反混淆效率
  3. 完整流程应包括:分类、解码、反混淆和清理四个步骤
  4. 反混淆后的代码虽不一定完全可执行,但极大提高了可读性和可分析性
  5. 攻击者混淆技术不断进化,防御者需要持续更新反混淆方法

通过系统化的反混淆流程,安全研究人员可以更有效地分析恶意PowerShell脚本,提高威胁检测和响应能力。

PowerShell反混淆技术详解 1. PowerShell混淆技术概述 PowerShell因其强大的功能和灵活性成为攻击者常用的工具,攻击者常使用混淆技术来隐藏恶意代码。 1.1 常见混淆技术 大小写混淆 : PowerShell变量和名称区分大小写 示例: ${dO m AiN} 代替 $domain 变量插入 : 将变量插入命令声明中混淆字符串组件 示例: &("{2}{1}{0}"-f'Path','est-','T') 代替 Test-Path 反引号( `)使用 : 用作行连续符或特殊字符标记 示例: ${FA L SE} 代替 $FALSE 字符串转换 : 将字符串转化为命令操作 示例: ('Term'+'ina'+'ted '+'per'+' '+"$SrNumber") 空白字符滥用 : 添加无关空白使代码难以阅读 ASCII码替换 : 使用ASCII代码表示字符 示例: [CHar]65 代替 'A' 格式处理器 : 替换函数 : 1.2 编码技术 ASCII到十六进制 : 字符A映射为十六进制41 ASCII到十进制 : 字符A映射为十进制65 完全编码示例 : 2. 反混淆方法 2.1 反混淆流程 分类器构建 :确定样本是否被编码、混淆或明文 循环应用 :解码和反混淆逻辑,检查每次输出 清理网络 :修正简单逻辑无法处理的特殊位 2.2 分类器构建 使用LSTM(长短期记忆)神经网络构建分类器: 2.3 解码技术 使用正则表达式进行模式匹配: 2.4 反混淆技术 移除反引号 : 处理拼接字符串 : 处理字符串赋值 : 格式处理器反混淆 : 找出 -f 或 -F 找出所有 -f 之前的 {[0-9]+} 类型占位符 找出所有 -f 之后的字符串和有效非字符串值 用值替换占位符 在同一行进行多次循环 2.5 逆向不可逆函数 使用Seq2Seq(序列到序列)网络学习和记忆变量: 找出混淆和非混淆文件中对应的单词 找出可能被混淆的变量和关键词 用混淆单词作为输入,非混淆单词作为期望输出 用之前的预测和新的输入数据预测下一个字符 3. 完整反混淆流程 文件状态分类 :确定文件是否被编码、混淆或明文 解码 :如果是编码文件,先解码 反混淆 :应用反混淆逻辑 清理 :使用清理网络修正剩余问题 3.1 示例 混淆前代码 : 混淆后代码 : 部分反混淆后 : 完全反混淆后 : 4. 结论 PowerShell反混淆是一个复杂的过程,需要结合多种技术 机器学习方法(特别是LSTM和Seq2Seq网络)能有效提高反混淆效率 完整流程应包括:分类、解码、反混淆和清理四个步骤 反混淆后的代码虽不一定完全可执行,但极大提高了可读性和可分析性 攻击者混淆技术不断进化,防御者需要持续更新反混淆方法 通过系统化的反混淆流程,安全研究人员可以更有效地分析恶意PowerShell脚本,提高威胁检测和响应能力。