0x01 Invoke-Expression
Invoke-Expression 是 PowerShell 中的一个强大命令,用于执行一个字符串内容中包含的命令、表达式或脚本。通过 Invoke-Expression,可以将字符串参数中的内容当作实际的 PowerShell 命令来执行,具体语法如下所示。
Invoke-Expression [-Command] <String> [<CommonParameters>]
-Command: 表示需要执行的字符串内容,可以是一个完整的命令或脚本。-CommonParameters: 可选参数,如 -Verbose、-Debug 等,用于控制执行时的调试和输出行为。比如,启动 Windows 自带的计算器,命令如下所示
Invoke-Expression "calc"
作用是将 "calc" 这一字符串视为实际命令并执行,相当于直接输入 calc。如下图所示
在 PowerShell 脚本中,有时候命令是动态生成的。比如,用户输入或脚本逻辑可能需要动态构建命令。例如,在交互式脚本中等待用户输入命令。
$inputCmd = Read-Host "请输入你想执行的命令"
Invoke-Expression $inputCmd
0x02 PowerShell.AddScript
PowerShell.AddScript 是 .NET API 提供的接口,用于将 PowerShell 脚本添加到一个 PowerShell 对象的脚本管道中,可以动态生成 PowerShell 脚本内容并在程序执行时运行。在实际场景中,可以通过 PowerShell.AddScript 在.NET中使用 PowerShell 脚本引擎来执行命令,例如 Invoke-Expression,并通过 Invoke() 方法获取whoami执行的结果。
using (PowerShell powerShell = PowerShell.Create())
{
powerShell.AddScript("Invoke-Expression 'whoami'");
Collection<PSObject> results = powerShell.Invoke();
foreach (PSObject result in results)
{
Console.WriteLine(result.ToString());
}
首先通过 PowerShell.Create() 创建一个新的 PowerShell 对象,用于封装 PowerShell 脚本引擎,允许我们在.NET中执行 PowerShell 脚本。随后,使用 AddScript 方法将 PowerShell 脚本添加到执行队列中。这里使用的是 Invoke-Expression 'whoami',这意味着我们通过 Invoke-Expression 执行字符串命令 'whoami'。
0x03 小结
综上,可以利用PowerShell.AddScript 和 Invoke-Expression完成一个小型的PowerShell替代工具,因此能够有效规避一些安全防护软件对于 PowerShell.exe 进程的检测规则,便于黑客更加隐蔽的执行任务