Потребовалось мне получить некоторые имена функций из powershell, казалось бы качай pdb и дело в шляпе, ан нет.
Powershell это по сути фронтенд .NET Framework, со всеми вытекающими ввиде JIT и предварительно скомпилированными через Native Image Generator сборками. Сборки естественно генерятся под целевую платформу и логично, что символьные сервера микрософт никаким образом не могут содержать pdb для NI файлов.
Однако, в 4й версии фреймворка NGEN обзавелся параметром createpdb, и символы можно получить примерно так:
ngen.exe createpdb "C:\Windows\assembly\...\mscorlib.ni.dll" "C:\SymbolCache"
Соответственно, после получения символов задача должна быть решена. Но powershell подложил свинью, в виде загружаемого рантайма версии 2.0. А NGEN этой версии не имеет параметра для создания pdb. Далее пришлось раскапывать, как powershell узнает, какую версию рантайма грузить.
Недолгие поиски привели к реестру:
wmain => GetRegistryInfo(&NETversion) => RegQueryREG_SZValue(L"RuntimeVersion")
В реестре была видна версия 2.0:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine]
"ApplicationBase"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0"
"PSCompatibleVersion"="1.0, 2.0"
"RuntimeVersion"="v2.0.50727"
"ConsoleHostAssemblyName"="Microsoft.PowerShell.ConsoleHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil"
"ConsoleHostModuleName"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Microsoft.PowerShell.ConsoleHost.dll"
"PowerShellVersion"="2.0"
Ради любопытства я посмотрел как именно грузится рантайм:
wmain => LaunchManagedMonad => CorBindToRuntimeEx(NETversion)
Ну и все, что оставалось сделать, это внести последнюю версию рантайма(v4.0.30319), и после небольшой возни с доступами к защищенной ветке powershell'а дело было сделано.
Меняем и сравниваем:
Было: LoadLibraryExW(C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\fe70d777535c215f4fe9f9def2b4c815\mscorlib.ni.dll)
Стало: LoadLibraryExW(C:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib\b7a12c4c0032847fcc6b9c710460456f\mscorlib.ni.dll)
Все имена функций прекрасно распознались:
Было: 0x792F123C (mscorlib.ni.dll)
Стало: System.AppDomain.SetupDomain(0x79A61212) (mscorlib.ni.dll)
Powershell это по сути фронтенд .NET Framework, со всеми вытекающими ввиде JIT и предварительно скомпилированными через Native Image Generator сборками. Сборки естественно генерятся под целевую платформу и логично, что символьные сервера микрософт никаким образом не могут содержать pdb для NI файлов.
Однако, в 4й версии фреймворка NGEN обзавелся параметром createpdb, и символы можно получить примерно так:
ngen.exe createpdb "C:\Windows\assembly\...\mscorlib.ni.dll" "C:\SymbolCache"
Соответственно, после получения символов задача должна быть решена. Но powershell подложил свинью, в виде загружаемого рантайма версии 2.0. А NGEN этой версии не имеет параметра для создания pdb. Далее пришлось раскапывать, как powershell узнает, какую версию рантайма грузить.
Недолгие поиски привели к реестру:
wmain => GetRegistryInfo(&NETversion) => RegQueryREG_SZValue(L"RuntimeVersion")
В реестре была видна версия 2.0:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine]
"ApplicationBase"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0"
"PSCompatibleVersion"="1.0, 2.0"
"RuntimeVersion"="v2.0.50727"
"ConsoleHostAssemblyName"="Microsoft.PowerShell.ConsoleHost, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=msil"
"ConsoleHostModuleName"="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Microsoft.PowerShell.ConsoleHost.dll"
"PowerShellVersion"="2.0"
Ради любопытства я посмотрел как именно грузится рантайм:
wmain => LaunchManagedMonad => CorBindToRuntimeEx(NETversion)
Ну и все, что оставалось сделать, это внести последнюю версию рантайма(v4.0.30319), и после небольшой возни с доступами к защищенной ветке powershell'а дело было сделано.
Меняем и сравниваем:
Было: LoadLibraryExW(C:\Windows\assembly\NativeImages_v2.0.50727_32\mscorlib\fe70d777535c215f4fe9f9def2b4c815\mscorlib.ni.dll)
Стало: LoadLibraryExW(C:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib\b7a12c4c0032847fcc6b9c710460456f\mscorlib.ni.dll)
Все имена функций прекрасно распознались:
Было: 0x792F123C (mscorlib.ni.dll)
Стало: System.AppDomain.SetupDomain(0x79A61212) (mscorlib.ni.dll)
Комментариев нет:
Отправить комментарий