You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell源码变量与函数名压缩及混淆方案咨询

PowerShell源码压缩与混淆方案(支持标识符重命名)

专用混淆工具

  • PSObfuscator:专门针对PowerShell的混淆工具,核心功能包括变量/函数名的短名称替换(如将$userInput改为$a)、字符串Base64编码、控制流扭曲,效果接近JavaScript的minify+混淆。可通过命令行直接处理脚本文件,也支持导入PowerShell模块后调用API,不仅能去除空格换行,还能彻底重命名所有自定义标识符,避免语义泄露。
  • Invoke-Obfuscation:老牌PowerShell混淆框架,提供多种混淆策略,其中-Rename模式可将变量、函数名替换为随机短字符串。支持分阶段混淆,可根据需求调整强度,从简单的标识符重命名到复杂的控制流混淆都能实现。

自定义AST实现方案

如果需要更灵活的控制,可利用PowerShell的AST(抽象语法树)API编写自定义混淆脚本,手动替换标识符。以下是一个基础示例:

# 读取目标脚本
$sourceScript = Get-Content "input.ps1" -Raw
# 解析AST
$ast = [System.Management.Automation.Language.Parser]::ParseInput($sourceScript, [ref]$null, [ref]$null)

$renameMap = @{}
$charIndex = 0
$charPool = [char[]]"abcdefghijklmnopqrstuvwxyz"

# 遍历并重命名变量
foreach ($varAst in $ast.FindAll({$args[0] -is [System.Management.Automation.Language.VariableAst]}, $true)) {
    $varName = $varAst.VariablePath.UserPath
    if (-not $renameMap.ContainsKey($varName) -and $varName -notmatch '^[a-z]$' -and $varName -notin $charPool) {
        $newName = $charPool[$charIndex % 26]
        if ($charIndex -ge 26) { $newName += [string][math]::Floor($charIndex / 26) }
        $renameMap[$varName] = $newName
        $charIndex++
    }
}

# 遍历并重命名函数
foreach ($funcAst in $ast.FindAll({$args[0] -is [System.Management.Automation.Language.FunctionDefinitionAst]}, $true)) {
    $funcName = $funcAst.Name
    if (-not $renameMap.ContainsKey($funcName) -and $funcName -notmatch '^[a-z]$' -and $funcName -notin $charPool) {
        $newName = $charPool[$charIndex % 26]
        if ($charIndex -ge 26) { $newName += [string][math]::Floor($charIndex / 26) }
        $renameMap[$funcName] = $newName
        $charIndex++
    }
}

# 执行替换
foreach ($oldName in $renameMap.Keys) {
    # 替换变量引用(如$oldName -> $newName)
    $sourceScript = $sourceScript -replace "\$$oldName\b", "`$($renameMap[$oldName])"
    # 替换函数定义(如function oldName -> function newName)
    $sourceScript = $sourceScript -replace "function\s+$oldName\b", "function $($renameMap[$oldName])"
}

# 最后压缩空格换行
$minifiedScript = $sourceScript -replace '\s+', ' ' -replace '^\s+|\s+$', ''
# 输出结果
Set-Content "output_minified.ps1" -Value $minifiedScript

注意事项

  • 混淆后的代码可能会被杀毒软件误报为恶意代码,建议在测试环境中验证。
  • 务必保留原始脚本的备份,混淆后的代码几乎无法反向解析。
  • 自定义AST脚本仅处理基础的标识符重命名,对于动态变量(如Get-Variable "var$i")或复杂作用域的代码可能无法完全兼容。

内容的提问来源于stack exchange,提问作者MegaBomber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:07:43