PowerShell Pro Obfuscator 通过重命名、多态字符串和整数加密、控制流平坦化、有限状态自动机(FSA)、VM 引擎、自防御完整性检查、保护链接器和反调试探针来保护专有的 .ps1 脚本。
通过 GUI、CLI、在线工具或 API,对 PowerShell .ps1 脚本进行混淆、虚拟化与保护,支持多态字符串加密、VM 引擎、有限状态自动机变换、自完整性及反调试检查。
更多技术细节、下载和文档,请访问:
https://www.pelock.com/products/powershell-pro-obfuscator

支持 Windows 和 Linux:
提供多种编程 API:
在线混淆界面:
脚本通常以纯文本 .ps1 文件形式分发,或嵌入到模块中。这种便利性意味着任何能访问文件的人都可以读取完整逻辑、在字符串中搜寻凭据或 API 密钥,并窃取你的算法——除非你采取额外措施来隐藏意图。
PowerShell 是一种基于 .NET 的跨平台 Shell 和脚本语言。它广泛用于 Windows 和 Linux 上的自动化、配置、DevOps 流水线和端点管理。
PowerShell Pro Obfuscator 提供了许多高级混淆、虚拟化和保护策略。你可以轻松地在保护强度与体积和性能之间进行权衡。

强大的混淆PowerShell Pro Obfuscator 使用最先进的混淆策略,如多态字符串加密、整数和浮点数加密以及诱饵噪声。结果在隐藏字面量和结构的同时,保持了经过验证的运行时行为。
代码虚拟化选定的语句被提升到随机生成的 VM 引擎操作码中,带有打乱的 switch 分支、诱饵操作码和混淆的分发器循环。分析人员必须解读虚拟机,而不是阅读纯文本 PowerShell。
有限状态自动机(FSA)有限状态自动机(FSA)混淆将线性的 PowerShell 语句块重写为双状态自动机,带有不透明调度器和打乱的分发处理程序。分析人员无法从上到下阅读代码,而必须跟踪数字状态、转换表和诱饵路径来重建原始顺序。
反调试反调试保护插入多态探针,用于检测附加的调试器、PowerShell 断点、调试偏好和跟踪模式以及相关的主机信号。当检查触发时,混淆后的脚本会静默退出,而不是在交互式分析下泄露受保护的逻辑。
自完整性检查引导探针验证磁盘上脚本的形态(函数计数和完整性令牌),并在文件不再匹配混淆构建时设置篡改密钥。字符串解密器会使用该密钥,因此被修补的脚本返回的是垃圾数据而不是明文。这种自防御层提高了随意反混淆和文件编辑的成本。
保护链接器一个后期处理阶段会接入蜜罐解析器、带随机参数的虚假辅助调用以及仅在引导完成前保持活动的浅栈绊线。提取的代码片段保留了看起来在静态审查下真实的嘈杂调用面。在成功完整性检查后的正常执行保持不变。
看看这个例子——同一个脚本在混淆后变得难以一眼读懂。
function Get-Greeting {
param([string]$Name)
Write-Host "Hello World from $Name!"
}
Get-Greeting "PowerShell Pro Obfuscator"
$script:_HnJTskg = 0
$jwNTQ = 297 * 400 + 36
$x4e8bfda = [Math]::Abs($jwNTQ - 8074)
$_EvKocNn = [Math]::Max($jwNTQ, $x4e8bfda) - [Math]::Min($jwNTQ, $x4e8bfda)
[void]$_EvKocNn
$script:_jUoXkBYh = 0
function gnJjzMCN3V8P {
param([int]$slot, [int]$salt, [int]$guard)
if (-not ((Get-Variable -Name _HnJTskg -Scope Script -ErrorAction SilentlyContinue).Value)) { return '' }
@('JFE', 'm0ao', 'R8Ysw') | ForEach-Object { $_.ToUpper() } | Out-Null
if ((((($slot * 31) + $salt) -band 65535) -ne $guard)) { return '' }
$tk = (Get-Variable -Name _jUoXkBYh -Scope Script -ErrorAction SilentlyContinue).Value
$IEm39CSpDOEFp = @{ 'Ouj1' = 455; 'vjzO' = 170; 'IQNV' = 291 }
$IEm39CSpDOEFp['R5LrM'] = $IEm39CSpDOEFp['Ouj1'] + $IEm39CSpDOEFp['vjzO']
$YWxSO = ($IEm39CSpDOEFp.Values | Measure-Object -Sum).Sum
[void]$YWxSO
if ($null -eq $tk) { [long]$tk = 0 }
$v93a130f2e4 = 508
switch ($v93a130f2e4) {
524 { $_GYF7IA14Go = 'H1Vph' }
561 { $_GYF7IA14Go = 'HAWoB' }
default { $_GYF7IA14Go = $v93a130f2e4 * 2 }
}
[void]$_GYF7IA14Go
$dk = (Get-Variable -Name vb6a18ffee4 -Scope Script -ErrorAction SilentlyContinue).Value
try { $xgLN5KZyEusFo7 = [Math]::Sqrt(850) } finally { [void]$xgLN5KZyEusFo7 }
if ($null -eq $dk) { [long]$dk = 0 }
$d = @(46866, 46865)
if ((((-not 113))-and(([int](272 -ne 272) -eq 21)))-and(([Math]::Sign(-12) -eq 4))) { $w4iTzi2hooy1GW = @(711, 562, 665); $w4iTzi2hooy1GW = ($w4iTzi2hooy1GW | Measure-Object -Sum).Sum }
$r = ''
for ($s9qOSpiZzufQlVyV = 0; $s9qOSpiZzufQlVyV -lt $d.Length; $s9qOSpiZzufQlVyV++) {
[long]$v = [long]$d[$s9qOSpiZzufQlVyV]
for ($jL9gL7PEtQeIS = 2; $jL9gL7PEtQeIS -ge 0; $jL9gL7PEtQeIS--) {
for ($PsbomDHxAy = 2; $PsbomDHxAy -ge 0; $PsbomDHxAy--) {
[long]$v = [long]$v + ([long](https://github.com/pelock/powershell-pro-obfuscator-python/blob/HEAD/230))
}
}
for ($zhH33vzxjIzegl9 = 0; $zhH33vzxjIzegl9 -ge 0; $zhH33vzxjIzegl9--) {
[long]$v = [long]$v + ([long]([int]((((((236 + (-3 * $s9qOSpiZzufQlVyV) + (3 * $zhH33vzxjIzegl9))) % 256) + 256) % 256))))
[long]$v = [long]$v -bxor ([long](https://github.com/pelock/powershell-pro-obfuscator-python/blob/HEAD/53766))
}
[long]$v = [long]$v - ([long]($salt + $slot + $tk + $dk + 0))
if ([long]$v -ge 0 -and [long]$v -le 0xFFFF) { $r += [char][int][long]$v }
elseif ([long]$v -ge 0x10000 -and [long]$v -le 0x10FFFF) { $r += [System.Char]::ConvertFromUtf32([int][long]$v) }
}
return $r
}
and more...
如果你只有混淆后的文本而没有原始脚本副本,你还能认出原始意图吗?

引擎将 PowerShell 源码解析为 AST 树,然后应用可选择的变换:标识符重命名、控制流平坦化、有限状态自动机(FSA)、VM 虚拟化、多态字符串和整数加密、噪声和诱饵插入、自防御完整性探针、保护链接器以及反调试检查。许多技术是该产品特有的;部分思路与我们的其他保护工具共享。

当所有处理阶段完成后,引擎会生成一个新的 .ps1 文件。PowerShell 语法和宿主环境中的边界情况意味着你应该始终在目标运行时中测试输出。
不要冒险,使用 PowerShell Pro Obfuscator 来混淆、虚拟化和保护你的 PowerShell 脚本和算法。
我们在混淆技术和代码混淆器方面有着悠久的历史(参见我们的 x86 Assembly、AutoIt 和 Java 混淆器)。
我们积极修复 bug、研究并开发新的混淆策略。
你可以信赖我们在这一领域的专业知识和支持。
WebApi 接口的首选安装方式是通过 pip。
运行:
pip install powershell-pro-obfuscator
或
python3 -m pip install powershell-pro-obfuscator
然后在你的源代码中添加以下导入:
from powershellproobfuscator import PowerShellProObfuscator
安装包可在 https://pypi.org/project/powershell-pro-obfuscator/ 获取。
#!/usr/bin/env python
###############################################################################
#
# PowerShell Pro Obfuscator WebApi 接口使用示例。
#
# 在此示例中,我们将使用默认选项混淆示例源码。
#
# 版本 : v1.0.0
# 语言 : Python
# 作者 : Bartosz Wójcik
# 网页 : https://www.pelock.com
#
###############################################################################
#
# 包含 PowerShell Pro Obfuscator 模块
#
from powershellproobfuscator import PowerShellProObfuscator
#
# 如果你不想使用 Python 模块,可以直接从文件导入
#
#from pelock.powershellproobfuscator import PowerShellProObfuscator
#
# 创建 PowerShell Pro Obfuscator 类实例(我们使用激活密钥)
#
myPowerShellProObfuscator = PowerShellProObfuscator("ABCD-ABCD-ABCD-ABCD")
#
# PowerShell 格式的源码
#
scriptSourceCode = """function Get-Greeting {
param([string]$Name)
Write-Host "Hello World from $Name!"
}
Get-Greeting "PowerShell Pro Obfuscator\""""
#
# 默认情况下所有混淆选项都已启用,因此我们可以直接调用
#
result = myPowerShellProObfuscator.obfuscate_script_source(scriptSourceCode)
#
# 也可以传递 PowerShell 脚本文件路径而不是包含源码的字符串,例如
#
# result = myPowerShellProObfuscator.obfuscate_script_file("/path/to/project/script.ps1")
#
# result[] 数组保存混淆结果以及其他信息
#
# result["error"] - 错误代码
# result["output"] - 混淆后的代码
# result["demo"] - 是否使用了演示模式(使用了无效或空的激活密钥)
# result["credits_left"] - 此操作后剩余的用量积分
# result["credits_total"] - 此激活代码的总积分
# result["expired"] - 如果这是激活密钥的最后一次用量积分,则设置为 True
#
if result and "error" in result:
# 显示混淆后的代码
if result["error"] == PowerShellProObfuscator.ERROR_SUCCESS:
# 格式化输出代码以便 HTML 显示
print(result["output"])
else:
print(f'发生错误,错误代码:{result["error"]}')
else:
print("尝试混淆代码时发生了意外情况。")
#!/usr/bin/env python
###############################################################################
#
# PowerShell Pro Obfuscator WebApi 接口使用示例。
#
# 在此示例中,我们将使用自定义选项混淆示例源码。
#
# 版本 : v1.0.0
# 语言 : Python
# 作者 : Bartosz Wójcik
# 网页 : https://www.pelock.com
#
###############################################################################
#
# 包含 PowerShell Pro Obfuscator 模块
#
from powershellproobfuscator import PowerShellProObfuscator
#
# 如果你不想使用 Python 模块,可以直接从文件导入
#
#from pelock.powershellproobfuscator import PowerShellProObfuscator
#
# 创建 PowerShell Pro Obfuscator 类实例(我们使用激活密钥)
#
myPowerShellProObfuscator = PowerShellProObfuscator("ABCD-ABCD-ABCD-ABCD")
#
# 是否应压缩源码(输入和压缩后)
#
myPowerShellProObfuscator.enableCompression = False
#
# 全局混淆选项
#
# 如果某个混淆策略失败或你不想使用它,可以在全局范围内禁用它
# 而无需修改源码
#
# 默认情况下所有混淆策略都已启用
#
#
# 防止篡改受保护代码(完整性验证)
#
myPowerShellProObfuscator.selfDefending = True
#
# 保护链接器(诱饵调用图)
#
myPowerShellProObfuscator.protectionLinker = True
#
# 将变量名重命名为随机字符串值
#
myPowerShellProObfuscator.renameVariables = True
#
# 将参数名重命名为随机字符串值
#
myPowerShellProObfuscator.renameParameters = True
#
# 将函数名重命名为随机字符串值
#
myPowerShellProObfuscator.renameFunctions = True
#
# 打乱输出源码中的函数顺序
#
myPowerShellProObfuscator.shuffleFunctions = True
#
# 通过控制流平坦化改变线性代码执行流程
#
myPowerShellProObfuscator.controlFlowFlatten = True
#
# 将语句块重写为有限状态自动机(状态机混淆)
#
myPowerShellProObfuscator.stateMachine = True
#
# 将选定的语句提升到 VM 引擎中(虚拟化语句)
#
myPowerShellProObfuscator.vmStrategy = True
#
# 加密整数
#
myPowerShellProObfuscator.encryptIntegers = True
#
# 将字符串拆分为拼接的块
#
myPowerShellProObfuscator.splitStrings = True
#
# 使用随机生成的多态加密算法加密字符串
#
myPowerShellProObfuscator.encryptStrings = True
#
# 将整数移动到数组中
#
myPowerShellProObfuscator.integersToArrays = True
#
# 将浮点数移动到数组中
#
myPowerShellProObfuscator.floatsToArrays = True
#
# 插入死代码
#
myPowerShellProObfuscator.insertDeadCode = True
#
# 用等效的复杂表达式替换布尔条件
#
myPowerShellProObfuscator.complexifyBooleans = True
#
# 通过浮点数学表示整数
#
myPowerShellProObfuscator.integersToFloating = True
#
# 加密浮点数
#
myPowerShellProObfuscator.encryptFloating = True
#
# 插入诱饵函数
#
myPowerShellProObfuscator.decoyFunctions = True
#
# 插入反调试检测
#
myPowerShellProObfuscator.detectDebugger = True
#
# 插入虚假的点源注释标记
#
myPowerShellProObfuscator.fakeDotSourceMarkers = True
#
# 插入不透明谓词分支
#
myPowerShellProObfuscator.opaqueBranches = True
#
# 插入脚本块诱饵
#
myPowerShellProObfuscator.scriptblockDecoys = True
#
# 插入 here-string 填充
#
myPowerShellProObfuscator.literalPadding = True
#
# 使用间接命令调用
#
myPowerShellProObfuscator.reflectInvokeCommands = True
#
# 将字符串片段存储在字符代码数组保险库中
#
myPowerShellProObfuscator.stringCharArrayVault = True
#
# 将代码包装在带有死噪声的 try/finally 块中
#
myPowerShellProObfuscator.tryFinallyNoise = True
#
# 应用冗余的 xor / 仿射整数掩码
#
myPowerShellProObfuscator.affineIntegerMask = True
#
# 插入死事件/定时器存根
#
myPowerShellProObfuscator.eventStub = True
#
# 从输出源码中移除注释
#
myPowerShellProObfuscator.removeComments = True
#
# PowerShell 格式的源码
#
scriptSourceCode = """function Get-Greeting {
param([string]$Name)
Write-Host "Hello World from $Name!"
}
Get-Greeting "PowerShell Pro Obfuscator\""""
#
# 默认情况下所有混淆选项都已启用,因此我们可以直接调用
#
result = myPowerShellProObfuscator.obfuscate_script_source(scriptSourceCode)
#
# 也可以传递 PowerShell 脚本文件路径而不是包含源码的字符串,例如
#
# result = myPowerShellProObfuscator.obfuscate_script_file("/path/to/project/script.ps1")
#
# result[] 数组保存混淆结果以及其他信息
#
# result["error"] - 错误代码
# result["output"] - 混淆后的代码
# result["demo"] - 是否使用了演示模式(使用了无效或空的激活密钥)
# result["credits_left"] - 此操作后剩余的用量积分
# result["credits_total"] - 此激活代码的总积分
# result["expired"] - 如果这是激活密钥的最后一次用量积分,则设置为 True
#
if result and "error" in result:
# 显示混淆后的代码
if result["error"] == PowerShellProObfuscator.ERROR_SUCCESS:
# 格式化输出代码以便 HTML 显示
print(result["output"])
else:
print(f'发生错误,错误代码:{result["error"]}')
else:
print("尝试混淆代码时发生了意外情况。")
#!/usr/bin/env python
###############################################################################
#
# PowerShell Pro Obfuscator WebApi 接口使用示例。
#
# 在此示例中,我们将验证激活密钥的状态。
#
# 版本 : v1.0.0
# 语言 : Python
# 作者 : Bartosz Wójcik
# 网页 : https://www.pelock.com
#
###############################################################################
#
# 包含 PowerShell Pro Obfuscator 模块
#
from powershellproobfuscator import PowerShellProObfuscator
#
# 如果你不想使用 Python 模块,可以直接从文件导入
#
#from pelock.powershellproobfuscator import PowerShellProObfuscator
#
# 创建 PowerShell Pro Obfuscator 类实例(我们使用激活密钥)
#
myPowerShellProObfuscator = PowerShellProObfuscator("ABCD-ABCD-ABCD-ABCD")
#
# 登录到服务
#
result = myPowerShellProObfuscator.login()
#
# result[] 数组保存有关许可证的信息
#
# result["demo"] - 是否为演示模式(使用了无效或空的激活密钥)
# result["credits_left"] - 此操作后剩余的用量积分
# result["credits_total"] - 此激活代码的总积分
# result["string_limit"] - 允许的最大源码大小(演示模式为 1000 字节)
#
if result:
print(f'演示版本状态 - {"True" if result["demo"] else "False"}')
print(f'剩余用量积分 - {result["credits_left"]}')
print(f'总用量积分 - {result["credits_total"]}')
print(f'最大源码大小 - {result["string_limit"]}')
else:
print("尝试登录服务时发生了意外情况。")
PowerShell Pro Obfuscator 的在线界面可在以下地址获取:
https://www.pelock.com/powershell-pro-obfuscator/



你可以从以下地址下载:
https://www.pelock.com/products/powershell-pro-obfuscator/download
安装包包含额外的命令行界面:

PowerShell Pro Obfuscator 附带适用于 Windows 和 Linux 自动化的命令行界面。
使用它可以将混淆集成到构建服务器、CI 作业或批量打包中。
Bartosz Wójcik