.net 如何在powershell7中定义动态模块

0sgqnhkj  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(112)

我目前正在尝试将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。
问候。

hwamh0ep

hwamh0ep1#

在PowerShell 7中,[System.AppDomain]类没有DefineDynamicAssembly方法,这解释了错误。[System.Reflection.Emit.AssemblyBuilder]类已移动到不同的命名空间。
您可以直接使用[System.Reflection.Emit]命名空间中的[System.Reflection.Emit.AssemblyBuilder]类。

相关问题