为什么PowerShell的dot source运算符会将字符串转换为可执行命令
点源运算符的行为逻辑
PowerShell的点源运算符.有两类完全不同的使用场景,很多人只熟悉第一种,才会对这种混淆代码感到困惑:
- 当
.后接.ps1脚本文件路径、或者脚本块时,它会在当前作用域运行目标内容,把脚本内定义的变量、函数、别名都导入到当前作用域,这也是大家最熟悉的「点源导入」用法。 - 当
.后接命令名称、命令表达式时,它的行为和调用运算符&完全一致:直接执行对应的命令,返回命令执行结果,不会做额外的作用域导入操作。
你碰到的混淆代码$ORMEFyak=.('n'+'ew-obje'+'ct') NeT.WebcLIENt;就属于第二种场景:括号内的字符串拼接结果是合法的cmdlet名称new-object,点源运算符会直接执行这个cmdlet,把后面的Net.WebClient作为参数传入,执行结果赋值给变量,最终效果和直接写$var = New-Object Net.WebClient没有任何区别。
同理. "help"的运行逻辑也是如此:help是合法的cmdlet名称,点源运算符直接执行该命令,自然返回help cmdlet的输出内容。
这种特性也是恶意PowerShell脚本常用的混淆手段,利用大家对点源运算符的认知盲区,隐藏真实的命令调用逻辑。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

