我目前正在尝试将powershell 5脚本迁移到powershell 7脚本。这个脚本的目标是在内存using [AppDomain]::CurrentDomain
和程序集中加载win32 API。
下面是代码:
function New-InMemoryModule {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')]
[CmdletBinding()]
Param (
[Parameter(Position = 0)]
[ValidateNotNullOrEmpty()]
[String]
$ModuleName = [Guid]::NewGuid().ToString()
)
$AppDomain = [AppDomain]::CurrentDomain
$LoadedAssemblies = $AppDomain.GetAssemblies()
foreach ($Assembly in $LoadedAssemblies) {
if ($Assembly.FullName -and ($Assembly.FullName.Split(',')[0] -eq $ModuleName)) {
return $Assembly
}
}
$AssemblyName = New-Object System.Reflection.AssemblyName($ModuleName)
$AssemblyBuilder = [AppDomain]::CurrentDomain.DefineDynamicAssembly($AssemblyName, [System.Reflection.Emit.AssemblyBuilderAccess]::Run)
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule($ModuleName)
return $ModuleBuilder
}
$Mod = New-InMemoryModule -ModuleName Win32
echo $Mod
当我在Powershell 5上执行它时,这是第一次运行时的输出:
FullyQualifiedName : Win32
MDStreamVersion : 131072
ModuleVersionId : 8a94565d-3e53-4cdf-9b9d-ae6da
d1df4cd
MetadataToken : 1
ScopeName : Win32
Name : <Dans le module de la
mémoire>
Assembly : Win32, Version=0.0.0.0,
Culture=neutral,
PublicKeyToken=null
CustomAttributes : {}
ModuleHandle : System.ModuleHandle
然后第二次示例化模块时:
GAC Version Location
--- ------- --------
False v4.0.30319
但是当我尝试在PowerShell 7中执行它时,我得到了以下错误:
Method invocation failed because
| [System.AppDomain] does not contain a
| method named 'DefineDynamicAssembly'
有谁知道它的语法或者我应该调用它的方式是否改变了吗?我读了MSDN文档,但没有找到任何东西。
我尝试了一些GPT查询,但提供的脚本根本无法加载win32 API。
祝你今天愉快!
更新代码:
function New-InMemoryModule {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')]
[CmdletBinding()]
Param (
[Parameter(Position = 0)]
[ValidateNotNullOrEmpty()]
[String]
$ModuleName = [Guid]::NewGuid().ToString()
)
$LoadedAssemblies = [System.AppDomain]::CurrentDomain.GetAssemblies()
foreach ($Assembly in $LoadedAssemblies) {
if ($Assembly.FullName -and ($Assembly.FullName.Split(',')[0] -eq $ModuleName)) {
return $Assembly
}
}
$AssemblyName = New-Object System.Reflection.AssemblyName($ModuleName)
$AssemblyBuilder = [System.Reflection.Emit.AssemblyBuilder]::DefineDynamicAssembly($AssemblyName, [System.Reflection.Emit.AssemblyBuilderAccess]::Run)
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule($ModuleName)
return $ModuleBuilder
}
$Mod = New-InMemoryModule -ModuleName Win32
echo $Mod
输出1执行:
FullyQualifiedName : RefEmit_InMemoryManifestMo
dule
MDStreamVersion : 131072
ModuleVersionId : ca1f7586-b9b8-41ed-9d0a-fa
c37f7f080d
MetadataToken : 1
ScopeName : RefEmit_InMemoryManifestMo
dule
Name : <In Memory Module>
Assembly : Win32, Version=0.0.0.0,
Culture=neutral,
PublicKeyToken=null
ModuleHandle : System.ModuleHandle
CustomAttributes : {}
输出第二次执行:
GAC Version Location
--- ------- --------
False
我更新了我的代码,但它似乎没有正确地构建模块,我尝试了各种语法并阅读了一些文档,但我无法正确加载它。最终目标是在内存中加载netapi 32并执行NetShareEnum。
问候。
1条答案
按热度按时间hwamh0ep1#
在PowerShell 7中,
[System.AppDomain]
类没有DefineDynamicAssembly
方法,这解释了错误。[System.Reflection.Emit.AssemblyBuilder]
类已移动到不同的命名空间。您可以直接使用
[System.Reflection.Emit]
命名空间中的[System.Reflection.Emit.AssemblyBuilder]
类。