通过Dnspy调试解决powershell使用Install-module指定的转换无效的问题

  • Post author:
  • Post category:其他


之前运行

Install-module -Name NtObjectManager

出现以下错误:

PackageManagement\Install-Package : Package 'NtObjectManager' failed to be installed because: 指定的转换无效。
At C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1809 char:21
+ ...          $null = PackageManagement\Install-Package @PSBoundParameters
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidResult: (NtObjectManager:String) [Install-Package], Exception
    + FullyQualifiedErrorId : Package '{0}' failed to be installed because: {1},Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

之后使用PackageManagement\Install-Package NtObjectManager直接安装

PackageManagement\Install-Package : Package 'NtObjectManager' failed to be installed because: 指定的转换无效。
所在位置 行:1 字符: 1
+ PackageManagement\Install-Package NtObjectManager
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidResult: (NtObjectManager:String) [Install-Package],Exception
    + FullyQualifiedErrorId : Package '{0}' failed to be installed because: {1},Microsoft.PowerShell.PackageManagement
   .Cmdlets.InstallPackage

还是出错,但是别的电脑上没有问题。

于是用dnspy调试,附加到进程,调试发现有些局部变量显示不了提示:

当线程位于不安全状态时无法计算表达式。按步调试或运行直到触发断点。

看了这个

说明

,用管理员模式下的dnspy直接启动powershell.exe,之后就能显示局部变量了:

由于报错提示的是PackageManagement\Install-Package这个模块,去系统里看了下,确实有这个模块,在C:\Program Files (x86)\WindowsPowerShell\Modules\PackageManagement\1.0.0.1目录下。

看了下PackageManagement.psd1这个文件发现:

在这里插入图片描述

Install-Package在Microsoft.PackageManagement.dll这个文件里,用dnspy载入程序之后先break 暂停,然后在线程里面一个个选,就能通过栈帧的名字找到对应的线程。

在这里插入图片描述

也可以先打开dll,在install-package函数下断点然后再启动程序。

在这里插入图片描述

一步步调试,中间会遇到类似invoke的函数,这个是另起新命令的线程了,不要跟进去,可以通过powershell.command变量成员看命令和参数自行判断。不然会有比较复杂的代码出现。

在这里插入图片描述

这里是调用Nugetclient来下载包

在这里插入图片描述

继续步进,看到了Nugetclient里面下载包的函数

在这里插入图片描述

继续步进,发现执行到这一句话之后步进程序就不往下走了,直接返回了,终端也报错了。

在这里插入图片描述

看起来和OSInformation.isFipsEnabled的get函数有关,去那个函数里面下了好多断点,因为这个函数压根没法步进,一步进就返回。发现读取了注册表

在这里插入图片描述

继续走,发现到这步以后就返回了,程序不继续往下走了

在这里插入图片描述

根据错误提示,指定的转换无效的问题,那么肯定是这个函数里面出现看一些问题。通过查询

手册

发现array2数组类型有可能和返回值不匹配,所以报了这个错误。

于是去没有问题的电脑上看了下值:

在这里插入图片描述

而有问题的电脑上:

在这里插入图片描述

很明显不一样,一个是字符串一个是数值,显然数值正确,于是把有问题的值删掉改成REG_DWORD,再运行,果然没问题了。



版权声明:本文为fjh1997原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。